X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/3ac34b584930aad5625d29ca6c2e59b85e9d2ef8..b5a2d3c1c423d81b80fd7034a33ada85863a29ad:/resources/assets/js/components/wysiwyg-editor.js diff --git a/resources/assets/js/components/wysiwyg-editor.js b/resources/assets/js/components/wysiwyg-editor.js index 701a1fec6..a8a2ff175 100644 --- a/resources/assets/js/components/wysiwyg-editor.js +++ b/resources/assets/js/components/wysiwyg-editor.js @@ -221,8 +221,6 @@ function codePlugin() { function drawIoPlugin() { - const drawIoUrl = 'https://www.draw.io/?embed=1&ui=atlas&spin=1&proto=json'; - let iframe = null; let pageEditor = null; let currentNode = null; @@ -230,6 +228,22 @@ function drawIoPlugin() { return node.hasAttribute('drawio-diagram'); } + function showDrawingManager(mceEditor, selectedNode = null) { + pageEditor = mceEditor; + currentNode = selectedNode; + // Show image manager + window.ImageManager.show(function (image) { + if (selectedNode) { + let imgElem = selectedNode.querySelector('img'); + pageEditor.dom.setAttrib(imgElem, 'src', image.url); + pageEditor.dom.setAttrib(selectedNode, 'drawio-diagram', image.id); + } else { + let imgHTML = `
`; + pageEditor.insertContent(imgHTML); + } + }, 'drawio'); + } + function showDrawingEditor(mceEditor, selectedNode = null) { pageEditor = mceEditor; currentNode = selectedNode; @@ -248,9 +262,9 @@ function drawIoPlugin() { if (currentNode) { DrawIO.close(); let imgElem = currentNode.querySelector('img'); - let drawingId = currentNode.getAttribute('drawio-diagram'); - window.$http.put(window.baseUrl(`/images/drawing/upload/${drawingId}`), data).then(resp => { - pageEditor.dom.setAttrib(imgElem, 'src', `${resp.data.url}?updated=${Date.now()}`); + window.$http.post(window.baseUrl(`/images/drawing/upload`), data).then(resp => { + pageEditor.dom.setAttrib(imgElem, 'src', resp.data.url); + pageEditor.dom.setAttrib(currentNode, 'drawio-diagram', resp.data.id); }).catch(err => { window.$events.emit('error', trans('errors.image_upload_error')); console.log(err); @@ -287,13 +301,24 @@ function drawIoPlugin() { window.tinymce.PluginManager.add('drawio', function(editor, url) { editor.addCommand('drawio', () => { - showDrawingEditor(editor); + let selectedNode = editor.selection.getNode(); + showDrawingEditor(editor, isDrawing(selectedNode) ? selectedNode : null); }); editor.addButton('drawio', { + type: 'splitbutton', tooltip: 'Drawing', image: `data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiMwMDAwMDAiICB4bWxucz0iaHR0cDovL3d3 dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0iTTIzIDdWMWgtNnYySDdWMUgxdjZoMnYx MEgxdjZoNnYtMmgxMHYyaDZ2LTZoLTJWN2gyek0zIDNoMnYySDNWM3ptMiAxOEgzdi0yaDJ2Mnpt MTItMkg3di0ySDVWN2gyVjVoMTB2MmgydjEwaC0ydjJ6bTQgMmgtMnYtMmgydjJ6TTE5IDVWM2gy djJoLTJ6bS01LjI3IDloLTMuNDlsLS43MyAySDcuODlsMy40LTloMS40bDMuNDEgOWgtMS42M2wt Ljc0LTJ6bS0zLjA0LTEuMjZoMi42MUwxMiA4LjkxbC0xLjMxIDMuODN6Ii8+CiAgICA8cGF0aCBk PSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+Cjwvc3ZnPg==`, - cmd: 'drawio' + cmd: 'drawio', + menu: [ + { + text: 'Drawing Manager', + onclick() { + let selectedNode = editor.selection.getNode(); + showDrawingManager(editor, isDrawing(selectedNode) ? selectedNode : null); + } + } + ] }); editor.on('dblclick', event => { @@ -443,7 +468,7 @@ class WysiwygEditor { html += `${image.name}`; html += ''; win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html); - }); + }, 'gallery'); } }, @@ -458,13 +483,36 @@ class WysiwygEditor { }, setup: function (editor) { - editor.on('init ExecCommand change input NodeChange ObjectResized', editorChange); + editor.on('ExecCommand change input NodeChange ObjectResized', editorChange); + + editor.on('init', () => { + editorChange(); + // Scroll to the content if needed. + const queryParams = (new URL(window.location)).searchParams; + const scrollId = queryParams.get('content-id'); + if (scrollId) { + scrollToText(scrollId); + } + }); function editorChange() { let content = editor.getContent(); window.$events.emit('editor-html-change', content); } + function scrollToText(scrollId) { + const element = editor.dom.get(encodeURIComponent(scrollId).replace(/!/g, '%21')); + if (!element) { + return; + } + + // scroll the element into the view and put the cursor at the end. + element.scrollIntoView(); + editor.selection.select(element, true); + editor.selection.collapse(false); + editor.focus(); + } + window.$events.listen('editor-html-update', html => { editor.setContent(html); editor.selection.select(editor.getBody(), true); @@ -522,7 +570,7 @@ class WysiwygEditor { html += `${image.name}`; html += ''; editor.execCommand('mceInsertContent', false, html); - }); + }, 'gallery'); } });