import * as grapesjs from 'grapesjs/dist/grapes.min.js' import {html, render} from 'lit-html' const pluginName = 'page-panel' let open export const cmdTogglePages = 'pages:open-panel' export const cmdAddPage = 'pages:add' function selectPage(editor, page) { editor.Pages.select(page) } function addPage(editor, config) { const pages = editor.Pages.getAll() let idx = 1 const newPageName = config.newPageName || 'New page' let pageName = newPageName while(pages.find(p => p.getName() === pageName)) { pageName = `${newPageName} ${idx++}` } const page = editor.Pages.add({ name: pageName }) editor.runCommand(config.cmdOpenNewPageDialog, {page}) } function removePage(editor, page) { if(editor.Pages.getAll().length === 1) { console.error('can not delete the only page') } else { const isMain = page.get('type') === 'main' const isSelected = editor.Pages.getSelected() === page editor.Pages.remove(page.id) const firstPage = editor.Pages.getAll()[0] if(isMain) firstPage.set('type', 'main') if(isSelected) selectPage(editor, firstPage) } } function settingsPage(editor, config, page) { editor.runCommand(config.cmdOpenSettings, {page}) } function renderPages(editor, config) { const pages = editor.Pages.getAll() const selected = editor.Pages.getSelected() const getPageFromEvent = (e) => { const el = e.target.hasAttribute('data-page-id') ? e.target : e.target.parentNode e.stopPropagation() return editor.Pages.get(el.getAttribute('data-page-id')) } return html`
${ pages.map(page => { const name = page.getName() || page.attributes.type // keep the same structure as the layers panel return html`
selectPage(editor, getPageFromEvent(e))}>
${ name }
removePage(editor, getPageFromEvent(e))}> settingsPage(editor, config, getPageFromEvent(e))}>
` })} ${pages.length ? '' : html`
No page yet.
`}
` } export const pagePanelPlugin = grapesjs.plugins.add(pluginName, (editor, opts) => { // create wrapper const el = document.createElement('div') el.classList.add('pages__wrapper') // update const doRender = () => render(renderPages(editor, opts), el) editor.on('page', () => { doRender() }) editor.on('load', () => { open = false document.querySelector(opts.appendTo) .appendChild(el) doRender() // click anywhere close it // const close = (event) => { // if(open) { // editor.stopCommand(cmdTogglePages) // //event.preventDefault() // } // } // document.addEventListener('mousedown', close) // add command to add pages editor.Commands.add(cmdAddPage, () => addPage(editor, opts)) }) })