import {LexicalEditor} from "lexical"; import { getCodeToolbarContent, getImageToolbarContent, getLinkToolbarContent, getMainEditorFullToolbar, getTableToolbarContent } from "./toolbars"; import {EditorUIManager} from "./framework/manager"; import {ImageDecorator} from "./decorators/image"; import {EditorUiContext} from "./framework/core"; import {CodeBlockDecorator} from "./decorators/code-block"; import {DiagramDecorator} from "./decorators/diagram"; import {modals} from "./defaults/modals"; export function buildEditorUI(container: HTMLElement, element: HTMLElement, scrollContainer: HTMLElement, editor: LexicalEditor, options: Record): EditorUiContext { const manager = new EditorUIManager(); const context: EditorUiContext = { editor, containerDOM: container, editorDOM: element, scrollDOM: scrollContainer, manager, translate: (text: string): string => text, options, }; manager.setContext(context); // Create primary toolbar manager.setToolbar(getMainEditorFullToolbar()); // Register modals for (const key of Object.keys(modals)) { manager.registerModal(key, modals[key]); } // Register context toolbars manager.registerContextToolbar('image', { selector: 'img:not([drawio-diagram] img)', content: getImageToolbarContent(), }); manager.registerContextToolbar('link', { selector: 'a', content: getLinkToolbarContent(), displayTargetLocator(originalTarget: HTMLElement): HTMLElement { const image = originalTarget.querySelector('img'); return image || originalTarget; } }); manager.registerContextToolbar('code', { selector: '.editor-code-block-wrap', content: getCodeToolbarContent(), }); manager.registerContextToolbar('table', { selector: 'td,th', content: getTableToolbarContent(), displayTargetLocator(originalTarget: HTMLElement): HTMLElement { return originalTarget.closest('table') as HTMLTableElement; } }); // Register image decorator listener manager.registerDecoratorType('image', ImageDecorator); manager.registerDecoratorType('code', CodeBlockDecorator); manager.registerDecoratorType('diagram', DiagramDecorator); return context; }