'use strict'; import React from "react"; import { ACEEditor, AlignedRow, CKEditor, Dropdown, StaticField, TableSelect } from "../lib/form"; import 'brace/mode/text'; import 'brace/mode/html'; import { MosaicoEditor, ResourceType } from "../lib/mosaico"; import {getTemplateTypes as getMosaicoTemplateTypes} from './mosaico/helpers'; import {getSandboxUrl} from "../lib/urls"; import mailtrainConfig from 'mailtrainConfig'; import { ActionLink, Button } from "../lib/bootstrap-components"; import {Trans} from "react-i18next"; import styles from "../lib/styles.scss"; export function getTemplateTypes(t, prefix = '', entityTypeId = ResourceType.TEMPLATE) { // The prefix is used to to enable use within other forms (i.e. campaign form) const templateTypes = {}; function initFieldsIfMissing(mutState, templateType) { const initVals = templateTypes[templateType].initData(); for (const key in initVals) { if (!mutState.hasIn([prefix + key])) { mutState.setIn([prefix + key, 'value'], initVals[key]); } } } function clearBeforeSave(data) { for (const templateKey in templateTypes) { const initVals = templateTypes[templateKey].initData(); for (const fieldKey in initVals) { delete data[fieldKey]; } } } const mosaicoTemplateTypes = getMosaicoTemplateTypes(t); const mosaicoTemplatesColumns = [ { data: 1, title: t('Name') }, { data: 2, title: t('Description') }, { data: 3, title: t('Type'), render: data => mosaicoTemplateTypes[data].typeName }, { data: 5, title: t('Namespace') }, ]; templateTypes.mosaico = { typeName: t('Mosaico'), getTypeForm: (owner, isEdit) => , getHTMLEditor: owner => owner.editorNode = node} entity={owner.props.entity} initialModel={owner.getFormValue(prefix + 'mosaicoData').model} initialMetadata={owner.getFormValue(prefix + 'mosaicoData').metadata} templateId={owner.getFormValue(prefix + 'mosaicoTemplate')} entityTypeId={entityTypeId} title={t('Mosaico Template Designer')} onFullscreenAsync={::owner.setElementInFullscreen}/> , exportHTMLEditorData: async owner => { const {html, metadata, model} = await owner.editorNode.exportState(); owner.updateFormValue(prefix + 'html', html); owner.updateFormValue(prefix + 'mosaicoData', { metadata, model }); }, initData: () => ({ [prefix + 'mosaicoTemplate']: '', [prefix + 'mosaicoData']: {} }), afterLoad: data => { data[prefix + 'mosaicoTemplate'] = data[prefix + 'data'].mosaicoTemplate; data[prefix + 'mosaicoData'] = { metadata: data[prefix + 'data'].metadata, model: data[prefix + 'data'].model }; }, beforeSave: data => { data[prefix + 'data'] = { mosaicoTemplate: data[prefix + 'mosaicoTemplate'], metadata: data[prefix + 'mosaicoData'].metadata, model: data[prefix + 'mosaicoData'].model }; clearBeforeSave(data); }, afterTypeChange: mutState => { initFieldsIfMissing(mutState, 'mosaico'); }, validate: state => { const mosaicoTemplate = state.getIn([prefix + 'mosaicoTemplate', 'value']); if (!mosaicoTemplate) { state.setIn([prefix + 'mosaicoTemplate', 'error'], t('Mosaico template must be selected')); } else { state.setIn([prefix + 'mosaicoTemplate', 'error'], null); } } }; const mosaicoFsTemplatesOptions = mailtrainConfig.mosaico.fsTemplates.map(([key, label]) => ({key, label})); const mosaicoFsTemplatesLabels = new Map(mailtrainConfig.mosaico.fsTemplates); templateTypes.mosaicoWithFsTemplate = { typeName: t('Mosaico with predefined templates'), getTypeForm: (owner, isEdit) => { if (isEdit) { return {mosaicoFsTemplatesLabels.get(owner.getFormValue(prefix + 'mosaicoFsTemplate'))}; } else { return ; } }, getHTMLEditor: owner => owner.editorNode = node} entity={owner.props.entity} initialModel={owner.getFormValue(prefix + 'mosaicoData').model} initialMetadata={owner.getFormValue(prefix + 'mosaicoData').metadata} templatePath={getSandboxUrl(`public/mosaico/templates/${owner.getFormValue(prefix + 'mosaicoFsTemplate')}/index.html`)} entityTypeId={entityTypeId} title={t('Mosaico Template Designer')} onFullscreenAsync={::owner.setElementInFullscreen}/> , exportHTMLEditorData: async owner => { const {html, metadata, model} = await owner.editorNode.exportState(); owner.updateFormValue(prefix + 'html', html); owner.updateFormValue(prefix + 'mosaicoData', { metadata, model }); }, initData: () => ({ mosaicoFsTemplate: mailtrainConfig.mosaico.fsTemplates[0][0], mosaicoData: {} }), afterLoad: data => { data[prefix + 'mosaicoFsTemplate'] = data[prefix + 'data'].mosaicoFsTemplate; data[prefix + 'mosaicoData'] = { metadata: data[prefix + 'data'].metadata, model: data[prefix + 'data'].model }; }, beforeSave: data => { data[prefix + 'data'] = { mosaicoFsTemplate: data[prefix + 'mosaicoFsTemplate'], metadata: data[prefix + 'mosaicoData'].metadata, model: data[prefix + 'mosaicoData'].model }; clearBeforeSave(data); }, afterTypeChange: mutState => { initFieldsIfMissing(mutState, 'mosaico'); }, validate: state => {} }; templateTypes.grapejs = { // TODO typeName: t('GrapeJS'), getTypeForm: (owner, isEdit) => null, getHTMLEditor: owner => null, exportHTMLEditorData: async owner => {}, initData: () => ({}), afterLoad: data => {}, beforeSave: data => { clearBeforeSave(data); }, afterTypeChange: mutState => {}, validate: state => {} }; templateTypes.ckeditor = { typeName: t('CKEditor'), getTypeForm: (owner, isEdit) => null, getHTMLEditor: owner => , exportHTMLEditorData: async owner => {}, initData: () => ({}), afterLoad: data => {}, beforeSave: data => { clearBeforeSave(data); }, afterTypeChange: mutState => {}, validate: state => {} }; templateTypes.codeeditor = { typeName: t('Code Editor'), getTypeForm: (owner, isEdit) => null, getHTMLEditor: owner => , exportHTMLEditorData: async owner => {}, initData: () => ({}), afterLoad: data => {}, beforeSave: data => { clearBeforeSave(data); }, afterTypeChange: mutState => {}, validate: state => {} }; templateTypes.mjml = { // TODO getTypeForm: (owner, isEdit) => null, getHTMLEditor: owner => null, exportHTMLEditorData: async owner => {}, initData: () => ({}), afterLoad: data => {}, beforeSave: data => { clearBeforeSave(data); }, afterTypeChange: mutState => {}, validate: state => {} }; return templateTypes; } export function getEditForm(owner, typeKey, prefix = '') { const t = owner.props.t; return
; } export function getTypeForm(owner, typeKey, isEdit) { return
{owner.templateTypes[typeKey].getTypeForm(owner, isEdit)}
; }