UNPKG

@silexlabs/silex-cms

Version:

Silex plugin

97 lines (94 loc) 3.81 kB
import { removeState, setState, COMPONENT_NAME_PREFIX, Property, DataSourceEditor, toExpression } from '@silexlabs/grapesjs-data-source' import { Silex11tyPluginWebsiteSettings } from '../client' export default function(config/*, opts: EleventyPluginOptions */): void { config.on('silex:grapesjs:end', () => { config.getEditor().on('page:select page:update', () => update(config)) }) config.on('settings:save:start', () => update(config)) } function update(config) { const editor = config.getEditor() as DataSourceEditor const page = editor.Pages.getSelected() const body = page?.getMainComponent() if (!body) return // This happens when the current page is deleted // Do not show "Body's " prefix for states on the body body.set(COMPONENT_NAME_PREFIX, '') // Store pagination data in the body component // This is for the GraphQL query to include it const settings = page?.get('settings') as Silex11tyPluginWebsiteSettings | undefined const pageData = toExpression(settings?.eleventyPageData) as (Property[] | null) if (pageData && pageData.length > 0) { try { // Useless until proven useful: // Test the type of the eleventyPageData expression // const type = getExpressionResultType(pageData, body, editor.DataSourceManager.getDataTree()) // if (!type) { // console.error('Invalid type for eleventyPageData') // removeState(body, 'pagination', true) // editor.runCommand('notifications:add', { // type: 'error', // message: 'Invalid type for eleventyPageData', // group: 'Errors in your settings', // componentId: body.id, // }) // return // } // if (type.kind === 'scalar') { // console.error('Invalid type for eleventyPageData: a list is required, got a scalar type') // removeState(body, 'pagination', true) // editor.runCommand('notifications:add', { // type: 'error', // message: 'Invalid type for eleventyPageData: a list is required, got a scalar type', // group: 'Errors in your settings', // componentId: body.id, // }) // return // } // Update body states with the new settings setState(body, 'pagination', { hidden: true, label: 'pagination', expression: [{ label: 'Unused pagination label', type: 'property', propType: 'field', fieldId: 'pagination', dataSourceId: 'eleventy', typeIds: ['pagination'], kind: 'object', }] }, true, 0) // Taken from the pagination object https://www.11ty.dev/docs/pagination/ // items: [], // Array of current page’s chunk of data setState(body, 'items', { hidden: true, label: 'pagination.items', expression: pageData, }, true, 1) // Useless until proven useful: // FIXME: is this supposed to be an array of arrays of pages? // Taken from the pagination object https://www.11ty.dev/docs/pagination/ // pages: [], // Array of all chunks of paginated data (in order) // setState(body, 'pages', { // hidden: true, // label: 'pagination.pages', // expression: pageData, // }, true, 2) } catch (e) { console.error('Invalid JSON for eleventyPageData', e) removeState(body, 'pagination', true) editor.runCommand('notifications:add', { type: 'error', message: 'Invalid JSON for eleventyPageData', group: 'Errors in your settings', componentId: body.id, }) return } } else { removeState(body, 'pagination', true) removeState(body, 'items', true) // For backward compatibility removeState(body, 'pages', true) } }