/* * Silex website builder, free/libre no-code tool for makers. * Copyright (c) 2023 lexoyo and Silex Labs foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import commands from './commands' import { registerCapabilities } from './capabilities' import { initializeDataSourceManager, refreshDataSources } from './model/dataSourceManager' import storage from './storage' import { DATA_SOURCE_ERROR, DataSourceEditorOptions, IDataSource, IDataSourceOptions } from './types' import { createDataSource, NOTIFICATION_GROUP } from './utils' import view from './view' import { Editor } from 'grapesjs' /** * Export the public API */ // Main public API - this is what apps should use export * from './api' // Types and interfaces that apps need export * from './types' /** * GrapeJs plugin entry point */ export default (editor: Editor, opts: Partial = {}) => { const options: DataSourceEditorOptions = { dataSources: [], filters: [], previewActive: true, // Default to preview active ...opts, view: { el: '.gjs-pn-panel.gjs-pn-views-container', ...opts?.view, }, } const dataSources = options.dataSources // Make sure the data sources from the config are readonly .map(ds => ({ ...ds, readonly: true })) // Create the data sources from config .map((ds: IDataSourceOptions) => createDataSource(ds)) // Connect the data sources (async) Promise.all(dataSources .map(ds => { return ds.connect() .catch(err => console.error(`Data source ${ds.id} connection failed:`, err)) })) .catch(err => console.error('Error while connecting data sources', err)) // Initialize the global data source manager initializeDataSourceManager(dataSources, editor, options) // Register the UI for component properties view(editor, options) // Save and load data sources storage(editor) // Register the commands commands(editor, options) // Use grapesjs-notifications plugin for errors editor.on(DATA_SOURCE_ERROR, (msg: string, ds: IDataSource) => editor.runCommand('notifications:add', { type: 'error', message: `Data source \`${ds.id}\` error: ${msg}`, group: NOTIFICATION_GROUP })) // Load data after editor is fully loaded editor.on('load', () => { refreshDataSources() }) // Also refresh data when storage loads (to handle website data loading) editor.on('storage:end:load', () => { // Use setTimeout to ensure components are fully loaded setTimeout(() => { refreshDataSources() }, 100) }) // Register AI capabilities if grapesjs-ai-capabilities is loaded editor.on('ai-capabilities:ready', (addCapability: (def: Record) => void) => { registerCapabilities(addCapability) }) } /** * Version of the plugin * This is replaced by the build script */ export const version = '__VERSION__'