| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  | import { | 
					
						
							|  |  |  |     DecoratorNode, | 
					
						
							|  |  |  |     DOMConversion, | 
					
						
							|  |  |  |     DOMConversionMap, | 
					
						
							|  |  |  |     DOMConversionOutput, | 
					
						
							| 
									
										
										
										
											2024-08-14 02:36:18 +08:00
										 |  |  |     LexicalEditor, | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  |     SerializedLexicalNode, | 
					
						
							|  |  |  |     Spread | 
					
						
							|  |  |  | } from "lexical"; | 
					
						
							|  |  |  | import type {EditorConfig} from "lexical/LexicalEditor"; | 
					
						
							| 
									
										
										
										
											2024-12-05 02:53:59 +08:00
										 |  |  | import {EditorDecoratorAdapter} from "../../ui/framework/decorator"; | 
					
						
							|  |  |  | import {el} from "../../utils/dom"; | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export type SerializedDiagramNode = Spread<{ | 
					
						
							|  |  |  |     id: string; | 
					
						
							|  |  |  |     drawingId: string; | 
					
						
							|  |  |  |     drawingUrl: string; | 
					
						
							|  |  |  | }, SerializedLexicalNode> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export class DiagramNode extends DecoratorNode<EditorDecoratorAdapter> { | 
					
						
							|  |  |  |     __id: string = ''; | 
					
						
							|  |  |  |     __drawingId: string = ''; | 
					
						
							|  |  |  |     __drawingUrl: string = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static getType(): string { | 
					
						
							|  |  |  |         return 'diagram'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static clone(node: DiagramNode): DiagramNode { | 
					
						
							| 
									
										
										
										
											2024-08-11 23:08:51 +08:00
										 |  |  |         const newNode = new DiagramNode(node.__drawingId, node.__drawingUrl); | 
					
						
							|  |  |  |         newNode.__id = node.__id; | 
					
						
							|  |  |  |         return newNode; | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor(drawingId: string, drawingUrl: string, key?: string) { | 
					
						
							|  |  |  |         super(key); | 
					
						
							|  |  |  |         this.__drawingId = drawingId; | 
					
						
							|  |  |  |         this.__drawingUrl = drawingUrl; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setDrawingIdAndUrl(drawingId: string, drawingUrl: string): void { | 
					
						
							|  |  |  |         const self = this.getWritable(); | 
					
						
							|  |  |  |         self.__drawingUrl = drawingUrl; | 
					
						
							|  |  |  |         self.__drawingId = drawingId; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-19 19:09:41 +08:00
										 |  |  |     getDrawingIdAndUrl(): { id: string, url: string } { | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  |         const self = this.getLatest(); | 
					
						
							|  |  |  |         return { | 
					
						
							| 
									
										
										
										
											2024-07-19 19:09:41 +08:00
										 |  |  |             id: self.__drawingId, | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  |             url: self.__drawingUrl, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setId(id: string) { | 
					
						
							|  |  |  |         const self = this.getWritable(); | 
					
						
							|  |  |  |         self.__id = id; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     getId(): string { | 
					
						
							|  |  |  |         const self = this.getLatest(); | 
					
						
							|  |  |  |         return self.__id; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     decorate(editor: LexicalEditor, config: EditorConfig): EditorDecoratorAdapter { | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             type: 'diagram', | 
					
						
							|  |  |  |             getNode: () => this, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     isInline(): boolean { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     isIsolated() { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     createDOM(_config: EditorConfig, _editor: LexicalEditor) { | 
					
						
							|  |  |  |         return el('div', { | 
					
						
							|  |  |  |             id: this.__id || null, | 
					
						
							|  |  |  |             'drawio-diagram': this.__drawingId, | 
					
						
							|  |  |  |         }, [ | 
					
						
							|  |  |  |             el('img', {src: this.__drawingUrl}), | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     updateDOM(prevNode: DiagramNode, dom: HTMLElement) { | 
					
						
							|  |  |  |         const img = dom.querySelector('img'); | 
					
						
							|  |  |  |         if (!img) return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (prevNode.__id !== this.__id) { | 
					
						
							|  |  |  |             dom.setAttribute('id', this.__id); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (prevNode.__drawingUrl !== this.__drawingUrl) { | 
					
						
							|  |  |  |             img.setAttribute('src', this.__drawingUrl); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (prevNode.__drawingId !== this.__drawingId) { | 
					
						
							|  |  |  |             dom.setAttribute('drawio-diagram', this.__drawingId); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-19 19:09:41 +08:00
										 |  |  |     static importDOM(): DOMConversionMap | null { | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  |         return { | 
					
						
							| 
									
										
										
										
											2024-07-19 19:09:41 +08:00
										 |  |  |             div(node: HTMLElement): DOMConversion | null { | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 if (!node.hasAttribute('drawio-diagram')) { | 
					
						
							|  |  |  |                     return null; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return { | 
					
						
							| 
									
										
										
										
											2024-07-19 19:09:41 +08:00
										 |  |  |                     conversion: (element: HTMLElement): DOMConversionOutput | null => { | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         const img = element.querySelector('img'); | 
					
						
							|  |  |  |                         const drawingUrl = img?.getAttribute('src') || ''; | 
					
						
							|  |  |  |                         const drawingId = element.getAttribute('drawio-diagram') || ''; | 
					
						
							| 
									
										
										
										
											2024-08-11 23:08:51 +08:00
										 |  |  |                         const node = $createDiagramNode(drawingId, drawingUrl); | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-11 23:08:51 +08:00
										 |  |  |                         if (element.id) { | 
					
						
							|  |  |  |                             node.setId(element.id); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         return { node }; | 
					
						
							| 
									
										
										
										
											2024-07-03 17:28:04 +08:00
										 |  |  |                     }, | 
					
						
							|  |  |  |                     priority: 3, | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     exportJSON(): SerializedDiagramNode { | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             type: 'diagram', | 
					
						
							|  |  |  |             version: 1, | 
					
						
							|  |  |  |             id: this.__id, | 
					
						
							|  |  |  |             drawingId: this.__drawingId, | 
					
						
							|  |  |  |             drawingUrl: this.__drawingUrl, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static importJSON(serializedNode: SerializedDiagramNode): DiagramNode { | 
					
						
							|  |  |  |         const node = $createDiagramNode(serializedNode.drawingId, serializedNode.drawingUrl); | 
					
						
							|  |  |  |         node.setId(serializedNode.id || ''); | 
					
						
							|  |  |  |         return node; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function $createDiagramNode(drawingId: string = '', drawingUrl: string = ''): DiagramNode { | 
					
						
							|  |  |  |     return new DiagramNode(drawingId, drawingUrl); | 
					
						
							|  |  |  | } |