]> BookStack Code Mirror - bookstack/blob - resources/js/wysiwyg/ui/index.ts
Lexical: Started code block node implementation
[bookstack] / resources / js / wysiwyg / ui / index.ts
1 import {LexicalEditor} from "lexical";
2 import {getImageToolbarContent, getLinkToolbarContent, getMainEditorFullToolbar} from "./toolbars";
3 import {EditorUIManager} from "./framework/manager";
4 import {image as imageFormDefinition, link as linkFormDefinition, source as sourceFormDefinition} from "./defaults/form-definitions";
5 import {ImageDecorator} from "./decorators/image";
6 import {EditorUiContext} from "./framework/core";
7 import {CodeBlockDecorator} from "./decorators/code-block";
8
9 export function buildEditorUI(container: HTMLElement, element: HTMLElement, editor: LexicalEditor) {
10     const manager = new EditorUIManager();
11     const context: EditorUiContext = {
12         editor,
13         containerDOM: container,
14         editorDOM: element,
15         manager,
16         translate: (text: string): string => text,
17         lastSelection: null,
18     };
19     manager.setContext(context);
20
21     // Create primary toolbar
22     manager.setToolbar(getMainEditorFullToolbar());
23
24     // Register modals
25     manager.registerModal('link', {
26         title: 'Insert/Edit link',
27         form: linkFormDefinition,
28     });
29     manager.registerModal('image', {
30         title: 'Insert/Edit Image',
31         form: imageFormDefinition
32     });
33     manager.registerModal('source', {
34         title: 'Source code',
35         form: sourceFormDefinition,
36     });
37
38     // Register context toolbars
39     manager.registerContextToolbar('image', {
40         selector: 'img',
41         content: getImageToolbarContent(),
42         displayTargetLocator(originalTarget: HTMLElement) {
43             return originalTarget.closest('a') || originalTarget;
44         }
45     });
46     manager.registerContextToolbar('link', {
47         selector: 'a',
48         content: getLinkToolbarContent(),
49     });
50
51     // Register image decorator listener
52     manager.registerDecoratorType('image', ImageDecorator);
53     manager.registerDecoratorType('code', CodeBlockDecorator);
54 }