From aeb4844da7daca2cc7bf040fb1849acea5113a6d Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Fri, 19 Jan 2024 16:43:51 +1300 Subject: [PATCH] FIX Add tinymce link menuitems per editor instance --- client/dist/js/TinyMCE_sslink-email.js | 2 +- client/dist/js/TinyMCE_sslink-external.js | 2 +- client/dist/js/TinyMCE_sslink.js | 2 +- client/src/legacy/TinyMCE_sslink-email.js | 25 ++++----- client/src/legacy/TinyMCE_sslink-external.js | 19 +++---- client/src/legacy/TinyMCE_sslink.js | 56 +++++++++++++------- 6 files changed, 63 insertions(+), 43 deletions(-) diff --git a/client/dist/js/TinyMCE_sslink-email.js b/client/dist/js/TinyMCE_sslink-email.js index a495c6cd8..544a0679f 100644 --- a/client/dist/js/TinyMCE_sslink-email.js +++ b/client/dist/js/TinyMCE_sslink-email.js @@ -1 +1 @@ -!function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s="./client/src/legacy/TinyMCE_sslink-email.js")}({"./client/src/legacy/TinyMCE_sslink-email.js":function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n("i18n"),o=i(r),a=n("lib/TinyMCEActionRegistrar"),l=i(a),s=n("react"),c=i(s),d=n("react-dom"),u=i(d),f=n("jquery"),m=i(f),p=n("containers/InsertLinkModal/InsertLinkModal"),k=n("lib/Injector");l.default.addAction("sslink",{text:o.default._t("Admin.LINKLABEL_EMAIL","Link to email address"),onclick:function(e){return e.execCommand("sslinkemail")},priority:51},editorIdentifier).addCommandWithUrlTest("sslinkemail",/^mailto:/);var g={init:function(e){e.addCommand("sslinkemail",function(){window.jQuery("#"+e.id).entwine("ss").openLinkEmailDialog()})}},b="insert-link__dialog-wrapper--email",L=(0,k.loadComponent)((0,p.createInsertLinkModal)("SilverStripe\\Admin\\LeftAndMain","EditorEmailLink"));m.default.entwine("ss",function(e){e("textarea.htmleditor").entwine({openLinkEmailDialog:function(){var t=e("#"+b);t.length||(t=e('
'),e("body").append(t)),t.addClass("insert-link__dialog-wrapper"),t.setElement(this),t.open()}}),e("#"+b).entwine({renderModal:function(e){var t=this,n=function(){return t.close()},i=function(){return t.handleInsert.apply(t,arguments)},r=this.getOriginalAttributes(),a=this.getRequireLinkText();u.default.render(c.default.createElement(L,{isOpen:e,onInsert:i,onClosed:n,title:o.default._t("Admin.LINK_EMAIL","Insert email link"),bodyClassName:"modal__dialog",className:"insert-link__dialog-wrapper--email",fileAttributes:r,identifier:"Admin.InsertLinkEmailModal",requireLinkText:a}),this[0])},getOriginalAttributes:function(){var t=this.getElement().getEditor(),n=e(t.getSelectedNode()),i=(n.attr("href")||"").split("?"),r=i[0].replace(/^mailto:/,"").split("?")[0];r.match(/.+@.+\..+/)||(r="");var o=i[1]?i[1].match(/subject=([^&]+)/):"";return{Link:r,Subject:o?decodeURIComponent(o[1]):"",Description:n.attr("title")}},buildAttributes:function(e){var t=this._super(e),n="",i=t.href.replace(/^mailto:/,"").split("?")[0];return i.match(/.+@.+\..+/)||(i=""),i&&(n="mailto:"+i),n&&e.Subject&&(n=n+"?subject="+encodeURIComponent(e.Subject)),t.href=n,delete t.target,t}})}),tinymce.PluginManager.add("sslinkemail",function(e){return g.init(e)}),t.default=g},"containers/InsertLinkModal/InsertLinkModal":function(e,t){e.exports=InsertLinkModal},i18n:function(e,t){e.exports=i18n},jquery:function(e,t){e.exports=jQuery},"lib/Injector":function(e,t){e.exports=Injector},"lib/TinyMCEActionRegistrar":function(e,t){e.exports=TinyMCEActionRegistrar},react:function(e,t){e.exports=React},"react-dom":function(e,t){e.exports=ReactDom}}); \ No newline at end of file +!function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s="./client/src/legacy/TinyMCE_sslink-email.js")}({"./client/src/legacy/TinyMCE_sslink-email.js":function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n("i18n"),o=i(r),a=n("lib/TinyMCEActionRegistrar"),l=i(a),s=n("react"),c=i(s),d=n("react-dom"),u=i(d),f=n("jquery"),m=i(f),p=n("containers/InsertLinkModal/InsertLinkModal"),g=n("lib/Injector"),k={init:function(e){l.default.addAction("sslink",{text:o.default._t("Admin.LINKLABEL_EMAIL","Link to email address"),onclick:function(e){return e.execCommand("sslinkemail")},priority:51},e.settings.editorIdentifier).addCommandWithUrlTest("sslinkemail",/^mailto:/),e.addCommand("sslinkemail",function(){window.jQuery("#"+e.id).entwine("ss").openLinkEmailDialog()})}},b="insert-link__dialog-wrapper--email",L=(0,g.loadComponent)((0,p.createInsertLinkModal)("SilverStripe\\Admin\\LeftAndMain","EditorEmailLink"));m.default.entwine("ss",function(e){e("textarea.htmleditor").entwine({openLinkEmailDialog:function(){var t=e("#"+b);t.length||(t=e('
'),e("body").append(t)),t.addClass("insert-link__dialog-wrapper"),t.setElement(this),t.open()}}),e("#"+b).entwine({renderModal:function(e){var t=this,n=function(){return t.close()},i=function(){return t.handleInsert.apply(t,arguments)},r=this.getOriginalAttributes(),a=this.getRequireLinkText();u.default.render(c.default.createElement(L,{isOpen:e,onInsert:i,onClosed:n,title:o.default._t("Admin.LINK_EMAIL","Insert email link"),bodyClassName:"modal__dialog",className:"insert-link__dialog-wrapper--email",fileAttributes:r,identifier:"Admin.InsertLinkEmailModal",requireLinkText:a}),this[0])},getOriginalAttributes:function(){var t=this.getElement().getEditor(),n=e(t.getSelectedNode()),i=(n.attr("href")||"").split("?"),r=i[0].replace(/^mailto:/,"").split("?")[0];r.match(/.+@.+\..+/)||(r="");var o=i[1]?i[1].match(/subject=([^&]+)/):"";return{Link:r,Subject:o?decodeURIComponent(o[1]):"",Description:n.attr("title")}},buildAttributes:function(e){var t=this._super(e),n="",i=t.href.replace(/^mailto:/,"").split("?")[0];return i.match(/.+@.+\..+/)||(i=""),i&&(n="mailto:"+i),n&&e.Subject&&(n=n+"?subject="+encodeURIComponent(e.Subject)),t.href=n,delete t.target,t}})}),tinymce.PluginManager.add("sslinkemail",function(e){return k.init(e)}),t.default=k},"containers/InsertLinkModal/InsertLinkModal":function(e,t){e.exports=InsertLinkModal},i18n:function(e,t){e.exports=i18n},jquery:function(e,t){e.exports=jQuery},"lib/Injector":function(e,t){e.exports=Injector},"lib/TinyMCEActionRegistrar":function(e,t){e.exports=TinyMCEActionRegistrar},react:function(e,t){e.exports=React},"react-dom":function(e,t){e.exports=ReactDom}}); \ No newline at end of file diff --git a/client/dist/js/TinyMCE_sslink-external.js b/client/dist/js/TinyMCE_sslink-external.js index 7c0f16367..e209169ed 100644 --- a/client/dist/js/TinyMCE_sslink-external.js +++ b/client/dist/js/TinyMCE_sslink-external.js @@ -1 +1 @@ -!function(e){function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s="./client/src/legacy/TinyMCE_sslink-external.js")}({"./client/src/legacy/TinyMCE_sslink-external.js":function(e,n,t){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(n,"__esModule",{value:!0});var r=t("i18n"),o=i(r),a=t("lib/TinyMCEActionRegistrar"),l=i(a),s=t("react"),c=i(s),u=t("react-dom"),d=i(u),f=t("jquery"),p=i(f),x=t("containers/InsertLinkModal/InsertLinkModal"),k=t("lib/Injector");l.default.addAction("sslink",{text:o.default._t("Admin.LINKLABEL_EXTERNALURL","Link to external URL"),onclick:function(e){return e.execCommand("sslinkexternal")},priority:70},editorIdentifier);var m={init:function(e){e.addCommand("sslinkexternal",function(){window.jQuery("#"+e.id).entwine("ss").openLinkExternalDialog()})}},L="insert-link__dialog-wrapper--external",_=(0,k.loadComponent)((0,x.createInsertLinkModal)("SilverStripe\\Admin\\LeftAndMain","EditorExternalLink"));p.default.entwine("ss",function(e){e("textarea.htmleditor").entwine({openLinkExternalDialog:function(){var n=e("#"+L);n.length||(n=e('
'),e("body").append(n)),n.addClass("insert-link__dialog-wrapper"),n.setElement(this),n.open()}}),e("#"+L).entwine({renderModal:function(e){var n=this,t=function(){return n.close()},i=function(){return n.handleInsert.apply(n,arguments)},r=this.getOriginalAttributes(),a=this.getRequireLinkText();d.default.render(c.default.createElement(_,{isOpen:e,onInsert:i,onClosed:t,title:o.default._t("Admin.LINK_EXTERNAL","Insert external link"),bodyClassName:"modal__dialog",className:"insert-link__dialog-wrapper--external",fileAttributes:r,identifier:"Admin.InsertLinkExternalModal",requireLinkText:a}),this[0])},buildAttributes:function(e){var n=this._super(e),t=n.href;return t.match(/:\/\//)||(t=window.location.protocol+"//"+t),t=t.replace(/.*:\/\/(#.*)$/,"$1"),t.match(/:\/\/$/)&&(t=""),n.href=t,n}})}),tinymce.PluginManager.add("sslinkexternal",function(e){return m.init(e)}),n.default=m},"containers/InsertLinkModal/InsertLinkModal":function(e,n){e.exports=InsertLinkModal},i18n:function(e,n){e.exports=i18n},jquery:function(e,n){e.exports=jQuery},"lib/Injector":function(e,n){e.exports=Injector},"lib/TinyMCEActionRegistrar":function(e,n){e.exports=TinyMCEActionRegistrar},react:function(e,n){e.exports=React},"react-dom":function(e,n){e.exports=ReactDom}}); \ No newline at end of file +!function(e){function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s="./client/src/legacy/TinyMCE_sslink-external.js")}({"./client/src/legacy/TinyMCE_sslink-external.js":function(e,n,t){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(n,"__esModule",{value:!0});var r=t("i18n"),o=i(r),a=t("lib/TinyMCEActionRegistrar"),l=i(a),s=t("react"),c=i(s),u=t("react-dom"),d=i(u),f=t("jquery"),p=i(f),x=t("containers/InsertLinkModal/InsertLinkModal"),k=t("lib/Injector"),m={init:function(e){l.default.addAction("sslink",{text:o.default._t("Admin.LINKLABEL_EXTERNALURL","Link to external URL"),onclick:function(e){return e.execCommand("sslinkexternal")},priority:70},e.settings.editorIdentifier),e.addCommand("sslinkexternal",function(){window.jQuery("#"+e.id).entwine("ss").openLinkExternalDialog()})}},L="insert-link__dialog-wrapper--external",_=(0,k.loadComponent)((0,x.createInsertLinkModal)("SilverStripe\\Admin\\LeftAndMain","EditorExternalLink"));p.default.entwine("ss",function(e){e("textarea.htmleditor").entwine({openLinkExternalDialog:function(){var n=e("#"+L);n.length||(n=e('
'),e("body").append(n)),n.addClass("insert-link__dialog-wrapper"),n.setElement(this),n.open()}}),e("#"+L).entwine({renderModal:function(e){var n=this,t=function(){return n.close()},i=function(){return n.handleInsert.apply(n,arguments)},r=this.getOriginalAttributes(),a=this.getRequireLinkText();d.default.render(c.default.createElement(_,{isOpen:e,onInsert:i,onClosed:t,title:o.default._t("Admin.LINK_EXTERNAL","Insert external link"),bodyClassName:"modal__dialog",className:"insert-link__dialog-wrapper--external",fileAttributes:r,identifier:"Admin.InsertLinkExternalModal",requireLinkText:a}),this[0])},buildAttributes:function(e){var n=this._super(e),t=n.href;return t.match(/:\/\//)||(t=window.location.protocol+"//"+t),t=t.replace(/.*:\/\/(#.*)$/,"$1"),t.match(/:\/\/$/)&&(t=""),n.href=t,n}})}),tinymce.PluginManager.add("sslinkexternal",function(e){return m.init(e)}),n.default=m},"containers/InsertLinkModal/InsertLinkModal":function(e,n){e.exports=InsertLinkModal},i18n:function(e,n){e.exports=i18n},jquery:function(e,n){e.exports=jQuery},"lib/Injector":function(e,n){e.exports=Injector},"lib/TinyMCEActionRegistrar":function(e,n){e.exports=TinyMCEActionRegistrar},react:function(e,n){e.exports=React},"react-dom":function(e,n){e.exports=ReactDom}}); \ No newline at end of file diff --git a/client/dist/js/TinyMCE_sslink.js b/client/dist/js/TinyMCE_sslink.js index 97c5bde25..30b880d04 100644 --- a/client/dist/js/TinyMCE_sslink.js +++ b/client/dist/js/TinyMCE_sslink.js @@ -1 +1 @@ -!function(t){function e(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return t[o].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s="./client/src/legacy/TinyMCE_sslink.js")}({"./client/src/components/TinymceInlineToolbar/TinymceInlineToolbar.js":function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e,n){var o=Array.isArray(n)?n:[n||""];return!(!t||!e)&&(o=o.map(function(t){return String(t)}).map(function(t){return t.toLowerCase()}),o.filter(function(e){if(e.indexOf("[")>-1&&e.indexOf("]")>-1){var n=e.substring(0,e.indexOf("[")),o=e.substring(e.indexOf("[")+1,e.indexOf("]"));if(n===t.tagName.toLowerCase()&&t.getAttribute(o))return!0}else if(t.tagName&&e===t.tagName.toLowerCase())return!0;return!1}).length>0)}function r(t,e){function n(){i(l,u,o)&&(r.hide(),clearTimeout(c),c=setTimeout(function(){r.show(),r.reposition(l)},300))}var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:["a"],r=new a(t,e),l=null,c=null,u=!1;return r.hide().renderTo(window.document.body),t.on("remove",function(){r.remove()}),t.on("focus",function(){u=!0}),t.on("blur hide",function(){r.hide(),u=!1}),t.on("nodechange",function(e){var n={element:e.element,parents:e.parents,collapsed:t.selection.isCollapsed()};l=n.selection||n.element,i(l,u,o)?(r.show(),r.reposition(l)):r.hide()}),window.addEventListener("scroll",function(e){e.target.contains(document.querySelector("#"+t.id))&&n()},!0),t.contentDocument.addEventListener("scroll",n),r}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n=k||b>=k?this.hide():(this.bottom?b>=d?(y=" mce-arrow-up",v=u.bottom+r.top+n+10):p>=d&&(y=" mce-arrow-down",v=u.top+r.top+n-c-8):p>=d?(y=" mce-arrow-down",v=u.top+r.top+n-c-8):b>=d&&k/2>u.bottom+r.top-h&&(y=" mce-arrow-up",v=u.bottom+r.top+n+10),0===v&&(v=n+h+5),T=s-a/2+r.left+e,u.left<0||u.right>r.width?T=r.left+e+(r.width-a)/2:a>=o?(y+=" mce-arrow-full",T=0):T<0&&u.left+a>o||T+a>o&&u.right-a<0?T=(o-a)/2:Tr.width+r.left+e&&(y+=" mce-arrow-right",T=u.right-a+r.left+e),l.className=l.className.replace(/ ?mce-arrow-[\w]+/g,"")+y,this.setStyles({left:T,top:v}),this)}}]),t}();e.default=a,e.setupTinyMceInlineToolbar=r,e.shouldShowToolbar=i},"./client/src/legacy/TinyMCE_sslink.js":function(t,e,n){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n("lib/TinyMCEActionRegistrar"),r=o(i),l=n("react-dom"),a=o(l),c=n("jquery"),u=o(c),s=n("./client/src/components/TinymceInlineToolbar/TinymceInlineToolbar.js"),d=n("lib/ShortcodeSerialiser"),f=n("i18n"),m=o(f),h={init:function(t){function e(){var e=tinymce.activeEditor.selection.getNode(),n=e.getAttribute("href");n&&t.execCommand(r.default.getEditorCommandFromUrl(n))}var n=this,o=navigator.platform.toUpperCase().includes("MAC")?"⌘":"Ctrl",i=m.default._t("Admin.INSERT_LINK","Insert link"),l=m.default.inject(m.default._t("Admin.INSERT_LINK_WITH_SHORTCUT","Insert link {shortcut}"),{shortcut:"["+o+"+K]"}),a=r.default.getSortedActions("sslink",t.settings.editorIdentifier,!0).map(function(e){return Object.assign({},e,{onclick:function(){return e.onclick(t)}})});t.addButton("sslink",{icon:"link",title:l,type:"menubutton",menu:a}),t.addMenuItem("sslink",{icon:"link",text:i,menu:a}),t.addShortcut("Meta+k","Open link menu",function(){(0,u.default)('[aria-label^="'+i+'"] > button',t.container).first().click()}),t.on("preinit",function(){(0,s.setupTinyMceInlineToolbar)(t,[{type:"button",onClick:e,text:m.default._t("Admin.EDIT_LINK","Edit link")},{type:"button",onClick:function(){return n.handleRemoveLinkClick(t)},text:m.default._t("Admin.REMOVE_LINK","Remove link")}],["a[href]"])})},handleRemoveLinkClick:function(t){var e=t.execCommand("unlink"),n=t.selection.getNode();return n&&void 0!==n.normalize&&n.normalize(),e}};u.default.entwine("ss",function(t){t(".insert-link__dialog-wrapper").entwine({Element:null,Data:{},Bookmark:null,onunmatch:function(){this._clearModal()},_clearModal:function(){a.default.unmountComponentAtNode(this[0])},open:function(){var t=this.getElement().getEditor().getInstance();this.setBookmark(t.selection.getBookmark(2,!0)),this.renderModal(!0)},close:function(){this.setData({}),this.renderModal(!1)},renderModal:function(){},linkCanWrapSelection:function(t){var e=t.getContent()||"",n=t.getNode();if(e)return""!==e.trim();var o=document.createElement(n.nodeName);return o.textContent="Check the outer HTML",!o.outerHTML.includes("Check the outer HTML")&&(n===t.getSel().focusNode&&n===t.getSel().anchorNode&&1===tinymce.activeEditor.dom.createFragment(""+n.outerHTML+"").childNodes.length)},getRequireLinkText:function(){var t=this.getElement().getEditor().getInstance().selection,e=this.linkCanWrapSelection(t);return"A"!==t.getNode().tagName&&!e},handleInsert:function(t){this.getElement().getEditor().getInstance().selection.moveToBookmark(this.getBookmark());var e=this.buildAttributes(t),n=(0,d.createHTMLSanitiser)(),o=n(t.Text);return this.insertLinkInEditor(e,o),this.close(),Promise.resolve()},buildAttributes:function(t){var e=t.Anchor,n=t.Link,o=t.TargetBlank,i=t.Description,r=e&&e.length?"#"+e:"";return r=r.replace(/^#+/,"#"),{href:""+n+r,target:o?"_blank":"",title:i}},insertLinkInEditor:function(t,e){var n=this.getElement().getEditor();n.insertLink(t,null,e),n.addUndo(),n.repaint();var o=n.getInstance(),i=o.selection;setTimeout(function(){return i&&i.collapse()},0)},getOriginalAttributes:function(){var e=this.getElement().getEditor(),n=t(e.getSelectedNode()),o=(n.attr("href")||"").split("#");return{Link:o[0]||"",Anchor:o[1]||"",Description:n.attr("title"),TargetBlank:!!n.attr("target")}}})}),tinymce.PluginManager.add("sslink",function(t){return h.init(t)}),e.default=h},i18n:function(t,e){t.exports=i18n},jquery:function(t,e){t.exports=jQuery},"lib/ShortcodeSerialiser":function(t,e){t.exports=ShortcodeSerialiser},"lib/TinyMCEActionRegistrar":function(t,e){t.exports=TinyMCEActionRegistrar},"react-dom":function(t,e){t.exports=ReactDom}}); \ No newline at end of file +!function(t){function e(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return t[o].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s="./client/src/legacy/TinyMCE_sslink.js")}({"./client/src/components/TinymceInlineToolbar/TinymceInlineToolbar.js":function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e,n){var o=Array.isArray(n)?n:[n||""];return!(!t||!e)&&(o=o.map(function(t){return String(t)}).map(function(t){return t.toLowerCase()}),o.filter(function(e){if(e.indexOf("[")>-1&&e.indexOf("]")>-1){var n=e.substring(0,e.indexOf("[")),o=e.substring(e.indexOf("[")+1,e.indexOf("]"));if(n===t.tagName.toLowerCase()&&t.getAttribute(o))return!0}else if(t.tagName&&e===t.tagName.toLowerCase())return!0;return!1}).length>0)}function r(t,e){function n(){i(a,u,o)&&(r.hide(),clearTimeout(c),c=setTimeout(function(){r.show(),r.reposition(a)},300))}var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:["a"],r=new l(t,e),a=null,c=null,u=!1;return r.hide().renderTo(window.document.body),t.on("remove",function(){r.remove()}),t.on("focus",function(){u=!0}),t.on("blur hide",function(){r.hide(),u=!1}),t.on("nodechange",function(e){var n={element:e.element,parents:e.parents,collapsed:t.selection.isCollapsed()};a=n.selection||n.element,i(a,u,o)?(r.show(),r.reposition(a)):r.hide()}),window.addEventListener("scroll",function(e){e.target.contains(document.querySelector("#"+t.id))&&n()},!0),t.contentDocument.addEventListener("scroll",n),r}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n=k||b>=k?this.hide():(this.bottom?b>=d?(y=" mce-arrow-up",v=u.bottom+r.top+n+10):p>=d&&(y=" mce-arrow-down",v=u.top+r.top+n-c-8):p>=d?(y=" mce-arrow-down",v=u.top+r.top+n-c-8):b>=d&&k/2>u.bottom+r.top-h&&(y=" mce-arrow-up",v=u.bottom+r.top+n+10),0===v&&(v=n+h+5),T=s-l/2+r.left+e,u.left<0||u.right>r.width?T=r.left+e+(r.width-l)/2:l>=o?(y+=" mce-arrow-full",T=0):T<0&&u.left+l>o||T+l>o&&u.right-l<0?T=(o-l)/2:Tr.width+r.left+e&&(y+=" mce-arrow-right",T=u.right-l+r.left+e),a.className=a.className.replace(/ ?mce-arrow-[\w]+/g,"")+y,this.setStyles({left:T,top:v}),this)}}]),t}();e.default=l,e.setupTinyMceInlineToolbar=r,e.shouldShowToolbar=i},"./client/src/legacy/TinyMCE_sslink.js":function(t,e,n){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n("lib/TinyMCEActionRegistrar"),r=o(i),a=n("react-dom"),l=o(a),c=n("jquery"),u=o(c),s=n("./client/src/components/TinymceInlineToolbar/TinymceInlineToolbar.js"),d=n("lib/ShortcodeSerialiser"),f=n("i18n"),m=o(f),h={init:function(t){function e(){var e=tinymce.activeEditor.selection.getNode(),n=e.getAttribute("href");n&&t.execCommand(r.default.getEditorCommandFromUrl(n))}var n=this,o=navigator.platform.toUpperCase().includes("MAC")?"⌘":"Ctrl",i=m.default._t("Admin.INSERT_LINK","Insert link"),a=m.default.inject(m.default._t("Admin.INSERT_LINK_WITH_SHORTCUT","Insert link {shortcut}"),{shortcut:"["+o+"+K]"});t.addShortcut("Meta+k","Open link menu",function(){(0,u.default)('[aria-label^="'+i+'"] > button',t.container).first().click()});var l=[],c={icon:"link",title:a,type:"menubutton",onPostRender:function(e){l=r.default.getSortedActions("sslink",t.settings.editorIdentifier,!0).map(function(e){return Object.assign({},e,{onclick:function(){return e.onclick(t)}})}),e.control.state.data.menu=l},menu:l};t.addButton("sslink",c),t.on("preinit",function(){t.addMenuItem("sslink",{icon:"link",text:i,menu:l}),(0,s.setupTinyMceInlineToolbar)(t,[{type:"button",onClick:e,text:m.default._t("Admin.EDIT_LINK","Edit link")},{type:"button",onClick:function(){return n.handleRemoveLinkClick(t)},text:m.default._t("Admin.REMOVE_LINK","Remove link")}],["a[href]"])})},handleRemoveLinkClick:function(t){var e=t.execCommand("unlink"),n=t.selection.getNode();return n&&void 0!==n.normalize&&n.normalize(),e}};u.default.entwine("ss",function(t){t(".insert-link__dialog-wrapper").entwine({Element:null,Data:{},Bookmark:null,onunmatch:function(){this._clearModal()},_clearModal:function(){l.default.unmountComponentAtNode(this[0])},open:function(){var t=this.getElement().getEditor().getInstance();this.setBookmark(t.selection.getBookmark(2,!0)),this.renderModal(!0)},close:function(){this.setData({}),this.renderModal(!1)},renderModal:function(){},linkCanWrapSelection:function(t){var e=t.getContent()||"",n=t.getNode();if(e)return""!==e.trim();var o=document.createElement(n.nodeName);return o.textContent="Check the outer HTML",!o.outerHTML.includes("Check the outer HTML")&&(n===t.getSel().focusNode&&n===t.getSel().anchorNode&&1===tinymce.activeEditor.dom.createFragment(""+n.outerHTML+"").childNodes.length)},getRequireLinkText:function(){var t=this.getElement().getEditor().getInstance().selection,e=this.linkCanWrapSelection(t);return"A"!==t.getNode().tagName&&!e},handleInsert:function(t){this.getElement().getEditor().getInstance().selection.moveToBookmark(this.getBookmark());var e=this.buildAttributes(t),n=(0,d.createHTMLSanitiser)(),o=n(t.Text);return this.insertLinkInEditor(e,o),this.close(),Promise.resolve()},buildAttributes:function(t){var e=t.Anchor,n=t.Link,o=t.TargetBlank,i=t.Description,r=e&&e.length?"#"+e:"";return r=r.replace(/^#+/,"#"),{href:""+n+r,target:o?"_blank":"",title:i}},insertLinkInEditor:function(t,e){var n=this.getElement().getEditor();n.insertLink(t,null,e),n.addUndo(),n.repaint();var o=n.getInstance(),i=o.selection;setTimeout(function(){return i&&i.collapse()},0)},getOriginalAttributes:function(){var e=this.getElement().getEditor(),n=t(e.getSelectedNode()),o=(n.attr("href")||"").split("#");return{Link:o[0]||"",Anchor:o[1]||"",Description:n.attr("title"),TargetBlank:!!n.attr("target")}}})}),tinymce.PluginManager.add("sslink",function(t){return h.init(t)}),e.default=h},i18n:function(t,e){t.exports=i18n},jquery:function(t,e){t.exports=jQuery},"lib/ShortcodeSerialiser":function(t,e){t.exports=ShortcodeSerialiser},"lib/TinyMCEActionRegistrar":function(t,e){t.exports=TinyMCEActionRegistrar},"react-dom":function(t,e){t.exports=ReactDom}}); \ No newline at end of file diff --git a/client/src/legacy/TinyMCE_sslink-email.js b/client/src/legacy/TinyMCE_sslink-email.js index 57867fef9..e5b4b4fde 100644 --- a/client/src/legacy/TinyMCE_sslink-email.js +++ b/client/src/legacy/TinyMCE_sslink-email.js @@ -1,4 +1,4 @@ -/* global tinymce, editorIdentifier, window */ +/* global tinymce, window */ import i18n from 'i18n'; import TinyMCEActionRegistrar from 'lib/TinyMCEActionRegistrar'; import React from 'react'; @@ -9,19 +9,20 @@ import { loadComponent } from 'lib/Injector'; const commandName = 'sslinkemail'; -// Link to email address -TinyMCEActionRegistrar.addAction( - 'sslink', - { - text: i18n._t('Admin.LINKLABEL_EMAIL', 'Link to email address'), - onclick: (editorInst) => editorInst.execCommand(commandName), - priority: 51, - }, - editorIdentifier, -).addCommandWithUrlTest(commandName, /^mailto:/); - const plugin = { init(editor) { + // Add "Link to email address" to link menu for this editor + TinyMCEActionRegistrar.addAction( + 'sslink', + { + text: i18n._t('Admin.LINKLABEL_EMAIL', 'Link to email address'), + onclick: (editorInst) => editorInst.execCommand(commandName), + priority: 51, + }, + editor.settings.editorIdentifier, + ).addCommandWithUrlTest(commandName, /^mailto:/); + + // Add a command that corresponds with the above menu item editor.addCommand(commandName, () => { const field = window.jQuery(`#${editor.id}`).entwine('ss'); diff --git a/client/src/legacy/TinyMCE_sslink-external.js b/client/src/legacy/TinyMCE_sslink-external.js index 4d7d53419..baea77a86 100644 --- a/client/src/legacy/TinyMCE_sslink-external.js +++ b/client/src/legacy/TinyMCE_sslink-external.js @@ -1,4 +1,4 @@ -/* global tinymce, editorIdentifier, window */ +/* global tinymce, window */ import i18n from 'i18n'; import TinyMCEActionRegistrar from 'lib/TinyMCEActionRegistrar'; import React from 'react'; @@ -7,16 +7,17 @@ import jQuery from 'jquery'; import { createInsertLinkModal } from 'containers/InsertLinkModal/InsertLinkModal'; import { loadComponent } from 'lib/Injector'; -// Link to external url -TinyMCEActionRegistrar.addAction('sslink', { - text: i18n._t('Admin.LINKLABEL_EXTERNALURL', 'Link to external URL'), - // eslint-disable-next-line no-console - onclick: (editor) => editor.execCommand('sslinkexternal'), - priority: 70, -}, editorIdentifier); - const plugin = { init(editor) { + // Add "Link to external url" to link menu for this editor + TinyMCEActionRegistrar.addAction('sslink', { + text: i18n._t('Admin.LINKLABEL_EXTERNALURL', 'Link to external URL'), + // eslint-disable-next-line no-console + onclick: (editorInst) => editorInst.execCommand('sslinkexternal'), + priority: 70, + }, editor.settings.editorIdentifier); + + // Add a command that corresponds with the above menu item editor.addCommand('sslinkexternal', () => { const field = window.jQuery(`#${editor.id}`).entwine('ss'); diff --git a/client/src/legacy/TinyMCE_sslink.js b/client/src/legacy/TinyMCE_sslink.js index e5938d34c..f9d57816a 100644 --- a/client/src/legacy/TinyMCE_sslink.js +++ b/client/src/legacy/TinyMCE_sslink.js @@ -19,25 +19,6 @@ const plugin = { i18n._t('Admin.INSERT_LINK_WITH_SHORTCUT', 'Insert link {shortcut}'), { shortcut: `[${metaKey}+K]` } ); - const actions = TinyMCEActionRegistrar.getSortedActions('sslink', editor.settings.editorIdentifier, true) - .map(action => Object.assign( - {}, - action, - { onclick: () => action.onclick(editor) } - )); - - editor.addButton('sslink', { - icon: 'link', - title: titleWithShortcut, - type: 'menubutton', - menu: actions, - }); - - editor.addMenuItem('sslink', { - icon: 'link', - text: title, - menu: actions, - }); editor.addShortcut('Meta+k', 'Open link menu', () => { jQuery(`[aria-label^=\"${title}\"] > button`, editor.container).first().click(); @@ -52,7 +33,44 @@ const plugin = { } } + let actions = []; + + const button = { + icon: 'link', + title: titleWithShortcut, + type: 'menubutton', + onPostRender: (data) => { + // Fetch the actions. + // We can't do this in the plugin's init method directly because not all actions will have + // been registered at that stage. + // We can't do this in the editor's preinit (or any other editor-related) event because + // the buttons will have already been fully rendered by then, and after that we can't + // access their state to update it. + actions = TinyMCEActionRegistrar.getSortedActions('sslink', editor.settings.editorIdentifier, true) + .map(action => Object.assign( + {}, + action, + { onclick: () => action.onclick(editor) } + )); + // Set the button menu to include all link actions + // eslint-disable-next-line no-param-reassign + data.control.state.data.menu = actions; + }, + menu: actions, + }; + + editor.addButton('sslink', button); + editor.on('preinit', () => { + // Add context menu item. This happens after button rendering, so we know + // we have the same list of actions that the main button has at this stage. + editor.addMenuItem('sslink', { + icon: 'link', + text: title, + menu: actions, + }); + + // Add toolbar for when you right click on a link setupTinyMceInlineToolbar(editor, [ { type: 'button', onClick: openLinkDialog, text: i18n._t('Admin.EDIT_LINK', 'Edit link') }, { type: 'button', onClick: () => this.handleRemoveLinkClick(editor), text: i18n._t('Admin.REMOVE_LINK', 'Remove link') },