@prisma-cms/front-editor
Version:
221 lines (220 loc) • 11.1 kB
TypeScript
/**
* 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;