Spaces:
No application file
No application file
import AssetService from './asset.service'; | |
import BuilderService from './builder.service'; | |
// all css get combined into one builder.css and automatically loaded via js/parcel | |
import 'grapesjs/dist/css/grapes.min.css'; | |
import './grapesjs-custom.css'; | |
/** | |
* Launch builder | |
* | |
* @param formName | |
*/ | |
function launchBuilderGrapesjs(formName) { | |
if (useBuilderForCodeMode() === false) { | |
return; | |
} | |
Mautic.showChangeThemeWarning = true; | |
// Prepare HTML | |
mQuery('html').css('font-size', '100%'); | |
mQuery('body').css('overflow-y', 'hidden'); | |
mQuery('.builder-panel').css('padding', 0); | |
mQuery('.builder-panel').css('display', 'block'); | |
const $builder = mQuery('.builder'); | |
$builder.addClass('builder-active').removeClass('hide'); | |
const assetsConfig = AssetService.getAssetsConfig(); | |
const builder = new BuilderService(assetsConfig); | |
// Initialize GrapesJS | |
builder.initGrapesJS(formName); | |
// trigger show event on DOM element | |
$builder.trigger('builder:show', [builder.editor]) | |
// trigger show event on editor instance | |
builder.editor.trigger('show'); | |
// Load and add assets | |
AssetService.getAssetsXhr(function (result) { | |
builder.editor.AssetManager.add(result.data); | |
}); | |
} | |
/** | |
* The user acknowledges the risk before editing an email or landing page created in Code Mode in the Builder | |
*/ | |
function useBuilderForCodeMode() { | |
const theme = mQuery('.theme-selected').find('[data-theme]').attr('data-theme'); | |
const isCodeMode = theme === 'mautic_code_mode'; | |
if (isCodeMode) { | |
if (confirm(Mautic.translate('grapesjsbuilder.builder.warning.code_mode')) === false) { | |
return false; | |
} | |
} | |
return true; | |
} | |
/** | |
* Set theme's HTML | |
* | |
* @param theme | |
*/ | |
function setThemeHtml(theme) { | |
BuilderService.setupButtonLoadingIndicator(true); | |
// Load template and fill field | |
mQuery.ajax({ | |
url: mQuery('#builder_url').val(), | |
data: `template=${theme}`, | |
dataType: 'json', | |
success(response) { | |
const textareaHtml = mQuery('textarea.builder-html'); | |
const textareaMjml = mQuery('textarea.builder-mjml'); | |
textareaHtml.val(response.templateHtml); | |
if (typeof textareaMjml !== 'undefined') { | |
textareaMjml.val(response.templateMjml); | |
} | |
// If MJML template, generate HTML before save | |
// if (!textareaHtml.val().length && textareaMjml.val().length) { | |
// builder.mjmlToHtml(textareaMjml, textareaHtml); | |
// } | |
// } | |
}, | |
error(request, textStatus) { | |
console.log(`setThemeHtml - Request failed: ${textStatus}`); | |
}, | |
complete() { | |
BuilderService.setupButtonLoadingIndicator(false); | |
}, | |
}); | |
} | |
/** | |
* The builder button to launch GrapesJS will be disabled when the code mode theme is selected | |
* | |
* @param theme | |
*/ | |
function switchBuilderButton(theme) { | |
const builderButton = mQuery('.btn-builder'); | |
const mEmailBuilderButton = mQuery('#emailform_buttons_builder_toolbar_mobile'); | |
const mPageBuilderButton = mQuery('#page_buttons_builder_toolbar_mobile'); | |
const isCodeMode = theme === 'mautic_code_mode'; | |
builderButton.attr('disabled', isCodeMode); | |
if (isCodeMode) { | |
mPageBuilderButton.addClass('link-is-disabled'); | |
mEmailBuilderButton.addClass('link-is-disabled'); | |
mPageBuilderButton.parent().addClass('is-not-allowed'); | |
mEmailBuilderButton.parent().addClass('is-not-allowed'); | |
} else { | |
mPageBuilderButton.removeClass('link-is-disabled'); | |
mEmailBuilderButton.removeClass('link-is-disabled'); | |
mPageBuilderButton.parent().removeClass('is-not-allowed'); | |
mEmailBuilderButton.parent().removeClass('is-not-allowed'); | |
} | |
} | |
/** | |
* The textarea with the HTML source will be displayed if the code mode theme is selected | |
* | |
* @param theme | |
*/ | |
function switchCustomHtml(theme) { | |
const customHtmlRow = mQuery('#custom-html-row'); | |
const isPageMode = mQuery('[name="page"]').length !== 0; | |
const isCodeMode = theme === 'mautic_code_mode'; | |
const advancedTab = isPageMode ? mQuery('#advanced-tab') : null; | |
if (isCodeMode === true) { | |
customHtmlRow.removeClass('hidden'); | |
isPageMode && advancedTab.removeClass('hidden'); | |
} else { | |
customHtmlRow.addClass('hidden'); | |
isPageMode && advancedTab.addClass('hidden'); | |
} | |
} | |
/** | |
* Initialize original Mautic theme selection with grapejs specific modifications | |
*/ | |
function initSelectThemeGrapesjs(parentInitSelectTheme) { | |
function childInitSelectTheme(themeField) { | |
const builderUrl = mQuery('#builder_url'); | |
let url; | |
switchBuilderButton(themeField.val()); | |
switchCustomHtml(themeField.val()); | |
// Replace Mautic URL by plugin URL | |
if (builderUrl.length) { | |
if (builderUrl.val().indexOf('pages') !== -1) { | |
url = builderUrl.val().replace('s/pages/builder', 's/grapesjsbuilder/page'); | |
} else { | |
url = builderUrl.val().replace('s/emails/builder', 's/grapesjsbuilder/email'); | |
} | |
builderUrl.val(url); | |
} | |
// Launch original Mautic.initSelectTheme function | |
parentInitSelectTheme(themeField); | |
mQuery('[data-theme]').click((event) => { | |
const theme = mQuery(event.target).attr('data-theme'); | |
switchBuilderButton(theme); | |
switchCustomHtml(theme); | |
}); | |
} | |
return childInitSelectTheme; | |
} | |
Mautic.launchBuilder = launchBuilderGrapesjs; | |
Mautic.initSelectTheme = initSelectThemeGrapesjs(Mautic.initSelectTheme); | |
Mautic.setThemeHtml = setThemeHtml; | |