UNPKG

@prisma-cms/front-editor

Version:
341 lines 13.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FrontEditor = exports.registerComponents = void 0; /* eslint-disable react/jsx-no-bind */ /* eslint-disable @typescript-eslint/no-unused-vars */ const react_1 = __importStar(require("react")); const context_1 = __importDefault(require("@prisma-cms/context")); const context_2 = require("./context"); // import { EditorComponentObject } from './components/interfaces' // import TemplateRenderer from './TemplateRenderer' const Grid_1 = __importDefault(require("./common/Grid")); const styles_1 = require("./styles"); __exportStar(require("./interfaces"), exports); __exportStar(require("./EditorComponent"), exports); __exportStar(require("./context"), exports); function registerComponents(_keys) { return (n) => n; } exports.registerComponents = registerComponents; class FrontEditor extends react_1.PureComponent { constructor(props) { super(props); /** * Этот массив используется для быстрого поиска всех отрендеренных компонентов */ // TODO: Maybe need to remove. Too many setStates this.mountedComponents = []; this.registerMountedComponent = (component) => { const { mode } = component.props; if (mode === 'main') { this.mountedComponents.push(component); } // } }; this.setActiveItem = (component) => { if (component) { component.setState({ active: true, }); } const components = this.mountedComponents.filter((n) => { var _a; return ((_a = n.state) === null || _a === void 0 ? void 0 : _a.active) && (!component || n !== component); }); components.map((n) => n.setState({ active: false, })); this.updateContext({ activeItem: component, }); }; this.getDragItem = () => { const { dragItem } = this.state; return dragItem; }; this.getDragTarget = () => { const { dragTarget } = this.state; return dragTarget; }; this.getActiveItem = () => { const { activeItem } = this.state; return activeItem; }; this.getHoveredItem = () => { const { hoveredItem } = this.state; return hoveredItem; }; this.getSettingsViewContainer = () => { return this.settingsViewContainer; }; this.onDragStart = (_event, item) => { this.updateContext({ dragItem: item, }); }; this.onDragEnd = () => { this.updateContext({ dragItem: null, dragTarget: null, activeItem: null, hoveredItem: null, }); }; this.setDragTarget = (component) => { this.setState({ dragTarget: component, }); this.updateContext({ dragTarget: component, }); }; this.setHoveredItem = (component) => { if (component) { component.setState({ hovered: true, }); } const components = this.mountedComponents.filter((n) => n.state.hovered && (!component || n !== component)); components.map((n) => n.setState({ hovered: false, })); }; this.getActionPanel = () => { return this.actionPanel; }; this.unregisterMountedComponent = (component) => { const index = this.mountedComponents.indexOf(component); if (index !== -1) { this.mountedComponents.splice(index, 1); } }; this.settingsViewContainerRef = (el) => { this.settingsViewContainer = el; }; this.actionPanelRef = (el) => { this.actionPanel = el; }; this.onWindowClick = () => { /** * Unset all active items */ this.setActiveItem(null); }; this.stopPropagation = (event) => { event.stopPropagation(); }; this.state = Object.assign(Object.assign({}, this.state), { Components: this.prepareComponents(), /** * Элемент в панели управления, который может быть перетянут на страницу */ dragItem: null, /** * Текущий элемент на странице, в который может быть заброшен новый элемент */ dragTarget: null, /** * Текущий элемент на странице, свойства которого можно редактировать (выбирается по клику) */ activeItem: null, /** * Элемент, на который наведена мышь */ hoveredItem: null, /** * Открыта ли панель с каталогом шаблонов */ templatesOpened: false }); Object.assign(this.state, { editorContext: this.initContext(), }); this.forceUpdate = this.forceUpdate.bind(this); } initContext() { const { inEditMode, allowScriptTags } = this.props; const Components = this.getComponents(); const editorContext = { inEditMode, // components, Components, // updateObject: this.updateObject, // dragItem, getDragItem: this.getDragItem, // dragTarget, getDragTarget: this.getDragTarget, // activeItem, getActiveItem: this.getActiveItem, getHoveredItem: this.getHoveredItem, getSettingsViewContainer: this.getSettingsViewContainer, onDragStart: this.onDragStart, onDragEnd: this.onDragEnd, setDragTarget: this.setDragTarget, setActiveItem: this.setActiveItem, setHoveredItem: this.setHoveredItem, forceUpdate: this.forceUpdate, // TemplateRenderer, getActionPanel: this.getActionPanel, registerMountedComponent: this.registerMountedComponent, unregisterMountedComponent: this.unregisterMountedComponent, setPageMeta: this.setPageMeta, allowScriptTags: allowScriptTags !== null && allowScriptTags !== void 0 ? allowScriptTags : false, }; // eslint-disable-next-line react/no-direct-mutation-state // this.state.editorContext = editorContext return editorContext; } updateContext(data) { const { editorContext } = this.state; this.setState({ editorContext: Object.assign(Object.assign({}, editorContext), data), }); } // TODO Maybe remove /** * @deprecated */ getContextValue(name) { const { [name]: value } = this.state.editorContext; return value; } /** * @deprecated use next/head instead */ setPageMeta(_meta = {}) { return; } componentDidUpdate(prevProps, prevState) { const { inEditMode } = this.props; if (inEditMode !== undefined && inEditMode !== prevProps.inEditMode) { const { editorContext } = this.state; this.setState({ editorContext: Object.assign(Object.assign({}, editorContext), { inEditMode }), }); } super.componentDidUpdate && super.componentDidUpdate(prevProps, prevState); } prepareComponents() { var _a; return (_a = this.props.Components) !== null && _a !== void 0 ? _a : []; } renderPanels() { const Components = this.getComponents(); return (react_1.default.createElement("div", { className: "panelItems" }, react_1.default.createElement(Grid_1.default, { container: true, spacing: 8 }, Components.map((Component) => { const name = Component.Name; return react_1.default.createElement(Component, { key: name, mode: "panel", className: "panelItem" }); }), react_1.default.createElement(Grid_1.default, { item: true, xs: 12 }, react_1.default.createElement("div", { ref: this.settingsViewContainerRef }))))); } renderItems() { var _a; const { // staticContext, // inEditMode, // components, // data, // setPageMeta, // Components, // CustomComponents, object, // ...other onChangeState, } = this.props; const component = (_a = object === null || object === void 0 ? void 0 : object.component) !== null && _a !== void 0 ? _a : null; if (!component) { return null; } const RenderComponents = this.getComponents(); // RenderComponents[0]?. const Component = RenderComponents.find((n) => n.Name === component); if (!Component) { return null; } return (react_1.default.createElement(Component, { mode: "main", object: object, onChangeState: onChangeState })); } // updateObject = (data: EditorComponentObject) => { // const { components } = data // const { onChange } = this.props // if (onChange && components !== undefined) { // return onChange(components) // } // } getComponents() { const { Components } = this.state; return Components; } componentDidMount() { this.addEvents(); super.componentDidMount && super.componentDidMount(); } componentWillUnmount() { this.removeEvents(); super.componentWillUnmount && super.componentWillUnmount(); } addEvents() { if (typeof window !== 'undefined') { window.addEventListener('click', this.onWindowClick); } } removeEvents() { if (typeof window !== 'undefined') { window.removeEventListener('click', this.onWindowClick); } } render() { const { inEditMode, className, itemsOnly } = this.props; const { editorContext } = this.state; const items = this.renderItems(); return (react_1.default.createElement(context_2.EditorContext.Provider, { value: editorContext }, react_1.default.createElement(styles_1.FrontEditorStyled // id="prisma-cms-front-editor--wrapper" // className={['root', className].join(' ')} , { // id="prisma-cms-front-editor--wrapper" // className={['root', className].join(' ')} className: [className, !itemsOnly ? 'flex' : ''].join(' ') }, inEditMode && !itemsOnly ? (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("div", { id: "prisma-cms-front-editor--content", className: "editor bordered", style: { height: '100%', display: 'flex', flexDirection: 'column', } }, react_1.default.createElement("div", { id: "prisma-cms-front-editor--items", className: "items", style: { flex: 1, overflow: 'auto', } }, items), react_1.default.createElement("div", { ref: this.actionPanelRef, className: "front-editor--action-panel actionPanel", onClick: this.stopPropagation })), react_1.default.createElement("div", { id: "prisma-cms-front-editor--panel", className: "panel bordered opened", onClick: this.stopPropagation }, this.renderPanels()))) : (items)))); } } exports.FrontEditor = FrontEditor; FrontEditor.contextType = context_1.default; FrontEditor.defaultProps = { itemsOnly: false, inEditMode: false, Components: [], className: 'fullheight', }; exports.default = FrontEditor; //# sourceMappingURL=index.js.map