diff --git a/addons/website/static/lib/summernote/src/js/EventHandler.js b/addons/website/static/lib/summernote/src/js/EventHandler.js index 481581ad5ac..faa6a7eadaf 100644 --- a/addons/website/static/lib/summernote/src/js/EventHandler.js +++ b/addons/website/static/lib/summernote/src/js/EventHandler.js @@ -296,13 +296,45 @@ define([ */ var hPasteClipboardImage = function (event) { var clipboardData = event.originalEvent.clipboardData; + var layoutInfo = makeLayoutInfo(event.currentTarget || event.target); + var $editable = layoutInfo.editable(); + if (!clipboardData || !clipboardData.items || !clipboardData.items.length) { + var callbacks = $editable.data('callbacks'); + // only can run if it has onImageUpload method + if (!callbacks.onImageUpload) { + return; + } + + // save cursor + editor.saveNode($editable); + editor.saveRange($editable); + + $editable.html(''); + + setTimeout(function () { + var $img = $editable.find('img'); + var datauri = $img[0].src; + + var data = atob(datauri.split(',')[1]); + var array = new Uint8Array(data.length); + for (var i = 0; i < data.length; i++) { + array[i] = data.charCodeAt(i); + } + + var blob = new Blob([array], { type : 'image/png'}); + blob.name = 'clipboard.png'; + + editor.restoreNode($editable); + editor.restoreRange($editable); + insertImages(layoutInfo, [blob]); + + editor.afterCommand($editable); + }, 0); + return; } - var layoutInfo = makeLayoutInfo(event.currentTarget || event.target), - $editable = layoutInfo.editable(); - var item = list.head(clipboardData.items); var isClipboardImage = item.kind === 'file' && item.type.indexOf('image/') !== -1; @@ -541,10 +573,13 @@ define([ event.preventDefault(); var dataTransfer = event.originalEvent.dataTransfer; - if (dataTransfer && dataTransfer.files) { - var layoutInfo = makeLayoutInfo(event.currentTarget || event.target); - layoutInfo.editable().focus(); + var text = dataTransfer.getData('text/plain'); + var layoutInfo = makeLayoutInfo(event.currentTarget || event.target); + layoutInfo.editable().focus(); + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { insertImages(layoutInfo, dataTransfer.files); + } else if (text) { + editor.insertText(layoutInfo.editable(), text); } }).on('dragover', false); // prevent default dragover event }; diff --git a/addons/website/static/lib/summernote/src/js/Renderer.js b/addons/website/static/lib/summernote/src/js/Renderer.js index 2f27901e875..5d42524fc25 100644 --- a/addons/website/static/lib/summernote/src/js/Renderer.js +++ b/addons/website/static/lib/summernote/src/js/Renderer.js @@ -460,10 +460,12 @@ define([ var body = []; for (var i in keys) { - body.push( - '
' + keys[i].kbd + '
' + - '
' + keys[i].text + '
' - ); + if (keys.hasOwnProperty(i)) { + body.push( + '
' + keys[i].kbd + '
' + + '
' + keys[i].text + '
' + ); + } } return '
' + title + '
' + diff --git a/addons/website/static/lib/summernote/src/js/editing/Editor.js b/addons/website/static/lib/summernote/src/js/editing/Editor.js index 8db8bd31a4b..c3a2d54f629 100644 --- a/addons/website/static/lib/summernote/src/js/editing/Editor.js +++ b/addons/website/static/lib/summernote/src/js/editing/Editor.js @@ -48,6 +48,15 @@ define([ } }; + this.saveNode = function ($editable) { + // copy child node reference + var copy = []; + for (var key = 0, len = $editable[0].childNodes.length; key < len; key++) { + copy.push($editable[0].childNodes[key]); + } + $editable.data('childNodes', copy); + }; + /** * restore lately range * @@ -61,6 +70,13 @@ define([ } }; + this.restoreNode = function ($editable) { + $editable.html(''); + var child = $editable.data('childNodes'); + for (var index = 0, len = child.length; index < len; index++) { + $editable[0].appendChild(child[index]); + } + }; /** * current style */ diff --git a/addons/website/static/lib/summernote/src/js/settings.js b/addons/website/static/lib/summernote/src/js/settings.js index 2c3c54d2391..25d1bdf809a 100644 --- a/addons/website/static/lib/summernote/src/js/settings.js +++ b/addons/website/static/lib/summernote/src/js/settings.js @@ -222,8 +222,8 @@ define('summernote/settings', function () { shapeCircle: 'Shape: Circle', shapeThumbnail: 'Shape: Thumbnail', shapeNone: 'Shape: None', - dragImageHere: 'Drag image here', - dropImage: 'Drop image', + dragImageHere: 'Drag image or text here', + dropImage: 'Drop image or Text', selectFromFiles: 'Select from files', maximumFileSize: 'Maximum file size', maximumFileSizeError: 'Maximum file size exceeded.', diff --git a/addons/website/static/lib/summernote/src/less/summernote.less b/addons/website/static/lib/summernote/src/less/summernote.less index f410bcd9e26..4a16ba4b273 100644 --- a/addons/website/static/lib/summernote/src/less/summernote.less +++ b/addons/website/static/lib/summernote/src/less/summernote.less @@ -297,6 +297,10 @@ &>div { display: none; /* BS2's hide pacth. */ } + .form-group { /* overwrite BS's form-horizontal minus margins */ + margin-left: 0; + margin-right: 0; + } .note-modal-form { margin: 0; /* overwrite BS2's form margin bottom */ }