X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/ad48cd3e48ab5b16932d8c38032b80af619f525f..refs/pull/2960/head:/resources/js/components/wysiwyg-editor.js diff --git a/resources/js/components/wysiwyg-editor.js b/resources/js/components/wysiwyg-editor.js index 05897c250..bde73f4bf 100644 --- a/resources/js/components/wysiwyg-editor.js +++ b/resources/js/components/wysiwyg-editor.js @@ -38,7 +38,7 @@ function editorPaste(event, editor, wysiwygComponent) { editor.dom.replace(newEl, id); }).catch(err => { editor.dom.remove(id); - window.$events.emit('error', trans('errors.image_upload_error')); + window.$events.emit('error', wysiwygComponent.imageUploadErrorText); console.log(err); }); }, 10); @@ -152,8 +152,8 @@ function codePlugin() { return; } - let lang = selectedNode.hasAttribute('data-lang') ? selectedNode.getAttribute('data-lang') : ''; - let currentCode = selectedNode.querySelector('textarea').textContent; + const lang = selectedNode.hasAttribute('data-lang') ? selectedNode.getAttribute('data-lang') : ''; + const currentCode = selectedNode.querySelector('textarea').textContent; window.components.first('code-editor').open(currentCode, lang, (code, lang) => { const editorElem = selectedNode.querySelector('.CodeMirror'); @@ -212,7 +212,7 @@ function codePlugin() { showPopup(editor); }); - editor.on('SetContent', function () { + function parseCodeMirrorInstances() { // Recover broken codemirror instances $('.CodeMirrorContainer').filter((index ,elem) => { @@ -225,18 +225,30 @@ function codePlugin() { return elem.contentEditable !== "false"; }); - if (!codeSamples.length) return; + codeSamples.each((index, elem) => { + Code.wysiwygView(elem); + }); + } + + editor.on('init', function() { + // Parse code mirror instances on init, but delay a little so this runs after + // initial styles are fetched into the editor. editor.undoManager.transact(function () { - codeSamples.each((index, elem) => { - Code.wysiwygView(elem); - }); + parseCodeMirrorInstances(); }); + // Parsed code mirror blocks when content is set but wait before setting this handler + // to avoid any init 'SetContent' events. + setTimeout(() => { + editor.on('SetContent', () => { + setTimeout(parseCodeMirrorInstances, 100); + }); + }, 200); }); }); } -function drawIoPlugin(drawioUrl, isDarkMode, pageId) { +function drawIoPlugin(drawioUrl, isDarkMode, pageId, wysiwygComponent) { let pageEditor = null; let currentNode = null; @@ -271,6 +283,15 @@ function drawIoPlugin(drawioUrl, isDarkMode, pageId) { const id = "image-" + Math.random().toString(16).slice(2); const loadingImage = window.baseUrl('/loading.gif'); + const handleUploadError = (error) => { + if (error.status === 413) { + window.$events.emit('error', wysiwygComponent.serverUploadLimitText); + } else { + window.$events.emit('error', wysiwygComponent.imageUploadErrorText); + } + console.log(error); + }; + // Handle updating an existing image if (currentNode) { DrawIO.close(); @@ -280,8 +301,7 @@ function drawIoPlugin(drawioUrl, isDarkMode, pageId) { pageEditor.dom.setAttrib(imgElem, 'src', img.url); pageEditor.dom.setAttrib(currentNode, 'drawio-diagram', img.id); } catch (err) { - window.$events.emit('error', trans('errors.image_upload_error')); - console.log(err); + handleUploadError(err); } return; } @@ -295,8 +315,7 @@ function drawIoPlugin(drawioUrl, isDarkMode, pageId) { pageEditor.dom.get(id).parentNode.setAttribute('drawio-diagram', img.id); } catch (err) { pageEditor.dom.remove(id); - window.$events.emit('error', trans('errors.image_upload_error')); - console.log(err); + handleUploadError(err); } }, 5); } @@ -401,6 +420,11 @@ function listenForBookStackEditorEvents(editor) { editor.setContent(content); }); + // Insert editor content at the current location + window.$events.listen('editor::insert', ({html}) => { + editor.insertContent(html); + }); + // Focus on the editor window.$events.listen('editor::focus', () => { editor.focus(); @@ -409,15 +433,16 @@ function listenForBookStackEditorEvents(editor) { class WysiwygEditor { - setup() { this.elem = this.$el; this.pageId = this.$opts.pageId; this.textDirection = this.$opts.textDirection; + this.imageUploadErrorText = this.$opts.imageUploadErrorText; + this.serverUploadLimitText = this.$opts.serverUploadLimitText; this.isDarkMode = document.documentElement.classList.contains('dark-mode'); - this.plugins = "image table textcolor paste link autolink fullscreen code customhr autosave lists codeeditor media"; + this.plugins = "image imagetools table textcolor paste link autolink fullscreen code customhr autosave lists codeeditor media"; this.loadPlugins(); this.tinyMceConfig = this.getTinyMceConfig(); @@ -432,7 +457,7 @@ class WysiwygEditor { const drawioUrlElem = document.querySelector('[drawio-url]'); if (drawioUrlElem) { const url = drawioUrlElem.getAttribute('drawio-url'); - drawIoPlugin(url, this.isDarkMode, this.pageId); + drawIoPlugin(url, this.isDarkMode, this.pageId, this); this.plugins += ' drawio'; }