X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b24d60e98d0c990f2a5d0cdf3a09b6d37fc2f195..refs/pull/5676/head:/resources/js/wysiwyg/ui/index.ts diff --git a/resources/js/wysiwyg/ui/index.ts b/resources/js/wysiwyg/ui/index.ts index 10eaa558f..c48386bb4 100644 --- a/resources/js/wysiwyg/ui/index.ts +++ b/resources/js/wysiwyg/ui/index.ts @@ -1,51 +1,42 @@ -import { - $getSelection, - BaseSelection, - COMMAND_PRIORITY_LOW, - LexicalEditor, - SELECTION_CHANGE_COMMAND -} from "lexical"; -import {$createCalloutNode, $isCalloutNodeOfCategory} from "../nodes/callout"; -import {selectionContainsNodeType, toggleSelectionBlockNodeType} from "../helpers"; -import {EditorButton, EditorButtonDefinition} from "./editor-button"; +import {LexicalEditor} from "lexical"; +import {EditorUIManager} from "./framework/manager"; +import {EditorUiContext} from "./framework/core"; +import {el} from "../utils/dom"; -const calloutButton: EditorButtonDefinition = { - label: 'Info Callout', - action(editor: LexicalEditor) { - toggleSelectionBlockNodeType( - editor, - (node) => $isCalloutNodeOfCategory(node, 'info'), - () => $createCalloutNode('info'), - ) - }, - isActive(selection: BaseSelection|null): boolean { - return selectionContainsNodeType(selection, (node) => $isCalloutNodeOfCategory(node, 'info')); - } -} - -const toolbarButtonDefinitions: EditorButtonDefinition[] = [ - calloutButton, -]; - -export function buildEditorUI(element: HTMLElement, editor: LexicalEditor) { - const toolbarContainer = document.createElement('div'); - toolbarContainer.classList.add('editor-toolbar-container'); - - const buttons = toolbarButtonDefinitions.map(definition => { - return new EditorButton(definition, editor); +export function buildEditorUI(containerDOM: HTMLElement, editor: LexicalEditor, options: Record): EditorUiContext { + const editorDOM = el('div', { + contenteditable: 'true', + class: `editor-content-area ${options.editorClass || ''}`, }); + const scrollDOM = el('div', { + class: 'editor-content-wrap', + }, [editorDOM]); - const buttonElements = buttons.map(button => button.getDOMElement()); + containerDOM.append(scrollDOM); + containerDOM.classList.add('editor-container'); + containerDOM.setAttribute('dir', options.textDirection); + if (options.darkMode) { + containerDOM.classList.add('editor-dark'); + } - toolbarContainer.append(...buttonElements); - element.before(toolbarContainer); + const manager = new EditorUIManager(); + const context: EditorUiContext = { + editor, + containerDOM: containerDOM, + editorDOM: editorDOM, + scrollDOM: scrollDOM, + manager, + translate(text: string): string { + const translations = options.translations; + return translations[text] || text; + }, + error(error: string|Error): void { + const message = error instanceof Error ? error.message : error; + window.$events.error(message); // TODO - Translate + }, + options, + }; + manager.setContext(context); - // Update button states on editor selection change - editor.registerCommand(SELECTION_CHANGE_COMMAND, () => { - const selection = $getSelection(); - for (const button of buttons) { - button.updateActiveState(selection); - } - return false; - }, COMMAND_PRIORITY_LOW); + return context; } \ No newline at end of file