diff options
| author | Nicolas Lempereur <nle@odoo.com> | 2015-08-28 17:22:17 +0200 |
|---|---|---|
| committer | Nicolas Lempereur <nle@odoo.com> | 2015-09-29 14:47:24 +0200 |
| commit | d33086c03fc1a0882be38ae62989b7f72df20d3b (patch) | |
| tree | 20b5776f6902916f4c67d9d356e9db2a107eb952 /addons/web_editor/static/src/js/summernote.js | |
| parent | e9ac1bff8bcef56ae09bbba3910202075f7eb89a (diff) | |
[IMP] web_editor: update summernote up to 2015-08-31
update summernote library up to revision:
https://github.com/summernote/summernote/commit/a0f26e300
see https://github.com/summernote/summernote/ for history
closes #8704
Diffstat (limited to 'addons/web_editor/static/src/js/summernote.js')
| -rw-r--r-- | addons/web_editor/static/src/js/summernote.js | 101 |
1 files changed, 85 insertions, 16 deletions
diff --git a/addons/web_editor/static/src/js/summernote.js b/addons/web_editor/static/src/js/summernote.js index 59186188881..280a91cd1fd 100644 --- a/addons/web_editor/static/src/js/summernote.js +++ b/addons/web_editor/static/src/js/summernote.js @@ -554,7 +554,7 @@ dom.removeBetween = function (sc, so, ec, eo, towrite) { var node = dom.node(sc); - if (!dom.isNotBreakable(node)) { + if (!dom.isNotBreakable(node) && !dom.isVoid(sc)) { sc = dom.splitTree(ancestor_sc, {'node': sc, 'offset': so}); } var before = dom.hasContentBefore(dom.ancestorHavePreviousSibling(sc)); @@ -586,7 +586,9 @@ dom.removeBetween = function (sc, so, ec, eo, towrite) { so = 0; } - if (towrite && !node.firstChild && node.parentNode && !dom.isNotBreakable(node)) { + if (dom.isVoid(node)) { + // we don't need to append a br + } else if (towrite && !node.firstChild && node.parentNode && !dom.isNotBreakable(node)) { var br = $("<br/>")[0]; node.appendChild(sc); sc = br; @@ -892,6 +894,47 @@ range.WrappedRange.prototype.deleteContents = function (towrite) { prevBP.eo ); }; +// isOnImg: judge whether range is an image node or not +range.WrappedRange.prototype.isOnImg = function () { + var nb = 0; + var image; + var startPoint = {node: this.sc.childNodes.length && this.sc.childNodes[this.so] || this.sc}; + startPoint.offset = startPoint.node === this.sc ? this.so : 0; + var endPoint = {node: this.ec.childNodes.length && this.ec.childNodes[this.eo] || this.ec}; + endPoint.offset = endPoint.node === this.ec ? this.eo : 0; + + if (dom.isImg(startPoint.node)) { + nb ++; + image = startPoint.node; + } + dom.walkPoint(startPoint, endPoint, function (point) { + if (!dom.isText(endPoint.node) && point.node === endPoint.node && point.offset === endPoint.offset) { + return; + } + var node = point.node.childNodes.length && point.node.childNodes[point.offset] || point.node; + var offset = node === point.node ? point.offset : 0; + var isImg = dom.ancestor(node, dom.isImg); + if (!isImg && ((!dom.isBR(node) && !dom.isText(node)) || (offset && node.textContent.length !== offset && node.textContent.match(/\S|\u00A0/)))) { + nb++; + } + if (isImg && image !== isImg) { + image = isImg; + nb ++; + } + }); + return nb === 1 && image; +}; +range.WrappedRange.prototype.deleteContents = function (towrite) { + var prevBP = dom.removeBetween(this.sc, this.so, this.ec, this.eo, towrite); + + $(dom.node(prevBP.sc)).trigger("click"); // trigger click to disable and reanable editor and image handler + return new range.WrappedRange( + prevBP.sc, + prevBP.so, + prevBP.ec, + prevBP.eo + ); +}; range.WrappedRange.prototype.clean = function (mergeFilter, all) { var node = dom.node(this.sc === this.ec ? this.sc : this.commonAncestor()); node = node || $(this.sc).closest('[contenteditable]')[0]; @@ -1142,7 +1185,7 @@ $.summernote.pluginEvents.visible = function (event, editor, layoutInfo) { } // don't write in forbidden tag (like span for font awsome) - var node = dom.firstChild(r.sc.tagName && r.so ? r.sc.childNodes[r.so] : r.sc); + var node = dom.firstChild(r.sc.tagName && r.so ? r.sc.childNodes[r.so] || r.sc : r.sc); while (node.parentNode) { if (dom.isForbiddenNode(node)) { var text = node.previousSibling; @@ -1292,7 +1335,12 @@ $.summernote.pluginEvents.delete = function (event, editor, layoutInfo) { dom.autoMerge(target, false); var next = dom.firstChild(dom.hasContentAfter(dom.ancestorHaveNextSibling(target))); if (dom.isBR(next)) { - range.create(next.previousSibling, next.previousSibling.textContent.length).select(); + if(dom.position(next) == 0) { + range.create(next.parentNode, 0).select(); + } + else { + range.create(next.previousSibling, next.previousSibling.textContent.length).select(); + } next.parentNode.removeChild(next); } else { range.create(next, 0).select(); @@ -1383,10 +1431,16 @@ $.summernote.pluginEvents.backspace = function (event, editor, layoutInfo) { var prevTr = dom.previousElementSibling(tr); if (!$(temp.parentNode).text().match(/\S|\u00A0/)) { if (prevTr) { - tr.parentNode.removeChild(tr); node = (dom.lastElementChild(prevTr).lastChild && dom.lastElementChild(prevTr).lastChild.tagName ? dom.lastElementChild(prevTr).lastChild.previousSibling : dom.lastElementChild(prevTr).lastChild) || dom.lastElementChild(prevTr); - range.create(node, node.textContent.length, node, node.textContent.length).select(); + } else { + node = dom.lastChild(dom.hasContentBefore(dom.ancestorHavePreviousSibling(tr))); + } + $(tr).empty(); + if(!$(tr).closest('table').has('td, th').length) { + $(tr).closest('table').remove(); } + $(tr).remove(); + range.create(node, node.textContent.length, node, node.textContent.length).select(); } else { node = dom.lastElementChild(prevTr).lastChild || dom.lastElementChild(prevTr); } @@ -1793,8 +1847,8 @@ $.summernote.pluginEvents.removeFormat = function (event, editor, layoutInfo, va event.preventDefault(); return false; }; -var fn_boutton_updateRecentColor = eventHandler.toolbar.button.updateRecentColor; -eventHandler.toolbar.button.updateRecentColor = function (elBtn, sEvent, sValue) { +var fn_boutton_updateRecentColor = eventHandler.modules.toolbar.button.updateRecentColor; +eventHandler.modules.toolbar.button.updateRecentColor = function (elBtn, sEvent, sValue) { fn_boutton_updateRecentColor.call(this, elBtn, sEvent, sValue); var font = $(elBtn).closest('.note-color').find('.note-recent-color i')[0]; @@ -1827,16 +1881,31 @@ $(document).on('click keyup', function () { $('button[data-event="redo"]', editor).attr('disabled', !popover_history.hasRedo()); }); -eventHandler.editor.undo = function ($popover) { +eventHandler.modules.editor.undo = function ($popover) { if(!$popover.attr('disabled')) $popover.data('NoteHistory').undo(); }; -eventHandler.editor.redo = function ($popover) { +eventHandler.modules.editor.redo = function ($popover) { if(!$popover.attr('disabled')) $popover.data('NoteHistory').redo(); }; +// use image toolbar if current range is on image +var fn_editor_currentstyle = eventHandler.modules.editor.currentStyle; +eventHandler.modules.editor.currentStyle = function(target) { + var styleInfo = fn_editor_currentstyle.apply(this, arguments); + // with our changes for inline editor, the targeted element could be a button of the editor + if(!styleInfo.image || !dom.isEditable(styleInfo.image)) { + styleInfo.image = undefined; + var rng = range.create(); + if(rng) + styleInfo.image = rng.isOnImg(); + } + return styleInfo; +} + options.fontSizes = [_t('Default'), 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 62]; $.summernote.pluginEvents.applyFont = function (event, editor, layoutInfo, color, bgcolor, size) { var rng = range.create(); + if(!rng) return; var startPoint = rng.getStartPoint(); var endPoint = rng.getEndPoint(); @@ -2208,8 +2277,8 @@ function summernote_table_update (oStyle) { 'color': '#00ff00' }); } -var fn_popover_update = eventHandler.popover.update; -eventHandler.popover.update = function ($popover, oStyle, isAirMode) { +var fn_popover_update = eventHandler.modules.popover.update; +eventHandler.modules.popover.update = function ($popover, oStyle, isAirMode) { fn_popover_update.call(this, $popover, oStyle, isAirMode); if(!!(isAirMode ? $popover : $popover.parent()).find('.note-table').length) { summernote_table_update(oStyle); @@ -2249,16 +2318,16 @@ function summernote_paste (event) { var fn_attach = eventHandler.attach; eventHandler.attach = function (oLayoutInfo, options) { - var $editable = oLayoutInfo.editor.hasClass('note-editable') ? oLayoutInfo.editor : oLayoutInfo.editor.find('.note-editable'); + var $editable = oLayoutInfo.editor().hasClass('note-editable') ? oLayoutInfo.editor() : oLayoutInfo.editor().find('.note-editable'); fn_attach.call(this, oLayoutInfo, options); - oLayoutInfo.editor.on("paste", summernote_paste); + oLayoutInfo.editor().on("paste", summernote_paste); $editable.on("scroll", summernote_table_scroll); }; var fn_detach = eventHandler.detach; eventHandler.detach = function (oLayoutInfo, options) { - var $editable = oLayoutInfo.editor.hasClass('note-editable') ? oLayoutInfo.editor : oLayoutInfo.editor.find('.note-editable'); + var $editable = oLayoutInfo.editor().hasClass('note-editable') ? oLayoutInfo.editor() : oLayoutInfo.editor().find('.note-editable'); fn_detach.call(this, oLayoutInfo, options); - oLayoutInfo.editor.off("paste", summernote_paste); + oLayoutInfo.editor().off("paste", summernote_paste); $editable.off("scroll", summernote_table_scroll); $('.o_table_handler').remove(); }; |
