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 = `
![](${resp.data.url})
`;
+ 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 = `![](${resp.data.url + `?updated=${Date.now()}`})
`;
+ 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 @@