10 import type {EditorConfig} from "lexical/LexicalEditor";
11 import {EditorDecoratorAdapter} from "../ui/framework/decorator";
12 import {el} from "../utils/dom";
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 const newNode = new DiagramNode(node.__drawingId, node.__drawingUrl);
31 newNode.__id = node.__id;
35 constructor(drawingId: string, drawingUrl: string, key?: string) {
37 this.__drawingId = drawingId;
38 this.__drawingUrl = drawingUrl;
41 setDrawingIdAndUrl(drawingId: string, drawingUrl: string): void {
42 const self = this.getWritable();
43 self.__drawingUrl = drawingUrl;
44 self.__drawingId = drawingId;
47 getDrawingIdAndUrl(): { id: string, url: string } {
48 const self = this.getLatest();
51 url: self.__drawingUrl,
56 const self = this.getWritable();
61 const self = this.getLatest();
65 decorate(editor: LexicalEditor, config: EditorConfig): EditorDecoratorAdapter {
80 createDOM(_config: EditorConfig, _editor: LexicalEditor) {
82 id: this.__id || null,
83 'drawio-diagram': this.__drawingId,
85 el('img', {src: this.__drawingUrl}),
89 updateDOM(prevNode: DiagramNode, dom: HTMLElement) {
90 const img = dom.querySelector('img');
91 if (!img) return false;
93 if (prevNode.__id !== this.__id) {
94 dom.setAttribute('id', this.__id);
97 if (prevNode.__drawingUrl !== this.__drawingUrl) {
98 img.setAttribute('src', this.__drawingUrl);
101 if (prevNode.__drawingId !== this.__drawingId) {
102 dom.setAttribute('drawio-diagram', this.__drawingId);
108 static importDOM(): DOMConversionMap | null {
110 div(node: HTMLElement): DOMConversion | null {
112 if (!node.hasAttribute('drawio-diagram')) {
117 conversion: (element: HTMLElement): DOMConversionOutput | null => {
119 const img = element.querySelector('img');
120 const drawingUrl = img?.getAttribute('src') || '';
121 const drawingId = element.getAttribute('drawio-diagram') || '';
122 const node = $createDiagramNode(drawingId, drawingUrl);
125 node.setId(element.id);
136 exportJSON(): SerializedDiagramNode {
141 drawingId: this.__drawingId,
142 drawingUrl: this.__drawingUrl,
146 static importJSON(serializedNode: SerializedDiagramNode): DiagramNode {
147 const node = $createDiagramNode(serializedNode.drawingId, serializedNode.drawingUrl);
148 node.setId(serializedNode.id || '');
153 export function $createDiagramNode(drawingId: string = '', drawingUrl: string = ''): DiagramNode {
154 return new DiagramNode(drawingId, drawingUrl);