From efb49019d484f2455897d2249e16ccd0b2ad5e88 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Tue, 29 Mar 2016 18:25:54 +0100 Subject: [PATCH] Integrated the markdown editor with the image manager --- resources/assets/js/directives.js | 50 ++++++++++++++++++++++++++-- resources/assets/sass/_forms.scss | 44 ++++++++++++------------ resources/views/pages/form.blade.php | 18 ++++++++-- 3 files changed, 83 insertions(+), 29 deletions(-) diff --git a/resources/assets/js/directives.js b/resources/assets/js/directives.js index 316e5dcb4..de87950dc 100644 --- a/resources/assets/js/directives.js +++ b/resources/assets/js/directives.js @@ -1,6 +1,6 @@ "use strict"; var DropZone = require('dropzone'); -var markdown = require( "marked" ); +var markdown = require('marked'); var toggleSwitchTemplate = require('./components/toggle-switch.html'); var imagePickerTemplate = require('./components/image-picker.html'); @@ -201,9 +201,9 @@ module.exports = function (ngApp, events) { tinymce.init(scope.tinymce); } } - }]) + }]); - ngApp.directive('markdownEditor', ['$timeout', function($timeout) { + ngApp.directive('markdownInput', ['$timeout', function($timeout) { return { restrict: 'A', scope: { @@ -231,6 +231,50 @@ module.exports = function (ngApp, events) { scope.mdChange(markdown(value)); }); + } + } + }]); + + ngApp.directive('markdownEditor', ['$timeout', function($timeout) { + return { + restrict: 'A', + link: function (scope, element, attrs) { + + // Elements + var input = element.find('textarea[markdown-input]'); + var insertImage = element.find('button[data-action="insertImage"]'); + + var currentCaretPos = 0; + + input.blur((event) => { + currentCaretPos = input[0].selectionStart; + }); + + // Insert image shortcut + input.keydown((event) => { + if (event.which === 73 && event.ctrlKey && event.shiftKey) { + event.preventDefault(); + var caretPos = input[0].selectionStart; + var currentContent = input.val(); + var mdImageText = "![](http://)"; + input.val(currentContent.substring(0, caretPos) + mdImageText + currentContent.substring(caretPos)); + input.focus(); + input[0].selectionStart = caretPos + ("![](".length); + input[0].selectionEnd = caretPos + ('![](http://'.length); + } + }); + + // Insert image from image manager + insertImage.click((event) => { + window.ImageManager.showExternal((image) => { + var caretPos = currentCaretPos; + var currentContent = input.val(); + var mdImageText = "![" + image.name + "](" + image.url + ")"; + input.val(currentContent.substring(0, caretPos) + mdImageText + currentContent.substring(caretPos)); + input.change(); + }); + }); + } } }]) diff --git a/resources/assets/sass/_forms.scss b/resources/assets/sass/_forms.scss index 5351f06e7..4da0c39ad 100644 --- a/resources/assets/sass/_forms.scss +++ b/resources/assets/sass/_forms.scss @@ -39,44 +39,42 @@ max-height: 100%; flex: 1; border: 0; + width: 100%; &:focus { outline: 0; } } .markdown-display, .markdown-editor-wrap { flex: 1; - padding-top: 28px; position: relative; - border: 1px solid #DDD; - &:before { - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - padding: $-xs $-m; - font-family: 'Roboto Mono'; - font-size: 11px; - line-height: 1; - border-bottom: 1px solid #DDD; - background-color: #EEE; - } } .markdown-editor-wrap { display: flex; - &:before { - content: 'Editor'; - } + flex-direction: column; + border: 1px solid #DDD; } .markdown-display { - padding: 0 $-m; - padding-top: 28px; + padding: 0 $-m 0; margin-left: -1px; - &:before { - content: 'Preview'; - } + overflow-y: scroll; } } +.editor-toolbar { + width: 100%; + padding: $-xs $-m; + font-family: 'Roboto Mono'; + font-size: 11px; + line-height: 1.6; + border-bottom: 1px solid #DDD; + background-color: #EEE; + flex: none; + &:after { + content: ''; + display: block; + clear: both; + } +} + label { display: block; diff --git a/resources/views/pages/form.blade.php b/resources/views/pages/form.blade.php index 2118d23b2..6b16cb870 100644 --- a/resources/views/pages/form.blade.php +++ b/resources/views/pages/form.blade.php @@ -51,14 +51,26 @@ @endif @if(config('app.editor') === 'markdown') -
+
-
-
+
+
+
Preview
+
+
+
+