| 
							
							
							
						 |  |  | @@ -1,10 +1,7 @@ | 
		
	
		
			
				|  |  |  |  | import libraryLoader from "../../services/library_loader.js"; | 
		
	
		
			
				|  |  |  |  | import TypeWidget from "./type_widget.js"; | 
		
	
		
			
				|  |  |  |  | import libraryLoader from '../../services/library_loader.js'; | 
		
	
		
			
				|  |  |  |  | import TypeWidget from './type_widget.js'; | 
		
	
		
			
				|  |  |  |  | import utils from '../../services/utils.js'; | 
		
	
		
			
				|  |  |  |  | import linkService from '../../services/link.js'; | 
		
	
		
			
				|  |  |  |  | import debounce from "../../services/debounce.js"; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | const {sleep} = utils; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | const TPL = ` | 
		
	
		
			
				|  |  |  |  |     <div class="canvas-widget note-detail-canvas note-detail-printable note-detail"> | 
		
	
	
		
			
				
					
					|  |  |  | @@ -105,8 +102,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |         this.SCENE_VERSION_INITIAL = -1; // -1 indicates that it is fresh. excalidraw scene version is always >0 | 
		
	
		
			
				|  |  |  |  |         this.SCENE_VERSION_ERROR = -2; // -2 indicates error | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         // config | 
		
	
		
			
				|  |  |  |  |         this.DEBOUNCE_TIME_ONCHANGEHANDLER = 750; // ms | 
		
	
		
			
				|  |  |  |  |         // ensure that assets are loaded from trilium | 
		
	
		
			
				|  |  |  |  |         window.EXCALIDRAW_ASSET_PATH = `${window.location.origin}/node_modules/@excalidraw/excalidraw/dist/`; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -115,16 +110,10 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |         this.currentSceneVersion = this.SCENE_VERSION_INITIAL; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         // will be overwritten | 
		
	
		
			
				|  |  |  |  |         this.excalidrawRef; | 
		
	
		
			
				|  |  |  |  |         this.$render; | 
		
	
		
			
				|  |  |  |  |         this.$widget; | 
		
	
		
			
				|  |  |  |  |         this.reactHandlers; // used to control react state | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         // binds | 
		
	
		
			
				|  |  |  |  |         this.createExcalidrawReactApp = this.createExcalidrawReactApp.bind(this); | 
		
	
		
			
				|  |  |  |  |         this.onChangeHandler = this.onChangeHandler.bind(this); | 
		
	
		
			
				|  |  |  |  |         this.isNewSceneVersion = this.isNewSceneVersion.bind(this); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         this.libraryChanged = false; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -155,7 +144,8 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |                 const renderElement = this.$render.get(0); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |                 ReactDOM.unmountComponentAtNode(renderElement); | 
		
	
		
			
				|  |  |  |  |                 ReactDOM.render(React.createElement(this.createExcalidrawReactApp), renderElement); | 
		
	
		
			
				|  |  |  |  |                 const root = ReactDOM.createRoot(renderElement); | 
		
	
		
			
				|  |  |  |  |                 root.render(React.createElement(() => this.createExcalidrawReactApp())); | 
		
	
		
			
				|  |  |  |  |             }); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         return this.$widget; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -179,9 +169,9 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |         const blob = await note.getBlob(); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         // before we load content into excalidraw, make sure excalidraw has loaded | 
		
	
		
			
				|  |  |  |  |         while (!this.excalidrawRef?.current) { | 
		
	
		
			
				|  |  |  |  |             console.log("excalidrawRef not yet loaded, sleep 200ms..."); | 
		
	
		
			
				|  |  |  |  |             await sleep(200); | 
		
	
		
			
				|  |  |  |  |         while (!this.excalidrawApi) { | 
		
	
		
			
				|  |  |  |  |             console.log("excalidrawApi not yet loaded, sleep 200ms..."); | 
		
	
		
			
				|  |  |  |  |             await utils.sleep(200); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         /** | 
		
	
	
		
			
				
					
					|  |  |  | @@ -199,7 +189,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |                 collaborators: [] | 
		
	
		
			
				|  |  |  |  |             }; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |             this.excalidrawRef.current.updateScene(sceneData); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawApi.updateScene(sceneData); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         else if (blob.content) { | 
		
	
		
			
				|  |  |  |  |             // load saved content into excalidraw canvas | 
		
	
	
		
			
				
					
					|  |  |  | @@ -246,9 +236,9 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |                 fileArray.push(file); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |             this.excalidrawRef.current.updateScene(sceneData); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawRef.current.addFiles(fileArray); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawRef.current.history.clear(); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawApi.updateScene(sceneData); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawApi.addFiles(fileArray); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawApi.history.clear(); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         Promise.all( | 
		
	
	
		
			
				
					
					|  |  |  | @@ -261,7 +251,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |             const libraryItems = blobs.map(blob => blob.getJsonContentSafely()).filter(item => !!item); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawRef.current.updateLibrary({libraryItems, merge: false}); | 
		
	
		
			
				|  |  |  |  |             this.excalidrawApi.updateLibrary({libraryItems, merge: false}); | 
		
	
		
			
				|  |  |  |  |         }); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         // set initial scene version | 
		
	
	
		
			
				
					
					|  |  |  | @@ -275,17 +265,17 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |      * this is automatically called after this.saveData(); | 
		
	
		
			
				|  |  |  |  |      */ | 
		
	
		
			
				|  |  |  |  |     async getData() { | 
		
	
		
			
				|  |  |  |  |         const elements = this.excalidrawRef.current.getSceneElements(); | 
		
	
		
			
				|  |  |  |  |         const appState = this.excalidrawRef.current.getAppState(); | 
		
	
		
			
				|  |  |  |  |         const elements = this.excalidrawApi.getSceneElements(); | 
		
	
		
			
				|  |  |  |  |         const appState = this.excalidrawApi.getAppState(); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         /** | 
		
	
		
			
				|  |  |  |  |          * A file is not deleted, even though removed from canvas. Therefore, we only keep | 
		
	
		
			
				|  |  |  |  |          * files that are referenced by an element. Maybe this will change with a new excalidraw version? | 
		
	
		
			
				|  |  |  |  |          */ | 
		
	
		
			
				|  |  |  |  |         const files = this.excalidrawRef.current.getFiles(); | 
		
	
		
			
				|  |  |  |  |         const files = this.excalidrawApi.getFiles(); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         // parallel svg export to combat bitrot and enable rendering image for note inclusion, preview, and share | 
		
	
		
			
				|  |  |  |  |         const svg = await window.ExcalidrawLib.exportToSvg({ | 
		
	
		
			
				|  |  |  |  |         const svg = await ExcalidrawLib.exportToSvg({ | 
		
	
		
			
				|  |  |  |  |             elements, | 
		
	
		
			
				|  |  |  |  |             appState, | 
		
	
		
			
				|  |  |  |  |             exportPadding: 5, // 5 px padding | 
		
	
	
		
			
				
					
					|  |  |  | @@ -321,7 +311,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |             // this.libraryChanged is unset in dataSaved() | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |             // there's no separate method to get library items, so have to abuse this one | 
		
	
		
			
				|  |  |  |  |             const libraryItems = await this.excalidrawRef.current.updateLibrary({merge: true}); | 
		
	
		
			
				|  |  |  |  |             const libraryItems = await this.excalidrawApi.updateLibrary({merge: true}); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |             let position = 10; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -379,9 +369,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |     createExcalidrawReactApp() { | 
		
	
		
			
				|  |  |  |  |         const React = window.React; | 
		
	
		
			
				|  |  |  |  |         const { Excalidraw } = window.ExcalidrawLib; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         const excalidrawRef = React.useRef(null); | 
		
	
		
			
				|  |  |  |  |         this.excalidrawRef = excalidrawRef; | 
		
	
		
			
				|  |  |  |  |         const excalidrawWrapperRef = React.useRef(null); | 
		
	
		
			
				|  |  |  |  |         this.excalidrawWrapperRef = excalidrawWrapperRef; | 
		
	
		
			
				|  |  |  |  |         const [dimensions, setDimensions] = React.useState({ | 
		
	
	
		
			
				
					
					|  |  |  | @@ -439,7 +426,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |                 React.createElement(Excalidraw, { | 
		
	
		
			
				|  |  |  |  |                     // this makes sure that 1) manual theme switch button is hidden 2) theme stays as it should after opening menu | 
		
	
		
			
				|  |  |  |  |                     theme: this.themeStyle, | 
		
	
		
			
				|  |  |  |  |                     ref: excalidrawRef, | 
		
	
		
			
				|  |  |  |  |                     excalidrawAPI: api => { this.excalidrawApi = api; }, | 
		
	
		
			
				|  |  |  |  |                     width: dimensions.width, | 
		
	
		
			
				|  |  |  |  |                     height: dimensions.height, | 
		
	
		
			
				|  |  |  |  |                     onPaste: (data, event) => { | 
		
	
	
		
			
				
					
					|  |  |  | @@ -450,7 +437,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |                         this.saveData(); | 
		
	
		
			
				|  |  |  |  |                     }, | 
		
	
		
			
				|  |  |  |  |                     onChange: debounce(this.onChangeHandler, this.DEBOUNCE_TIME_ONCHANGEHANDLER), | 
		
	
		
			
				|  |  |  |  |                     onChange: () => this.onChangeHandler(), | 
		
	
		
			
				|  |  |  |  |                     viewModeEnabled: false, | 
		
	
		
			
				|  |  |  |  |                     zenModeEnabled: false, | 
		
	
		
			
				|  |  |  |  |                     gridModeEnabled: false, | 
		
	
	
		
			
				
					
					|  |  |  | @@ -483,8 +470,8 @@ export default class ExcalidrawTypeWidget extends TypeWidget { | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     getSceneVersion() { | 
		
	
		
			
				|  |  |  |  |         if (this.excalidrawRef) { | 
		
	
		
			
				|  |  |  |  |             const elements = this.excalidrawRef.current.getSceneElements(); | 
		
	
		
			
				|  |  |  |  |         if (this.excalidrawApi) { | 
		
	
		
			
				|  |  |  |  |             const elements = this.excalidrawApi.getSceneElements(); | 
		
	
		
			
				|  |  |  |  |             return window.ExcalidrawLib.getSceneVersion(elements); | 
		
	
		
			
				|  |  |  |  |         } else { | 
		
	
		
			
				|  |  |  |  |             return this.SCENE_VERSION_ERROR; | 
		
	
	
		
			
				
					
					|  |  |  |   |