X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/3286f29a61833327b5701b28db626d0a480b07f9..d6456e961afde217e045140fdf8cf88921897536:/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 c70d82719..c03c0d2aa 100644 --- a/resources/assets/js/components/wysiwyg-editor.js +++ b/resources/assets/js/components/wysiwyg-editor.js @@ -4,22 +4,33 @@ import DrawIO from "../services/drawio"; /** * Handle pasting images from clipboard. * @param {ClipboardEvent} event + * @param {WysiwygEditor} wysiwygComponent * @param editor */ -function editorPaste(event, editor) { - if (!event.clipboardData || !event.clipboardData.items) return; - let items = event.clipboardData.items; +function editorPaste(event, editor, wysiwygComponent) { + const clipboardItems = event.clipboardData.items; + if (!event.clipboardData || !clipboardItems) return; - for (let i = 0; i < items.length; i++) { - if (items[i].type.indexOf("image") === -1) continue; - event.preventDefault(); + // Don't handle if clipboard includes text content + for (let clipboardItem of clipboardItems) { + if (clipboardItem.type.includes('text/')) { + return; + } + } + + for (let clipboardItem of clipboardItems) { + if (!clipboardItem.type.includes("image")) { + continue; + } + + const id = "image-" + Math.random().toString(16).slice(2); + const loadingImage = window.baseUrl('/loading.gif'); + const file = clipboardItem.getAsFile(); - let id = "image-" + Math.random().toString(16).slice(2); - let loadingImage = window.baseUrl('/loading.gif'); - let file = items[i].getAsFile(); setTimeout(() => { editor.insertContent(`
').each((index, elem) => {
- // Needs to be textContent since innerText produces BR:s
- elem.textContent = code;
- }).attr('class', `language-${lang}`));
- $codeMirrorContainer.replaceWith($pre);
+ function codeMirrorContainerToPre(codeMirrorContainer) {
+ const textArea = codeMirrorContainer.querySelector('textarea');
+ const code = textArea.textContent;
+ const lang = codeMirrorContainer.getAttribute('data-lang');
+
+ codeMirrorContainer.removeAttribute('contentEditable');
+ const pre = document.createElement('pre');
+ const codeElem = document.createElement('code');
+ codeElem.classList.add(`language-${lang}`);
+ codeElem.textContent = code;
+ pre.appendChild(codeElem);
+
+ codeMirrorContainer.parentElement.replaceChild(pre, codeMirrorContainer);
}
window.tinymce.PluginManager.add('codeeditor', function(editor, url) {
- let $ = editor.$;
+ const $ = editor.$;
editor.addButton('codeeditor', {
text: 'Code block',
@@ -182,10 +199,8 @@ function codePlugin() {
// Convert
editor.on('PreProcess', function (e) {
- $('div.CodeMirrorContainer', e.node).
- each((index, elem) => {
- let $elem = $(elem);
- codeMirrorContainerToPre($elem);
+ $('div.CodeMirrorContainer', e.node).each((index, elem) => {
+ codeMirrorContainerToPre(elem);
});
});
@@ -201,10 +216,10 @@ function codePlugin() {
$('.CodeMirrorContainer').filter((index ,elem) => {
return typeof elem.querySelector('.CodeMirror').CodeMirror === 'undefined';
}).each((index, elem) => {
- codeMirrorContainerToPre($(elem));
+ codeMirrorContainerToPre(elem);
});
- let codeSamples = $('body > pre').filter((index, elem) => {
+ const codeSamples = $('body > pre').filter((index, elem) => {
return elem.contentEditable !== "false";
});
@@ -250,39 +265,38 @@ function drawIoPlugin() {
DrawIO.show(drawingInit, updateContent);
}
- function updateContent(pngData) {
- let id = "image-" + Math.random().toString(16).slice(2);
- let loadingImage = window.baseUrl('/loading.gif');
- let data = {
- image: pngData,
- uploaded_to: Number(document.getElementById('page-editor').getAttribute('page-id'))
- };
+ async function updateContent(pngData) {
+ const id = "image-" + Math.random().toString(16).slice(2);
+ const loadingImage = window.baseUrl('/loading.gif');
+ const pageId = Number(document.getElementById('page-editor').getAttribute('page-id'));
// Handle updating an existing image
if (currentNode) {
DrawIO.close();
let imgElem = currentNode.querySelector('img');
- 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 => {
+ try {
+ const img = await DrawIO.upload(pngData, 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);
- });
+ }
return;
}
- setTimeout(() => {
+ setTimeout(async () => {
pageEditor.insertContent(`