UNPKG

@metacell/geppetto-meta-client

Version:

Geppetto web frontend. Geppetto is an open-source platform to build web-based tools to visualize and simulate neuroscience data and models.

116 lines (114 loc) 3.93 kB
import React from "react"; import ReactDOM from "react-dom"; var ComponentFactory = { componentsMap: {}, getComponents: function getComponents() { return this.componentsMap; }, addExistingComponent: function addExistingComponent(componentType, component, override) { if (!(componentType in this.componentsMap)) { this.componentsMap[componentType] = []; } if (override) { var componentsMap = this.componentsMap[componentType]; for (var c in componentsMap) { if (component.id === componentsMap[c].id) { componentsMap[c] = component; // var index = c; return; } } } this.componentsMap[componentType].push(component); }, removeExistingComponent: function removeExistingComponent(componentType, component) { if (componentType in this.componentsMap) { var index = this.componentsMap[componentType].indexOf(component); if (index > -1) { this.componentsMap[componentType].splice(index, 1); } } }, getComponentById: function getComponentById(componentType, componentId) { var componentsMap = this.componentsMap[componentType]; for (var c in componentsMap) { if (componentId === componentsMap[c].id) { return componentsMap[c]; } } return undefined; }, camelize: function camelize(str) { return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) { if (+match === 0) { return ""; } // or if (/\s+/.test(match)) for white spaces return index == 0 ? match.toUpperCase() : match.toLowerCase(); }); }, /** * Get an available id for an specific widget * * @module WidgetUtility * @param {String} prefix * @param {Array} widgetsList * @returns {String} id - Available id for a widget */ getAvailableComponentId: function getAvailableComponentId(componentType) { var index = 0; var id = ""; var available; var components = []; if (componentType in this.componentsMap) { components = this.componentsMap[componentType]; } do { index++; id = componentType + index; available = true; for (var componentsIndex in components) { if (components[componentsIndex].props.id.toUpperCase() == id.toUpperCase()) { available = false; break; } } } while (available == false); return this.camelize(id); }, _addComponent: function _addComponent(componentToAdd, componentType, properties, container, callback, isWidget) { // Prepare properties if (properties === undefined) { properties = {}; } properties.componentType = componentType; if (!("id" in properties)) { properties["id"] = this.getAvailableComponentId(componentType); } if (!("isStateless" in properties)) { properties["isStateless"] = false; } if (container == null && isWidget) { // FIXME Redundant, see addWidget container = document.getElementById("widgetContainer"); } properties["parentContainer"] = container; // Create component/widget var type = componentToAdd; var component = /*#__PURE__*/React.createFactory(type)(properties); return component; }, _renderComponent: function _renderComponent(component, componentType, properties, container, callback, isWidget) { var renderedComponent = window[properties.id] = this.renderComponent(component, container, callback); renderedComponent.container = container; // Register in component map if (!(componentType in this.componentsMap)) { this.componentsMap[componentType] = []; } this.componentsMap[componentType].push(renderedComponent); return renderedComponent; }, renderComponent: function renderComponent(component, container, callback) { return ReactDOM.render(component, container, callback); } }; export default ComponentFactory;