diff --git a/addons/web_editor/static/src/js/editor/rte.summernote.js b/addons/web_editor/static/src/js/editor/rte.summernote.js index cd8d75e91dd..e63d87e54b2 100644 --- a/addons/web_editor/static/src/js/editor/rte.summernote.js +++ b/addons/web_editor/static/src/js/editor/rte.summernote.js @@ -1247,6 +1247,7 @@ var SummernoteManager = Class.extend(mixins.EventDispatcherMixin, { data.__alreadyDone = true; var linkDialog = new weWidgets.LinkDialog(this, data.options || {}, + data.$editable, data.linkInfo ); if (data.onSave) { diff --git a/addons/web_editor/static/src/js/wysiwyg/widgets/link_dialog.js b/addons/web_editor/static/src/js/wysiwyg/widgets/link_dialog.js index 6e8ec03f1f8..a03167eeaa5 100644 --- a/addons/web_editor/static/src/js/wysiwyg/widgets/link_dialog.js +++ b/addons/web_editor/static/src/js/wysiwyg/widgets/link_dialog.js @@ -4,6 +4,9 @@ odoo.define('wysiwyg.widgets.LinkDialog', function (require) { var core = require('web.core'); var Dialog = require('wysiwyg.widgets.Dialog'); +var dom = $.summernote.core.dom; +var range = $.summernote.core.range; + var _t = core._t; /** @@ -23,7 +26,7 @@ var LinkDialog = Dialog.extend({ /** * @constructor */ - init: function (parent, options, linkInfo) { + init: function (parent, options, editable, linkInfo) { var self = this; this.options = options || {}; @@ -38,9 +41,95 @@ var LinkDialog = Dialog.extend({ }, }); + this.editable = editable; this.data = linkInfo || {}; - this.needLabel = linkInfo.needLabel; - this.data.iniClassName = linkInfo.className || ''; + + this.data.className = ""; + this.data.iniClassName = ""; + + var r = this.data.range; + this.needLabel = !r || (r.sc === r.ec && r.so === r.eo); + + if (this.data.range) { + this.data.iniClassName = $(this.data.range.sc).filter("a").attr("class") || ""; + this.data.className = this.data.iniClassName.replace(/(^|\s+)btn(-[a-z0-9_-]*)?/gi, ' '); + + var is_link = this.data.range.isOnAnchor(); + + var sc = r.sc; + var so = r.so; + var ec = r.ec; + var eo = r.eo; + + var nodes; + if (!is_link) { + if (sc.tagName) { + sc = dom.firstChild(so ? sc.childNodes[so] : sc); + so = 0; + } else if (so !== sc.textContent.length) { + if (sc === ec) { + ec = sc = sc.splitText(so); + eo -= so; + } else { + sc = sc.splitText(so); + } + so = 0; + } + if (ec.tagName) { + ec = dom.lastChild(eo ? ec.childNodes[eo-1] : ec); + eo = ec.textContent.length; + } else if (eo !== ec.textContent.length) { + ec.splitText(eo); + } + + nodes = dom.listBetween(sc, ec); + + // browsers can't target a picture or void node + if (dom.isVoid(sc) || dom.isImg(sc)) { + so = dom.listPrev(sc).length-1; + sc = sc.parentNode; + } + if (dom.isBR(ec)) { + eo = dom.listPrev(ec).length-1; + ec = ec.parentNode; + } else if (dom.isVoid(ec) || dom.isImg(sc)) { + eo = dom.listPrev(ec).length; + ec = ec.parentNode; + } + + this.data.range = range.create(sc, so, ec, eo); + $(editable).data("range", this.data.range); + this.data.range.select(); + } else { + nodes = dom.ancestor(sc, dom.isAnchor).childNodes; + } + + if (dom.isImg(sc) && nodes.indexOf(sc) === -1) { + nodes.push(sc); + } + if (nodes.length > 1 || dom.ancestor(nodes[0], dom.isImg)) { + var text = ""; + this.data.images = []; + for (var i=0; i