@silexlabs/grapesjs-data-source
Version:
Grapesjs Data Source
277 lines • 8.98 kB
JavaScript
;
/*
* 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