UNPKG

@silexlabs/grapesjs-data-source

Version:
277 lines 8.98 kB
"use strict"; /* * 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 <https://www.gnu.org/licenses/>. */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.STANDARD_TYPES = void 0; exports.initializeDataSourceManager = initializeDataSourceManager; exports.getManager = getManager; exports.addDataSource = addDataSource; exports.removeDataSource = removeDataSource; exports.refreshDataSources = refreshDataSources; exports.resetDataSources = resetDataSources; exports.getFilters = getFilters; exports.setFilters = setFilters; exports.getPreviewData = getPreviewData; exports.setPreviewData = setPreviewData; exports.getTypes = getTypes; exports.getQueryables = getQueryables; exports.getCachedTypes = getCachedTypes; exports.getCachedQueryables = getCachedQueryables; exports.toJSON = toJSON; const types_1 = require("../types"); exports.STANDARD_TYPES = [ { id: 'string', label: 'String', fields: [], }, { id: 'number', label: 'Number', fields: [], }, { id: 'boolean', label: 'Boolean', fields: [], }, { id: 'date', label: 'Date', fields: [], }, { id: 'unknown', label: 'Unknown', fields: [], }, ]; const state_1 = require("./state"); const dataSourceRegistry_1 = require("./dataSourceRegistry"); const previewDataLoader_1 = require("./previewDataLoader"); const filters_1 = require("../filters"); const filters_2 = require("../filters"); // Global manager instance let globalManager = null; /** * Get all types from all connected data sources */ function getAllTypes(manager) { return manager.dataSources .filter(ds => ds.isConnected()) .flatMap(ds => ds.getTypes()) .concat(exports.STANDARD_TYPES); } /** * Get all queryable fields from all connected data sources */ function getAllQueryables(manager) { return manager.dataSources .filter(ds => ds.isConnected()) .flatMap(ds => ds.getQueryables()); } /** * Update cached types and queryables */ function updateCachedData() { const manager = getManager(); manager.cachedTypes = getAllTypes(manager); manager.cachedQueryables = getAllQueryables(manager); } /** * Initialize the global data source manager */ function initializeDataSourceManager(dataSources, editor, options) { const filters = (0, filters_1.initializeFilters)(editor, options); // Validate filters (0, filters_2.validateFilters)(filters); // Initialize the registry (0, dataSourceRegistry_1.initializeDataSourceRegistry)(editor); // Set initial data sources (0, dataSourceRegistry_1.setDataSources)(dataSources); // Get current data sources const currentDataSources = (0, dataSourceRegistry_1.getAllDataSources)(); // Initialize preview data loader (0, previewDataLoader_1.initializePreviewDataLoader)(editor); // Create bound event handlers const eventListeners = { dataChangedBinded: (e) => { editor.trigger(types_1.DATA_SOURCE_CHANGED, e === null || e === void 0 ? void 0 : e.detail); }, dataSourceReadyBinded: (ds) => { updateCachedData(); // Update cache when data source becomes ready editor.trigger(types_1.DATA_SOURCE_READY, ds); (0, previewDataLoader_1.loadPreviewData)(true); // force refresh when data source becomes ready }, dataSourceErrorBinded: (message, ds) => { editor.trigger(types_1.DATA_SOURCE_ERROR, message, ds); }, }; globalManager = { editor, options, previewData: {}, cachedTypes: [], cachedQueryables: [], dataSources: currentDataSources, filters, eventListeners, }; // Set up event listeners setupEventListeners(); // Listen for data source changes and re-setup event listeners editor.on(types_1.DATA_SOURCE_CHANGED, () => { setupEventListeners(); updateCachedData(); refreshDataSources(); }); // Update cached data initially updateCachedData(); // Relay state changes to the editor (0, state_1.onStateChange)((state, component) => { (0, previewDataLoader_1.loadPreviewData)().then(() => editor.trigger(types_1.COMPONENT_STATE_CHANGED, { state, component })); }); } /** * Get the global manager (throws if not initialized) */ function getManager() { if (!globalManager) { throw new Error('DataSourceManager not initialized. Call initializeDataSourceManager first.'); } return globalManager; } /** * Add a data source */ function addDataSource(dataSource) { return __awaiter(this, void 0, void 0, function* () { (0, dataSourceRegistry_1.addDataSource)(dataSource); setupEventListeners(); }); } /** * Remove a data source */ function removeDataSource(dataSource) { (0, dataSourceRegistry_1.removeDataSource)(dataSource); setupEventListeners(); (0, previewDataLoader_1.loadPreviewData)(true); // force refresh when data source is removed } /** * Refresh all data sources data */ function refreshDataSources() { (0, previewDataLoader_1.loadPreviewData)(true); // force refresh when explicitly requested } /** * Reset all data sources */ function resetDataSources(dataSources) { (0, dataSourceRegistry_1.setDataSources)(dataSources); setupEventListeners(); } /** * Get filters */ function getFilters() { return getManager().filters; } /** * Set filters */ function setFilters(filters) { getManager().filters = filters; updateCachedData(); } /** * Get preview data */ function getPreviewData() { return getManager().previewData; } /** * Set preview data */ function setPreviewData(data) { getManager().previewData = data; } /** * Get all types from all data sources */ function getTypes() { return getAllTypes(getManager()); } /** * Get all queryable fields from all data sources */ function getQueryables() { return getAllQueryables(getManager()); } /** * Get cached types */ function getCachedTypes() { return getManager().cachedTypes; } /** * Get cached queryables */ function getCachedQueryables() { return getManager().cachedQueryables; } /** * Convert to JSON for storage */ function toJSON() { return (0, dataSourceRegistry_1.dataSourcesToJSON)(); } /** * Set up event listeners on all data sources */ function setupEventListeners() { const manager = getManager(); const dataSources = (0, dataSourceRegistry_1.getAllDataSources)(); // Update the manager with current data sources manager.dataSources = [...dataSources]; // Remove all listeners dataSources.forEach((dataSource) => { if (typeof dataSource.off === 'function') { dataSource.off(types_1.DATA_SOURCE_READY, manager.eventListeners.dataSourceReadyBinded); dataSource.off(types_1.DATA_SOURCE_CHANGED, manager.eventListeners.dataChangedBinded); dataSource.off(types_1.DATA_SOURCE_ERROR, manager.eventListeners.dataSourceErrorBinded); } }); // Add listeners on all data sources dataSources.forEach((dataSource) => { if (typeof dataSource.on === 'function') { dataSource.on(types_1.DATA_SOURCE_READY, manager.eventListeners.dataSourceReadyBinded); dataSource.on(types_1.DATA_SOURCE_CHANGED, manager.eventListeners.dataChangedBinded); dataSource.on(types_1.DATA_SOURCE_ERROR, manager.eventListeners.dataSourceErrorBinded); } }); } //# sourceMappingURL=dataSourceManager.js.map