6 LexicalEditor, LexicalNode,
10 import type {EditorConfig} from "lexical/LexicalEditor";
11 import {el} from "../helpers";
12 import {EditorDecoratorAdapter} from "../ui/framework/decorator";
14 export type SerializedDiagramNode = Spread<{
18 }, SerializedLexicalNode>
20 export class DiagramNode extends DecoratorNode<EditorDecoratorAdapter> {
22 __drawingId: string = '';
23 __drawingUrl: string = '';
25 static getType(): string {
29 static clone(node: DiagramNode): DiagramNode {
30 return new DiagramNode(node.__drawingId, node.__drawingUrl);
33 constructor(drawingId: string, drawingUrl: string, key?: string) {
35 this.__drawingId = drawingId;
36 this.__drawingUrl = drawingUrl;
39 setDrawingIdAndUrl(drawingId: string, drawingUrl: string): void {
40 const self = this.getWritable();
41 self.__drawingUrl = drawingUrl;
42 self.__drawingId = drawingId;
45 getDrawingIdAndUrl(): {id: string, url: string} {
46 const self = this.getLatest();
48 id: self.__drawingUrl,
49 url: self.__drawingUrl,
54 const self = this.getWritable();
59 const self = this.getLatest();
63 decorate(editor: LexicalEditor, config: EditorConfig): EditorDecoratorAdapter {
78 createDOM(_config: EditorConfig, _editor: LexicalEditor) {
80 id: this.__id || null,
81 'drawio-diagram': this.__drawingId,
83 el('img', {src: this.__drawingUrl}),
87 updateDOM(prevNode: DiagramNode, dom: HTMLElement) {
88 const img = dom.querySelector('img');
89 if (!img) return false;
91 if (prevNode.__id !== this.__id) {
92 dom.setAttribute('id', this.__id);
95 if (prevNode.__drawingUrl !== this.__drawingUrl) {
96 img.setAttribute('src', this.__drawingUrl);
99 if (prevNode.__drawingId !== this.__drawingId) {
100 dom.setAttribute('drawio-diagram', this.__drawingId);
106 static importDOM(): DOMConversionMap|null {
108 div(node: HTMLElement): DOMConversion|null {
110 if (!node.hasAttribute('drawio-diagram')) {
115 conversion: (element: HTMLElement): DOMConversionOutput|null => {
117 const img = element.querySelector('img');
118 const drawingUrl = img?.getAttribute('src') || '';
119 const drawingId = element.getAttribute('drawio-diagram') || '';
122 node: $createDiagramNode(drawingId, drawingUrl),
131 exportJSON(): SerializedDiagramNode {
136 drawingId: this.__drawingId,
137 drawingUrl: this.__drawingUrl,
141 static importJSON(serializedNode: SerializedDiagramNode): DiagramNode {
142 const node = $createDiagramNode(serializedNode.drawingId, serializedNode.drawingUrl);
143 node.setId(serializedNode.id || '');
148 export function $createDiagramNode(drawingId: string = '', drawingUrl: string = ''): DiagramNode {
149 return new DiagramNode(drawingId, drawingUrl);
152 export function $isDiagramNode(node: LexicalNode | null | undefined) {
153 return node instanceof DiagramNode;
156 export function $openDrawingEditorForNode(editor: LexicalEditor, node: DiagramNode): void {