UNPKG

@prisma-cms/front-editor

Version:
221 lines (220 loc) 11.1 kB
/** * ToDo * 1. Сейчас не оптимально структура компонентов выстроена, из-за чего нарушается * отзывчивость компонентов на изменения. В частности renderHeader() выполняется * из активного элемента, а не текущего, и после сохранения объекта не * прекращается индикатор загрузки. Пришлось хакнуть принудительным обновлением через 2 сек. * * 2. Вынести методы в контекст. createTemplate, updateTemplate, deleteTemplate, */ import React from 'react'; import { EditableObject } from 'apollo-cms'; import { EditorContextValue } from '../context'; import { PrismaCmsContext } from '@prisma-cms/context'; import { EditorComponentObject, EditorComponentProps, EditorComponentState } from './interfaces'; import { ElementWithReactComponent } from '..'; export * from './interfaces'; export declare class EditorComponent<P extends EditorComponentProps = EditorComponentProps, S extends EditorComponentState = EditorComponentState> extends EditableObject<P, S> { context: PrismaCmsContext; static Name: string; static saveable: boolean; static help_url: string; static defaultProps: { errorDelay: number; SaveIcon: React.ComponentType<{}>; ResetIcon: React.ComponentType<import("material-ui/SvgIcon").SvgIconProps>; EditIcon: React.ComponentType<import("material-ui/SvgIcon").SvgIconProps>; cacheKeyPrefix: string; } & { contentEditable: boolean | undefined; } & Record<string, any>; component: EditorComponent | undefined; constructor(props: P); /** * Пока что имеются коллизии с обновляемыми объектами, взятыми из кеша, * так что пока кеш отключаем */ container: EditorComponent | ElementWithReactComponent | Text | null; reactComponent: EditorComponent | null; componentDidMount(): void; addEventListeners(): void; componentWillUnmount(): void; /** * @deprecated */ processMeta(_meta?: {}): void; /** * Редактировать можно в следующих случаях: * 1. Если нет родителя и нет id * 2. Если есть ID и пользователь является владельцем */ prepareDirty(data: P['_dirty']): P['_dirty'] | undefined; /** * Обновление данных объекта. * Так как компоненты рендерятся на основании передаваемых свойств, * надо обновить данные абсолютного родителя, а не просто текущего элемента */ updateObject(data: P['_dirty']): void; onDragStart: (event: React.DragEvent) => void; /** * Создаем новый элемент, который будет добавлен в схему при перетаскивании */ prepareDragItem(): EditorComponentObject; prepareDragItemProps(): {}; prepareDragItemComponents(): never[]; onDragEnd: () => void; onDrop(event: React.DragEvent): true | undefined; prepareNewItem(item: P['object']): P['object'] | undefined; /** * Двигаем блок вверх */ moveBlockUp(event?: React.MouseEvent): void; /** * Двигаем блок вниз */ moveBlockDown(event?: React.MouseEvent): void; /** * Обновить мы должны текущий элемент или предка */ addComponent(newItem: P['object']): void; /** * Перетираем компоненты текущего объекта */ setComponents(components: P['object']['components']): void; /** * Удаление элемента. * Если это корневой элемент, удаляем его. * Если нет, то удаляем из родительского */ delete: (event?: React.MouseEvent<Element, MouseEvent> | undefined) => false | undefined; isDeletable(): boolean; /** * Надо обновить components, чтобы в объекте было актуальное свойство // */ /** * Проходимся вверх до тех пор, пока не найдем родителя с id */ getActiveParent(): EditorComponent; /** * При клике по активному элементу в документе, * отмечаем его, чтобы можно было редактировать его свойства */ onClick(event: React.MouseEvent): void; setActiveItem: (component: EditorContextValue['activeItem']) => void; inMainMode: () => boolean; onMouseOver(event: React.MouseEvent): void; onMouseLeave(event: React.MouseEvent): void; isHovered(): S["hovered"]; onDragEnter(event: React.DragEvent): true | undefined; /** * Учитывается при наведении. * Определяет может ли быть брошен сюда перетаскиваемый элемент */ /** * Возможно этот метод будет оставлен (или переименован). * Получается следующая логика: * При перетаскивании, дочерний элемент смотрим, хочет ли он стать дочерним * через метод canBeChild(), в котором смотрит * */ canBeDropped(child: EditorContextValue['dragItem']): boolean; /** * В новом компоненте проверяет может ли компонент на странице стать родительским для него. */ canBeParent(parent: P['parent']): boolean; /** * В родительском компоненте проверяет может ли новый компонент стать дочерним. */ canBeChild(child: EditorComponent): boolean; /** * Note: If using in canBeParent, should pass parent instead this */ findInParent(parent: EditorComponent, condition: (parent: EditorComponent) => EditorComponent | null): EditorComponent | null; /** * Поиск реакт-объекта в дочерних * this.findReactChild(editableObject._reactInternalFiber.child, stateNode => stateNode instanceof Editable); */ onDragOver(event: React.DragEvent): true | undefined; getComponentProps(component: EditorComponent): P['object']['props']; getRenderProps(componentProps?: {}): any; renderPanelView(content?: React.ReactNode): React.ReactNode; onAddButtonClick: (event: React.MouseEvent) => void; renderAddButton(content?: React.ReactNode): React.ReactNode; unsetActiveItem: (event: React.MouseEvent) => void; onInputSettings: (event: React.ChangeEvent<HTMLInputElement>) => void; expandStructure: (event: React.MouseEvent<HTMLInputElement>) => void; renderSettingsView(content?: React.ReactNode): JSX.Element | null; /** * Сохраняем в самостоятельный компонент */ saveSeparatedComponent(parentId: P['object']['id']): Promise<false | undefined>; isRoot(): boolean; getStructure(item: EditorComponent): { __typename?: string | undefined; id?: string | undefined; name: string; description?: string | null | undefined; component: string | EditorComponent<EditorComponentProps, EditorComponentState>; components: EditorComponentObject<Record<string, any>>[]; props: Record<string, any> & { text?: string | null | undefined; tag?: keyof JSX.IntrinsicElements | undefined; query?: string | undefined; first?: number | undefined; style?: React.CSSProperties | undefined; }; createdAt?: string | undefined; updatedAt?: string | undefined; } | {}; getEditorField(props: any): JSX.Element | null; renderUploader(props?: Record<string, any>): JSX.Element; onChangeProps(event: React.ChangeEvent, style: any): void; updateProps(node: any, style: any): void; updateComponentProperty(name: keyof P['object']['props'], value: any, style?: any): void; /** * Обновления свойств объекта. * Здесь важно понимать когда свойства текущего объекта надо изменить (если корневой или с id), * а когда родительский (с плавающей вложенностью) */ updateComponentProps(data: Partial<P['object']['props']>): void; /** * ToDo. Сейчас при перетаскивании элементов с id возникают проблемы, * потому что у одного родителя может быть сразу несколько потомков с одним и тем же id. * По этой причине мы не можем сейчас четко определить какой же элемент двигался. */ getComponentInParent(): EditorComponentObject<Record<string, any>> | null | undefined; removeProps(name: keyof P['object']['props']): void; getActiveItem(): EditorComponent<EditorComponentProps, EditorComponentState> | null | undefined; isActive: () => boolean; stopPropagation: (event: React.MouseEvent) => void; renderMainView(renderProps?: Record<string, any>): React.ReactNode; renderBadgeTitle(title: React.ReactNode): React.ReactNode; renderBadge(badge: React.ReactNode): React.ReactNode; renderAddButtons(content: React.ReactNode): React.ReactNode; renderActionPanel(content: React.ReactNode): React.ReactNode; isVoidElement(): boolean; prepareRootElementProps(props: P & Record<string, any>): Record<string, any>; getRootElement(): React.ReactNode; renderChildren(): React.ReactNode; getComponents(itemComponents: P['object']['components']): P["object"]["components"]; renderComponent(objectComponent: P['object'], index: number): JSX.Element | null | undefined; deleteComponentByIndex: (index: number) => void; inEditorMode(): boolean; /** * Do not render header for all components. * If in render, use renderComponentHeader() */ renderHeader(): null; renderComponentHeader(): React.ReactNode; getTitle(): string | undefined; renderEmpty(): React.ReactNode; renderEditableView(): React.ReactNode; renderDefaultView(): React.ReactNode; editorContext: EditorContextValue; getEditorContext: () => EditorContextValue; render(): JSX.Element; } export default EditorComponent;