diff --git a/resources/assets/js/components/markdown-editor.js b/resources/assets/js/components/markdown-editor.js index cd0156e9b..3393829cc 100644 --- a/resources/assets/js/components/markdown-editor.js +++ b/resources/assets/js/components/markdown-editor.js @@ -2,6 +2,8 @@ const MarkdownIt = require("markdown-it"); const mdTasksLists = require('markdown-it-task-lists'); const code = require('../libs/code'); +const DrawIO = require('../libs/drawio'); + class MarkdownEditor { constructor(elem) { @@ -20,13 +22,26 @@ class MarkdownEditor { init() { + let lastClick = 0; + // Prevent markdown display link click redirect this.display.addEventListener('click', event => { - let link = event.target.closest('a'); - if (link === null) return; + let isDblClick = Date.now() - lastClick < 300; - event.preventDefault(); - window.open(link.getAttribute('href')); + let link = event.target.closest('a'); + if (link !== null) { + event.preventDefault(); + window.open(link.getAttribute('href')); + return; + } + + let drawing = event.target.closest('[drawio-diagram]'); + if (drawing !== null && isDblClick) { + this.actionEditDrawing(drawing); + return; + } + + lastClick = Date.now(); }); // Button actions @@ -37,6 +52,7 @@ class MarkdownEditor { let action = button.getAttribute('data-action'); if (action === 'insertImage') this.actionInsertImage(); if (action === 'insertLink') this.actionShowLinkSelector(); + if (action === 'insertDrawing') this.actionStartDrawing(); }); window.$events.listen('editor-markdown-update', value => { @@ -290,6 +306,70 @@ class MarkdownEditor { }); } + // Show draw.io if enabled and handle save. + actionStartDrawing() { + if (document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') !== 'true') return; + let cursorPos = this.cm.getCursor('from'); + + DrawIO.show(() => { + return Promise.resolve(''); + }, (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')) + }; + + window.$http.post(window.baseUrl('/images/drawing/upload'), data).then(resp => { + let newText = `
`; + this.cm.focus(); + this.cm.replaceSelection(newText); + this.cm.setCursor(cursorPos.line, cursorPos.ch + newText.length); + DrawIO.close(); + }).catch(err => { + window.$events.emit('error', trans('errors.image_upload_error')); + console.log(err); + }); + }); + } + + // Show draw.io if enabled and handle save. + actionEditDrawing(imgContainer) { + if (document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') !== 'true') return; + let cursorPos = this.cm.getCursor('from'); + let drawingId = imgContainer.getAttribute('drawio-diagram'); + + DrawIO.show(() => { + return window.$http.get(window.baseUrl(`/images/base64/${drawingId}`)).then(resp => { + return `data:image/png;base64,${resp.data.content}`; + }); + }, (pngData) => { + + let data = { + image: pngData, + uploaded_to: Number(document.getElementById('page-editor').getAttribute('page-id')) + }; + + window.$http.put(window.baseUrl(`/images/drawing/upload/${drawingId}`), data).then(resp => { + let newText = ``; + let newContent = this.cm.getValue().split('\n').map(line => { + if (line.indexOf(`drawio-diagram="${drawingId}"`) !== -1) { + return newText; + } + return line; + }).join('\n'); + this.cm.setValue(newContent); + this.cm.setCursor(cursorPos); + this.cm.focus(); + DrawIO.close(); + }).catch(err => { + window.$events.emit('error', trans('errors.image_upload_error')); + console.log(err); + }); + }); + } + } module.exports = MarkdownEditor ; \ No newline at end of file diff --git a/resources/assets/js/libs/drawio.js b/resources/assets/js/libs/drawio.js index a44c12c44..beb6f0d59 100644 --- a/resources/assets/js/libs/drawio.js +++ b/resources/assets/js/libs/drawio.js @@ -9,7 +9,7 @@ let onInit, onSave; * @param onInitCallback - Must return a promise with the xml to load for the editor. * @param onSaveCallback - Is called with the drawing data on save. */ -export function show(onInitCallback, onSaveCallback) { +function show(onInitCallback, onSaveCallback) { onInit = onInitCallback; onSave = onSaveCallback; @@ -19,9 +19,10 @@ export function show(onInitCallback, onSaveCallback) { iFrame.setAttribute('src', drawIoUrl); iFrame.setAttribute('class', 'fullscreen'); iFrame.style.backgroundColor = '#FFFFFF'; + document.body.appendChild(iFrame); } -export function close() { +function close() { drawEventClose(); } @@ -52,7 +53,7 @@ function drawEventSave(message) { function drawEventInit() { if (!onInit) return; onInit().then(xml => { - drawPostMessage({action: 'load', autosave: 1, xml: ''}); + drawPostMessage({action: 'load', autosave: 1, xml: xml}); }); } @@ -63,4 +64,6 @@ function drawEventClose() { function drawPostMessage(data) { iFrame.contentWindow.postMessage(JSON.stringify(data), '*'); -} \ No newline at end of file +} + +module.exports = {show, close}; \ No newline at end of file diff --git a/resources/assets/sass/_forms.scss b/resources/assets/sass/_forms.scss index 457d30e54..97620ff3f 100644 --- a/resources/assets/sass/_forms.scss +++ b/resources/assets/sass/_forms.scss @@ -59,16 +59,21 @@ border: 1px solid #DDD; width: 50%; } - .markdown-display { - padding: 0 $-m 0; - margin-left: -1px; - overflow-y: scroll; - } - .markdown-display.page-content { +} + +.markdown-display { + padding: 0 $-m 0; + margin-left: -1px; + overflow-y: scroll; + &.page-content { margin: 0 auto; max-width: 100%; } + [drawio-diagram]:hover { + outline: 2px solid $primary; + } } + .editor-toolbar { width: 100%; padding: $-xs $-m; diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index 4dc5ccc38..6c5dd9f77 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -162,6 +162,7 @@ return [ 'pages_md_preview' => 'Preview', 'pages_md_insert_image' => 'Insert Image', 'pages_md_insert_link' => 'Insert Entity Link', + 'pages_md_insert_drawing' => 'Insert Drawing', 'pages_not_in_chapter' => 'Page is not in a chapter', 'pages_move' => 'Move Page', 'pages_move_success' => 'Page moved to ":parentName"', diff --git a/resources/views/pages/form.blade.php b/resources/views/pages/form.blade.php index 936f49790..53861527b 100644 --- a/resources/views/pages/form.blade.php +++ b/resources/views/pages/form.blade.php @@ -86,6 +86,10 @@