'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 { MosaicoEditorHost } from "../lib/sandboxed-mosaico"; import { CKEditorHost } from "../lib/sandboxed-ckeditor"; import GrapesJS from "../lib/grapesjs"; 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 const ResourceType = { TEMPLATE: 'template', CAMPAIGN: 'campaign' } 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([key])) { mutState.setIn([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')); } } }; const mosaicoFsTemplatesOptions = mailtrainConfig.mosaico.fsTemplates; const mosaicoFsTemplatesLabels = new Map(mailtrainConfig.mosaico.fsTemplates.map(({key, label}) => ([key, label]))); 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(`static/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: () => ({ [prefix + 'mosaicoFsTemplate']: mailtrainConfig.mosaico.fsTemplates[0].key, [prefix + '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, 'mosaicoWithFsTemplate'); }, validate: state => {} }; templateTypes.xgrapesjs = { // FIXME 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.grapesjs = { typeName: t('GrapeJS (fake)'), getTypeForm: (owner, isEdit) => null, getHTMLEditor: owner => owner.editorNode = node} entity={owner.props.entity} initialHtml={owner.getFormValue(prefix + 'html')} entityTypeId={entityTypeId}/> , exportHTMLEditorData: async owner => { const {html} = await owner.editorNode.exportState(); owner.updateFormValue(prefix + 'html', html); }, initData: () => ({}), afterLoad: data => {}, beforeSave: data => { clearBeforeSave(data); }, afterTypeChange: mutState => {}, validate: state => {} }; templateTypes.ckeditor4 = { typeName: t('CKEditor 4'), getTypeForm: (owner, isEdit) => null, getHTMLEditor: owner => owner.editorNode = node} entity={owner.props.entity} initialHtml={owner.getFormValue(prefix + 'html')} entityTypeId={entityTypeId} title={t('CKEditor 4 Template Designer')} onFullscreenAsync={::owner.setElementInFullscreen} /> , exportHTMLEditorData: async owner => { const {html} = await owner.editorNode.exportState(); owner.updateFormValue(prefix + 'html', html); }, initData: () => ({}), afterLoad: data => {}, beforeSave: data => { clearBeforeSave(data); }, afterTypeChange: mutState => {}, validate: state => {} }; templateTypes.ckeditor5 = { typeName: t('CKEditor 5'), 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 = { // FIXME 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); }