X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/0c9c1e4c6b7aa38034c65a98a0499ae4fcd323b3..7f95b51b00d0d5fa1e7bcf5574f2d58bddcbd504:/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 764b0a929..39bce4959 100644 --- a/resources/assets/js/components/wysiwyg-editor.js +++ b/resources/assets/js/components/wysiwyg-editor.js @@ -1,5 +1,5 @@ -const Code = require('../services/code'); -const DrawIO = require('../services/drawio'); +import Code from "../services/code"; +import DrawIO from "../services/drawio"; /** * Handle pasting images from clipboard. @@ -308,7 +308,7 @@ function drawIoPlugin() { editor.addButton('drawio', { type: 'splitbutton', tooltip: 'Drawing', - image: window.baseUrl('/icon/drawing.svg?color=000000'), + image: `data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiMwMDAwMDAiICB4bWxucz0iaHR0cDovL3d3 dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0iTTIzIDdWMWgtNnYySDdWMUgxdjZoMnYx MEgxdjZoNnYtMmgxMHYyaDZ2LTZoLTJWN2gyek0zIDNoMnYySDNWM3ptMiAxOEgzdi0yaDJ2Mnpt MTItMkg3di0ySDVWN2gyVjVoMTB2MmgydjEwaC0ydjJ6bTQgMmgtMnYtMmgydjJ6TTE5IDVWM2gy djJoLTJ6bS01LjI3IDloLTMuNDlsLS43MyAySDcuODlsMy40LTloMS40bDMuNDEgOWgtMS42M2wt Ljc0LTJ6bS0zLjA0LTEuMjZoMi42MUwxMiA4LjkxbC0xLjMxIDMuODN6Ii8+CiAgICA8cGF0aCBk PSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+Cjwvc3ZnPg==`, cmd: 'drawio', menu: [ { @@ -370,6 +370,7 @@ class WysiwygEditor { constructor(elem) { this.elem = elem; + this.textDirection = document.getElementById('page-editor').getAttribute('text-direction'); this.plugins = "image table textcolor paste link autolink fullscreen imagetools code customhr autosave lists codeeditor media"; this.loadPlugins(); @@ -385,6 +386,14 @@ class WysiwygEditor { drawIoPlugin(); this.plugins += ' drawio'; } + if (this.textDirection === 'rtl') { + this.plugins += ' directionality' + } + } + + getToolBar() { + const textDirPlugins = this.textDirection === 'rtl' ? 'ltr rtl' : ''; + return `undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr drawio media | removeformat code ${textDirPlugins} fullscreen` } getTinyMceConfig() { @@ -397,8 +406,10 @@ class WysiwygEditor { body_class: 'page-content', browser_spellcheck: true, relative_urls: false, + directionality : this.textDirection, remove_script_host: false, document_base_url: window.baseUrl('/'), + end_container_on_empty_block: true, statusbar: false, menubar: false, paste_data_images: false, @@ -407,7 +418,7 @@ class WysiwygEditor { valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote],+div[pre],+div[img]", plugins: this.plugins, imagetools_toolbar: 'imageoptions', - toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr drawio media | removeformat code fullscreen", + toolbar: this.getToolBar(), content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}", style_formats: [ {title: "Header Large", format: "h2"}, @@ -483,13 +494,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); @@ -547,7 +581,7 @@ class WysiwygEditor { html += `${image.name}`; html += ''; editor.execCommand('mceInsertContent', false, html); - }); + }, 'gallery'); } }); @@ -559,4 +593,4 @@ class WysiwygEditor { } -module.exports = WysiwygEditor; +export default WysiwygEditor;