|
|
@ -1,6 +1,7 @@ |
|
|
|
'use strict' |
|
|
|
|
|
|
|
import SimpleMDE from 'simplemde' |
|
|
|
/* global FuseBox */ |
|
|
|
|
|
|
|
import filesize from 'filesize.js' |
|
|
|
import $ from 'jquery' |
|
|
|
|
|
|
@ -45,180 +46,186 @@ export default { |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
let self = this |
|
|
|
mde = new SimpleMDE({ |
|
|
|
autofocus: true, |
|
|
|
autoDownloadFontAwesome: false, |
|
|
|
element: this.$refs.editorTextArea, |
|
|
|
placeholder: 'Enter Markdown formatted content here...', |
|
|
|
spellChecker: false, |
|
|
|
status: false, |
|
|
|
toolbar: [ |
|
|
|
{ |
|
|
|
name: 'bold', |
|
|
|
action: SimpleMDE.toggleBold, |
|
|
|
className: 'icon-bold', |
|
|
|
title: 'Bold' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'italic', |
|
|
|
action: SimpleMDE.toggleItalic, |
|
|
|
className: 'icon-italic', |
|
|
|
title: 'Italic' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'strikethrough', |
|
|
|
action: SimpleMDE.toggleStrikethrough, |
|
|
|
className: 'icon-strikethrough', |
|
|
|
title: 'Strikethrough' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'heading-1', |
|
|
|
action: SimpleMDE.toggleHeading1, |
|
|
|
className: 'icon-header fa-header-x fa-header-1', |
|
|
|
title: 'Big Heading' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'heading-2', |
|
|
|
action: SimpleMDE.toggleHeading2, |
|
|
|
className: 'icon-header fa-header-x fa-header-2', |
|
|
|
title: 'Medium Heading' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'heading-3', |
|
|
|
action: SimpleMDE.toggleHeading3, |
|
|
|
className: 'icon-header fa-header-x fa-header-3', |
|
|
|
title: 'Small Heading' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'quote', |
|
|
|
action: SimpleMDE.toggleBlockquote, |
|
|
|
className: 'icon-quote-left', |
|
|
|
title: 'Quote' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'unordered-list', |
|
|
|
action: SimpleMDE.toggleUnorderedList, |
|
|
|
className: 'icon-th-list', |
|
|
|
title: 'Bullet List' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'ordered-list', |
|
|
|
action: SimpleMDE.toggleOrderedList, |
|
|
|
className: 'icon-list-ol', |
|
|
|
title: 'Numbered List' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'link', |
|
|
|
action: (editor) => { |
|
|
|
/* if(!mdeModalOpenState) { |
|
|
|
mdeModalOpenState = true; |
|
|
|
$('#modal-editor-link').slideToggle(); |
|
|
|
} */ |
|
|
|
window.alert('Coming soon!') |
|
|
|
}, |
|
|
|
className: 'icon-link2', |
|
|
|
title: 'Insert Link' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'image', |
|
|
|
action: (editor) => { |
|
|
|
if (!mdeModalOpenState) { |
|
|
|
vueImage.open() |
|
|
|
} |
|
|
|
}, |
|
|
|
className: 'icon-image', |
|
|
|
title: 'Insert Image' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'file', |
|
|
|
action: (editor) => { |
|
|
|
if (!mdeModalOpenState) { |
|
|
|
vueFile.open() |
|
|
|
} |
|
|
|
}, |
|
|
|
className: 'icon-paper', |
|
|
|
title: 'Insert File' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'video', |
|
|
|
action: (editor) => { |
|
|
|
if (!mdeModalOpenState) { |
|
|
|
vueVideo.open() |
|
|
|
} |
|
|
|
}, |
|
|
|
className: 'icon-video-camera2', |
|
|
|
title: 'Insert Video Player' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'inline-code', |
|
|
|
action: (editor) => { |
|
|
|
if (!editor.codemirror.doc.somethingSelected()) { |
|
|
|
return alerts.pushError('Invalid selection', 'You must select at least 1 character first.') |
|
|
|
} |
|
|
|
let curSel = editor.codemirror.doc.getSelections() |
|
|
|
curSel = _.map(curSel, (s) => { |
|
|
|
return '`' + s + '`' |
|
|
|
}) |
|
|
|
editor.codemirror.doc.replaceSelections(curSel) |
|
|
|
}, |
|
|
|
className: 'icon-terminal', |
|
|
|
title: 'Inline Code' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'code-block', |
|
|
|
action: (editor) => { |
|
|
|
if (!mdeModalOpenState) { |
|
|
|
if (mde.codemirror.doc.somethingSelected()) { |
|
|
|
vueCodeBlock.initContent = mde.codemirror.doc.getSelection() |
|
|
|
FuseBox.import('/js/simplemde/simplemde.min.js', (SimpleMDE) => { |
|
|
|
mde = new SimpleMDE({ |
|
|
|
autofocus: true, |
|
|
|
autoDownloadFontAwesome: false, |
|
|
|
element: this.$refs.editorTextArea, |
|
|
|
placeholder: 'Enter Markdown formatted content here...', |
|
|
|
spellChecker: false, |
|
|
|
status: false, |
|
|
|
toolbar: [ |
|
|
|
{ |
|
|
|
name: 'bold', |
|
|
|
action: SimpleMDE.toggleBold, |
|
|
|
className: 'icon-bold', |
|
|
|
title: 'Bold' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'italic', |
|
|
|
action: SimpleMDE.toggleItalic, |
|
|
|
className: 'icon-italic', |
|
|
|
title: 'Italic' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'strikethrough', |
|
|
|
action: SimpleMDE.toggleStrikethrough, |
|
|
|
className: 'icon-strikethrough', |
|
|
|
title: 'Strikethrough' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'heading-1', |
|
|
|
action: SimpleMDE.toggleHeading1, |
|
|
|
className: 'icon-header fa-header-x fa-header-1', |
|
|
|
title: 'Big Heading' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'heading-2', |
|
|
|
action: SimpleMDE.toggleHeading2, |
|
|
|
className: 'icon-header fa-header-x fa-header-2', |
|
|
|
title: 'Medium Heading' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'heading-3', |
|
|
|
action: SimpleMDE.toggleHeading3, |
|
|
|
className: 'icon-header fa-header-x fa-header-3', |
|
|
|
title: 'Small Heading' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'quote', |
|
|
|
action: SimpleMDE.toggleBlockquote, |
|
|
|
className: 'icon-quote-left', |
|
|
|
title: 'Quote' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'unordered-list', |
|
|
|
action: SimpleMDE.toggleUnorderedList, |
|
|
|
className: 'icon-th-list', |
|
|
|
title: 'Bullet List' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'ordered-list', |
|
|
|
action: SimpleMDE.toggleOrderedList, |
|
|
|
className: 'icon-list-ol', |
|
|
|
title: 'Numbered List' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'link', |
|
|
|
action: (editor) => { |
|
|
|
/* if(!mdeModalOpenState) { |
|
|
|
mdeModalOpenState = true; |
|
|
|
$('#modal-editor-link').slideToggle(); |
|
|
|
} */ |
|
|
|
window.alert('Coming soon!') |
|
|
|
}, |
|
|
|
className: 'icon-link2', |
|
|
|
title: 'Insert Link' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'image', |
|
|
|
action: (editor) => { |
|
|
|
// if (!mdeModalOpenState) {
|
|
|
|
// vueImage.open()
|
|
|
|
// }
|
|
|
|
}, |
|
|
|
className: 'icon-image', |
|
|
|
title: 'Insert Image' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'file', |
|
|
|
action: (editor) => { |
|
|
|
// if (!mdeModalOpenState) {
|
|
|
|
// vueFile.open()
|
|
|
|
// }
|
|
|
|
}, |
|
|
|
className: 'icon-paper', |
|
|
|
title: 'Insert File' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'video', |
|
|
|
action: (editor) => { |
|
|
|
// if (!mdeModalOpenState) {
|
|
|
|
// vueVideo.open()
|
|
|
|
// }
|
|
|
|
}, |
|
|
|
className: 'icon-video-camera2', |
|
|
|
title: 'Insert Video Player' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'inline-code', |
|
|
|
action: (editor) => { |
|
|
|
if (!editor.codemirror.doc.somethingSelected()) { |
|
|
|
return self.$store.dispatch('alert', { |
|
|
|
style: 'orange', |
|
|
|
icon: 'marquee', |
|
|
|
msg: 'Invalid selection. Select at least 1 character.' |
|
|
|
}) |
|
|
|
} |
|
|
|
let curSel = editor.codemirror.doc.getSelections() |
|
|
|
curSel = self._.map(curSel, (s) => { |
|
|
|
return '`' + s + '`' |
|
|
|
}) |
|
|
|
editor.codemirror.doc.replaceSelections(curSel) |
|
|
|
}, |
|
|
|
className: 'icon-terminal', |
|
|
|
title: 'Inline Code' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'code-block', |
|
|
|
action: (editor) => { |
|
|
|
// if (!mdeModalOpenState) {
|
|
|
|
// if (mde.codemirror.doc.somethingSelected()) {
|
|
|
|
// vueCodeBlock.initContent = mde.codemirror.doc.getSelection()
|
|
|
|
// }
|
|
|
|
|
|
|
|
vueCodeBlock.open() |
|
|
|
} |
|
|
|
}, |
|
|
|
className: 'icon-code', |
|
|
|
title: 'Code Block' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'table', |
|
|
|
action: (editor) => { |
|
|
|
window.alert('Coming soon!') |
|
|
|
// todo
|
|
|
|
}, |
|
|
|
className: 'icon-table', |
|
|
|
title: 'Insert Table' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'horizontal-rule', |
|
|
|
action: SimpleMDE.drawHorizontalRule, |
|
|
|
className: 'icon-minus2', |
|
|
|
title: 'Horizontal Rule' |
|
|
|
// vueCodeBlock.open()
|
|
|
|
// }
|
|
|
|
}, |
|
|
|
className: 'icon-code', |
|
|
|
title: 'Code Block' |
|
|
|
}, |
|
|
|
'|', |
|
|
|
{ |
|
|
|
name: 'table', |
|
|
|
action: (editor) => { |
|
|
|
window.alert('Coming soon!') |
|
|
|
// todo
|
|
|
|
}, |
|
|
|
className: 'icon-table', |
|
|
|
title: 'Insert Table' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'horizontal-rule', |
|
|
|
action: SimpleMDE.drawHorizontalRule, |
|
|
|
className: 'icon-minus2', |
|
|
|
title: 'Horizontal Rule' |
|
|
|
} |
|
|
|
], |
|
|
|
shortcuts: { |
|
|
|
'toggleBlockquote': null, |
|
|
|
'toggleFullScreen': null |
|
|
|
} |
|
|
|
], |
|
|
|
shortcuts: { |
|
|
|
'toggleBlockquote': null, |
|
|
|
'toggleFullScreen': null |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
// Save
|
|
|
|
// Save
|
|
|
|
|
|
|
|
this.$root.$on('editor-save', this.save) |
|
|
|
$(window).bind('keydown', (ev) => { |
|
|
|
if (ev.ctrlKey || ev.metaKey) { |
|
|
|
switch (String.fromCharCode(ev.which).toLowerCase()) { |
|
|
|
case 's': |
|
|
|
ev.preventDefault() |
|
|
|
self.save() |
|
|
|
break |
|
|
|
this.$root.$on('editor-save', this.save) |
|
|
|
$(window).bind('keydown', (ev) => { |
|
|
|
if (ev.ctrlKey || ev.metaKey) { |
|
|
|
switch (String.fromCharCode(ev.which).toLowerCase()) { |
|
|
|
case 's': |
|
|
|
ev.preventDefault() |
|
|
|
self.save() |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
this.$store.dispatch('pageLoader/complete') |
|
|
|
this.$store.dispatch('pageLoader/complete') |
|
|
|
}) |
|
|
|
} |
|
|
|
} |