Repository: django-cms/djangocms-text-ckeditor (language: python)

Issue:
Double clicking an inserted link doesn't opens the edit popup in the latest version
If you have added a link in the editor and if you try to edit it by double clicking. The edit popup of link doesn't appears. Please confirm, it was working fine until we upgraded to 5.1.5 version


Discussion / hints:
Sorry, I cannot reproduce. Can you give a more specific description? Text-enabled plugins work fine for me, both when editing inline and from the change plugin modal.
> Sorry, I cannot reproduce. Can you give a more specific description? Text-enabled plugins work fine for me, both when editing inline and from the change plugin modal.

If you check the link which is an inbuilt inline which doesn't come under the CMS plugins. Can you check this once ![image](https://github.com/user-attachments/assets/93b166f6-a44a-4b95-ae15-26d54c6dd064)

In the image the blue text is a normal link which is highlighted from the mouse hover. When we double click on this blue text the editor doesn't pops up but comes when we right click on the blue text and click edit
Earlier on double clicking the blue text opens the link popup

It is happening for cms text enabled plugins but not this link.
OK, now I understand. I can confirm the behaviour. 

Will need to take a look to identify the source of the behavior.
Thanks @fsbraun. Please keep us updated thanks.

Fix patch:
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 5718a632b..b8979f568 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,11 +2,18 @@
 Changelog
 =========
 
+5.1.6 (2024-07-18)
+==================
+
+* fix: Allow double-clicks to propagate to CKEditor, e.g., to open the link dialog by @fsbraun in https://github.com/django-cms/djangocms-text-ckeditor/pull/676
+* fix: Let CKEditor decide on size of its panels by @fsbraun in https://github.com/django-cms/djangocms-text-ckeditor/pull/674
+
+
 5.1.5 (2023-11-30)
 ==================
 
 * fix(settings): Extend ALLOW_TOKEN_PARSERS if custom one is provided by @DmytroLitvinov in `#654 <https://github.com/django-cms/djangocms-text-ckeditor/pull/654>`_
-* fix: Support djangocms-picture 2.0.0 and higher in create_picture_plugin by @leture in `#660 <https://github.com/django-cms/djangocms-text-ckeditor/pull/660>`_ 
+* fix: Support djangocms-picture 2.0.0 and higher in create_picture_plugin by @leture in `#660 <https://github.com/django-cms/djangocms-text-ckeditor/pull/660>`_
 * Remove Flash plugin in the default settings by @MacLake in `#656 <https://github.com/django-cms/djangocms-text-ckeditor/pull/656>`_
 * fix: Allow for request-free context objects for testing purposes by @fsbraun in `#659 <https://github.com/django-cms/djangocms-text-ckeditor/pull/659>`_
 * Update test matrix to include Django 5 by @protoroto in `#662 <https://github.com/django-cms/djangocms-text-ckeditor/pull/662>`_
diff --git a/djangocms_text_ckeditor/__init__.py b/djangocms_text_ckeditor/__init__.py
index 9154022f5..2b27aae03 100644
--- a/djangocms_text_ckeditor/__init__.py
+++ b/djangocms_text_ckeditor/__init__.py
@@ -16,6 +16,6 @@
 10. Publish the release when ready
 11. Github actions will publish the new package to pypi
 """
-__version__ = '5.1.5'
+__version__ = '5.1.6'
 
 default_app_config = 'djangocms_text_ckeditor.apps.TextCkeditorConfig'
diff --git a/djangocms_text_ckeditor/static/djangocms_text_ckeditor/ckeditor_plugins/cmsplugins/plugin.js b/djangocms_text_ckeditor/static/djangocms_text_ckeditor/ckeditor_plugins/cmsplugins/plugin.js
index 83d617f1b..afaf25668 100644
--- a/djangocms_text_ckeditor/static/djangocms_text_ckeditor/ckeditor_plugins/cmsplugins/plugin.js
+++ b/djangocms_text_ckeditor/static/djangocms_text_ckeditor/ckeditor_plugins/cmsplugins/plugin.js
@@ -137,7 +137,6 @@
             // if event is a jQuery event (touchend), than we mutate
             // event a bit so we make the payload similar to what ckeditor.event produces
             var handleEdit = function (event) {
-                event.stop();
 
                 if (event.type === 'touchend' || event.type === 'click') {
                     var cmsPluginNode = $(event.currentTarget).closest('cms-plugin')[0];
diff --git a/djangocms_text_ckeditor/static/djangocms_text_ckeditor/js/dist/bundle-9f0bbac8ec.cms.ckeditor.min.js b/djangocms_text_ckeditor/static/djangocms_text_ckeditor/js/dist/bundle-a9032984d4.cms.ckeditor.min.js
similarity index 99%
rename from djangocms_text_ckeditor/static/djangocms_text_ckeditor/js/dist/bundle-9f0bbac8ec.cms.ckeditor.min.js
rename to djangocms_text_ckeditor/static/djangocms_text_ckeditor/js/dist/bundle-a9032984d4.cms.ckeditor.min.js
index 26ea7a08c..99d5f63dd 100644
--- a/djangocms_text_ckeditor/static/djangocms_text_ckeditor/js/dist/bundle-9f0bbac8ec.cms.ckeditor.min.js
+++ b/djangocms_text_ckeditor/static/djangocms_text_ckeditor/js/dist/bundle-a9032984d4.cms.ckeditor.min.js
@@ -1404,6 +1404,6 @@ CKEDITOR.env.webkit&&e.push("float:none;"),e.push('"'),e.push('align="',CKEDITOR
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  */
 CKEDITOR.plugins.add("cmsresize",{init:function(e){function i(i){var t=i.originalEvent.screenX-s.x,r=i.originalEvent.screenY-s.y,a=d.width,c=d.height,l=a+t*("rtl"==o?-1:1),z=c+r;m&&(a=Math.max(n.resize_minWidth,Math.min(l,n.resize_maxWidth))),h&&(c=Math.max(n.resize_minHeight,Math.min(z,n.resize_maxHeight))),e.resize(m?a:null,c)}function t(){CMS.$(CKEDITOR.document.$).off("pointermove",i),CMS.$(CKEDITOR.document.$).off("pointerup",t),e.document&&(CMS.$(e.document.$).off("pointermove",i),CMS.$(e.document.$).off("pointerup",t))}var n=e.config,r=e.ui.spaceId("resizer"),o=e.element?e.element.getDirection(1):"ltr";if(!n.resize_dir&&(n.resize_dir="vertical"),void 0===n.resize_maxWidth&&(n.resize_maxWidth=3e3),void 0===n.resize_maxHeight&&(n.resize_maxHeight=3e3),void 0===n.resize_minWidth&&(n.resize_minWidth=750),void 0===n.resize_minHeight&&(n.resize_minHeight=250),!1!==n.resize_enabled){var s,d,a=null,m=("both"==n.resize_dir||"horizontal"==n.resize_dir)&&n.resize_minWidth!=n.resize_maxWidth,h=("both"==n.resize_dir||"vertical"==n.resize_dir)&&n.resize_minHeight!=n.resize_maxHeight,c=CKEDITOR.tools.addFunction(function(r){a||(a=e.getResizable()),d={width:a.$.offsetWidth||0,height:a.$.offsetHeight||0},s={x:r.screenX,y:r.screenY},n.resize_minWidth>d.width&&(n.resize_minWidth=d.width),n.resize_minHeight>d.height&&(n.resize_minHeight=d.height),CMS.$(CKEDITOR.document.$).on("pointermove",i),CMS.$(CKEDITOR.document.$).on("pointerup",t),e.document&&(CMS.$(e.document.$).on("pointermove",i),CMS.$(e.document.$).on("pointerup",t)),r.preventDefault&&r.preventDefault()});CMS.$(CKEDITOR.document.$).find("html").attr("data-touch-action","none"),e.on("destroy",function(){CKEDITOR.tools.removeFunction(c)}),e.on("uiSpace",function(i){if("bottom"==i.data.space){var t="";m&&!h&&(t=" cke_resizer_horizontal"),!m&&h&&(t=" cke_resizer_vertical");var n='<span id="'+r+'" class="cms-ckeditor-resizer cke_resizer'+t+" cke_resizer_"+o+'" title="'+CKEDITOR.tools.htmlEncode(e.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+c+', event)">'+("ltr"==o?"◢":"◣")+"</span>";"ltr"==o&&"ltr"==t?i.data.html+=n:i.data.html=n+i.data.html}},e,null,100),e.on("maximize",function(i){e.ui.space("resizer")[i.data==CKEDITOR.TRISTATE_ON?"hide":"show"]()})}}})}(CMS.$);
-!function(e){function t(e){var t=(e.match(/<\s*([^>\s]+)[\s\S]*?>/)||[0,!1]).splice(1),n=t.some(function(e){return e&&CKEDITOR.dtd.$block[e]}),i="span";return n&&(i="div"),i}function n(t,n){t.each(function(t,i){var l,a=e(i);l=e("<"+n+">"),e.each(i.attributes,function(e,t){l.attr(t.nodeName,t.nodeValue)}),l.html(a.html()),a.replaceWith(l)})}CKEDITOR&&CKEDITOR.plugins&&CKEDITOR.plugins.registered&&CKEDITOR.plugins.registered.cmsplugins||CKEDITOR.plugins.add("cmsplugins",{icons:"cmsplugins",init:function(t){var n=this;CKEDITOR.on("instanceReady",function(){var e=[];for(var i in t.widgets.instances)t.widgets.instances.hasOwnProperty(i)&&e.push(t.widgets.instances[i]);n.numberOfChildren=CKEDITOR.tools.array.filter(e,function(e){return"cms-widget"===e.name}).length}),this.unsaved_child_plugins=[];var i=CMS.CKEditor.editors[t.id].settings;if(this.setupCancelCleanupCallback(i),void 0===i||void 0===i.plugins)return!1;this.setupDialog(t),t.ui.add("cmsplugins",CKEDITOR.UI_PANELBUTTON,{toolbar:"cms,0",label:i.lang.toolbar,title:i.lang.toolbar,className:"cke_panelbutton__cmsplugins",modes:{wysiwyg:1},editorFocus:0,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(t.config.contentsCss),attributes:{role:"cmsplugins","aria-label":i.lang.aria}},onBlock:function(i,l){l.element.setHtml(t.plugins.cmsplugins.setupDropdown(t)),e(l.element.$).find(".cke_panel_listItem a").bind("click",function(l){l.preventDefault(),n.addPlugin(e(this),i,t)})}}),t.contextMenu&&this.setupContextMenu(t),t.addCommand("cmspluginsEdit",{exec:function(){var e=n.getElementFromSelection(t),i=n.getPluginWidget(e);i&&n.editPlugin(i,t)}});var l=function(n){if(n.stop(),"touchend"===n.type||"click"===n.type){var i,l=e(n.currentTarget).closest("cms-plugin")[0];i=new CKEDITOR.dom.element(l).getParent(),n.data=n.data||{},t.getSelection().fake(i)}t.execCommand("cmspluginsEdit")};t.on("doubleclick",l),t.on("instanceReady",function(){}),this.setupDataProcessor(t)},getElementFromSelection:function(e){var t=e.getSelection();return t.getSelectedElement()||t.getCommonAncestor().getAscendant("cms-plugin",!0)},getPluginWidget:function(e){return e?e.getAscendant("cms-plugin",!0)||e.findOne("cms-plugin"):null},setupDialog:function(t){var n=this,i=function(){return{title:"",minWidth:200,minHeight:200,contents:[{elements:[{type:"html",html:'<iframe style="position:static; width:100%; height:100%; border:none;" />'}]}],onOk:function(i){var l=e(CKEDITOR.dialog.getCurrent().parts.contents.$).find("iframe").contents(),a=l[0].URL;l.find("form").submit();var s=CMS.API.Helpers.onPluginSave;return CMS.API.Helpers.onPluginSave=function(){CKEDITOR.dialog.getCurrent().hide();var e=CMS.API.Helpers.dataBridge,l=!1;return a.match(/add-plugin/)&&(l=!0),!t.config.settings.delete_on_cancel&&l&&n.unsaved_child_plugins.push(e.plugin_id),n.insertPlugin(e,i.sender._.editor),n.numberOfChildren+=1,CMS.API.Helpers.onPluginSave=s,!1},!1}}};CKEDITOR.dialog.add("cmspluginsDialog",i)},setupDropdown:function(t){var n='<div class="cke_panel_block">';return e.each(t.config.settings.plugins,function(t,i){n+='<h1 class="cke_panel_grouptitle">'+i.group+"</h1>",n+='<ul role="presentation" class="cke_panel_list">',e.each(i.items,function(e,t){n+='<li class="cke_panel_listItem"><a href="#" rel="'+t.type+'">'+t.title+"</a></li>"}),n+="</ul>"}),n+="</div>"},setupContextMenu:function(e){var t=this;e.addMenuGroup("cmspluginsGroup"),e.addMenuItem("cmspluginsItem",{label:e.config.settings.lang.edit,icon:e.config.settings.static_url+"/ckeditor_plugins/cmsplugins/icons/cmsplugins.svg",command:"cmspluginsEdit",group:"cmspluginsGroup"}),e.removeMenuItem("image"),e.contextMenu.addListener(function(e){if(t.getPluginWidget(e))return{cmspluginsItem:CKEDITOR.TRISTATE_OFF}})},editPlugin:function(t,n){var i=t.getAttribute("id"),l=CMS.CKEditor.editors[n.id].settings;n.openDialog("cmspluginsDialog");var a=CMS.$(window),s=CKEDITOR.dialog.getCurrent();s.resize(.8*a.width(),.6*a.height()),e(s.getElement().$).addClass("cms-ckeditor-dialog"),e(s.parts.title.$).text(l.lang.edit);var r=l.url||window.location.href,d=encodeURIComponent(window.parent.location.pathname+window.parent.location.search),o=r.replace(/(add-plugin|edit-plugin).*$/,"edit-plugin/"+i+"/?_popup=1&no_preview&cms_history=0&cms_path="+d);e(s.parts.contents.$).find("iframe").attr("src",o).bind("load",function(){var t=e(this).contents();t.find("body").addClass("ckeditor-popup"),t.find(".submit-row").hide(),t.find("#container").css({"min-width":0,padding:0})})},addPlugin:function(e,t,n){var i=CMS.CKEditor.editors[n.id].settings;t.hide(),n.focus(),n.fire("saveSnapshot");var l={placeholder_id:i.placeholder_id,plugin_type:e.attr("rel"),plugin_parent:i.plugin_id,plugin_language:i.plugin_language,plugin_position:i.plugin_position+1+this.numberOfChildren,cms_path:window.parent.location.pathname,cms_history:0};this.addPluginDialog(e,l,n)},addPluginDialog:function(t,n,i){var l=e(window),a=CMS.CKEditor.editors[i.id].settings,s=i.getSelection().getSelectedText();i.openDialog("cmspluginsDialog");var r=CKEDITOR.dialog.getCurrent();r.resize(.8*l.width(),.6*l.height()),e(r.getElement().$).addClass("cms-ckeditor-dialog"),e(r.parts.title.$).text(a.lang.add),e(r.parts.contents.$).find("iframe").attr("src",a.add_plugin_url+"?"+e.param(n)).on("load.addplugin",function(){var t=e(this),n=t.contents();n.find(".submit-row").hide().end().find("#container").css("min-width",0).css("padding",0);var i=n.find(".js-ckeditor-use-selected-text");i.length||(i=n.find("#id_name")),i.val()&&i.val().trim()||i.val(s),t.off("load.addplugin")})},insertPlugin:function(t,n){var i=CMS.CKEditor.editors[n.id].settings;e.ajax({method:"GET",url:i.render_plugin_url,data:{token:i.action_token,plugin:t.plugin_id}}).done(function(e,t,i){CMS.CKEditor.editors[n.id].changed=!0,CMS.CKEditor.editors[n.id].child_changed=!0,200===i.status?n.insertHtml(e,"unfiltered_html"):204===i.status&&n.insertHtml(n.getSelectedHtml().$.textContent),n.fire("updateSnapshot")})},setupCancelCleanupCallback:function(t){if(window.parent&&window.parent.CMS&&window.parent.CMS.API&&window.parent.CMS.API.Helpers){var n=this,i=window.parent.CMS,l=function(l,a){if((t.delete_on_cancel||n.unsaved_child_plugins.length)&&n.unsaved_child_plugins.length){l.preventDefault(),i.API.Toolbar.showLoader();var s={token:t.action_token};t.delete_on_cancel||(s.child_plugins=n.unsaved_child_plugins),e.ajax({method:"POST",url:t.cancel_plugin_url,data:s,traditional:!0}).done(function(){i.API.Helpers.removeEventListener("modal-close.text-plugin.text-plugin-"+t.plugin_id),a.instance.close()}).fail(function(e){i.API.Messages.open({message:e.responseText+" | "+e.status+" "+e.statusText,delay:0,error:!0})})}};i.API.Helpers.addEventListener("modal-close.text-plugin.text-plugin-"+t.plugin_id,l)}},setupDataProcessor:function(i){function l(e){return e.attributes&&"div"===e.attributes["data-cke-real-element-type"]}CKEDITOR.htmlParser.element=CKEDITOR.tools.override(CKEDITOR.htmlParser.element,function(e){return function(t,n){e.call(this,t,n),"cms-plugin"===t&&"span"===n["data-cke-real-element-type"]&&(this._.isBlockLike=!1)}}),i.dataProcessor.dataFilter.addRules({elements:{span:function(t){if(CKEDITOR.plugins.widget.isParserWidgetWrapper(t)){var n=t.getFirst();if(l(n)){var a=new CKEDITOR.htmlParser.element("div",e.extend({},t.attributes));return i.widgets.registered.cmswidget.inline=!1,a.children=t.children,a.removeClass("cke_widget_inline"),a.removeClass("cke_widget_force_block"),a.addClass("cke_widget_block"),n.attributes["data-cke-real-element-type"]="div",a}i.widgets.registered.cmswidget.inline=!0,n.attributes["data-cke-real-element-type"]="span"}return t}}},{priority:1,applyToAll:!0}),i.on("toHtml",function(i){var l=i.data.dataValue.replace(/<cms-plugin(.*?)>([\s\S]*?)<\/cms-plugin>/gi,function(e,n,i){var l=t(i);return n.match(/render-plugin=["']?false/gi)?'<cms-plugin data-cke-real-element-type="'+l+'" '+n+"><"+l+' class="cms-ckeditor-plugin-label">'+n.replace(/[\s\S]*alt=["']([\s\S]*?)['"][\s\S]*/,"$1")+"</"+l+"></cms-plugin>":'<cms-plugin data-cke-real-element-type="'+l+'" '+n+">"+i+"</cms-plugin>"});if(l.match(/<cms-plugin[^>]*(?=data-cke-real-element-type=\"div)/)){var a=/<cms-plugin([^>]*(?=data-cke-real-element-type=\"div)[\s\S]*?>[\s\S]*?<\/)cms-plugin>/g,s=l.replace(a,"<div$1div>"),r=e(s).wrapAll("<div>").parent();n(r.find('div[data-cke-real-element-type="div"]'),"cms-plugin"),l=r.html()}i.data.dataValue=l},null,null,4),i.on("toHtml",function(){i.widgets&&i.widgets.registered&&i.widgets.registered.cmswidget&&(i.widgets.registered.cmswidget.inline=!0)},null,null,1)}})}(CMS.$);
+!function(e){function t(e){var t=(e.match(/<\s*([^>\s]+)[\s\S]*?>/)||[0,!1]).splice(1),n=t.some(function(e){return e&&CKEDITOR.dtd.$block[e]}),i="span";return n&&(i="div"),i}function n(t,n){t.each(function(t,i){var l,a=e(i);l=e("<"+n+">"),e.each(i.attributes,function(e,t){l.attr(t.nodeName,t.nodeValue)}),l.html(a.html()),a.replaceWith(l)})}CKEDITOR&&CKEDITOR.plugins&&CKEDITOR.plugins.registered&&CKEDITOR.plugins.registered.cmsplugins||CKEDITOR.plugins.add("cmsplugins",{icons:"cmsplugins",init:function(t){var n=this;CKEDITOR.on("instanceReady",function(){var e=[];for(var i in t.widgets.instances)t.widgets.instances.hasOwnProperty(i)&&e.push(t.widgets.instances[i]);n.numberOfChildren=CKEDITOR.tools.array.filter(e,function(e){return"cms-widget"===e.name}).length}),this.unsaved_child_plugins=[];var i=CMS.CKEditor.editors[t.id].settings;if(this.setupCancelCleanupCallback(i),void 0===i||void 0===i.plugins)return!1;this.setupDialog(t),t.ui.add("cmsplugins",CKEDITOR.UI_PANELBUTTON,{toolbar:"cms,0",label:i.lang.toolbar,title:i.lang.toolbar,className:"cke_panelbutton__cmsplugins",modes:{wysiwyg:1},editorFocus:0,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(t.config.contentsCss),attributes:{role:"cmsplugins","aria-label":i.lang.aria}},onBlock:function(i,l){l.element.setHtml(t.plugins.cmsplugins.setupDropdown(t)),e(l.element.$).find(".cke_panel_listItem a").bind("click",function(l){l.preventDefault(),n.addPlugin(e(this),i,t)})}}),t.contextMenu&&this.setupContextMenu(t),t.addCommand("cmspluginsEdit",{exec:function(){var e=n.getElementFromSelection(t),i=n.getPluginWidget(e);i&&n.editPlugin(i,t)}});var l=function(n){if("touchend"===n.type||"click"===n.type){var i,l=e(n.currentTarget).closest("cms-plugin")[0];i=new CKEDITOR.dom.element(l).getParent(),n.data=n.data||{},t.getSelection().fake(i)}t.execCommand("cmspluginsEdit")};t.on("doubleclick",l),t.on("instanceReady",function(){}),this.setupDataProcessor(t)},getElementFromSelection:function(e){var t=e.getSelection();return t.getSelectedElement()||t.getCommonAncestor().getAscendant("cms-plugin",!0)},getPluginWidget:function(e){return e?e.getAscendant("cms-plugin",!0)||e.findOne("cms-plugin"):null},setupDialog:function(t){var n=this,i=function(){return{title:"",minWidth:200,minHeight:200,contents:[{elements:[{type:"html",html:'<iframe style="position:static; width:100%; height:100%; border:none;" />'}]}],onOk:function(i){var l=e(CKEDITOR.dialog.getCurrent().parts.contents.$).find("iframe").contents(),a=l[0].URL;l.find("form").submit();var s=CMS.API.Helpers.onPluginSave;return CMS.API.Helpers.onPluginSave=function(){CKEDITOR.dialog.getCurrent().hide();var e=CMS.API.Helpers.dataBridge,l=!1;return a.match(/add-plugin/)&&(l=!0),!t.config.settings.delete_on_cancel&&l&&n.unsaved_child_plugins.push(e.plugin_id),n.insertPlugin(e,i.sender._.editor),n.numberOfChildren+=1,CMS.API.Helpers.onPluginSave=s,!1},!1}}};CKEDITOR.dialog.add("cmspluginsDialog",i)},setupDropdown:function(t){var n='<div class="cke_panel_block">';return e.each(t.config.settings.plugins,function(t,i){n+='<h1 class="cke_panel_grouptitle">'+i.group+"</h1>",n+='<ul role="presentation" class="cke_panel_list">',e.each(i.items,function(e,t){n+='<li class="cke_panel_listItem"><a href="#" rel="'+t.type+'">'+t.title+"</a></li>"}),n+="</ul>"}),n+="</div>"},setupContextMenu:function(e){var t=this;e.addMenuGroup("cmspluginsGroup"),e.addMenuItem("cmspluginsItem",{label:e.config.settings.lang.edit,icon:e.config.settings.static_url+"/ckeditor_plugins/cmsplugins/icons/cmsplugins.svg",command:"cmspluginsEdit",group:"cmspluginsGroup"}),e.removeMenuItem("image"),e.contextMenu.addListener(function(e){if(t.getPluginWidget(e))return{cmspluginsItem:CKEDITOR.TRISTATE_OFF}})},editPlugin:function(t,n){var i=t.getAttribute("id"),l=CMS.CKEditor.editors[n.id].settings;n.openDialog("cmspluginsDialog");var a=CMS.$(window),s=CKEDITOR.dialog.getCurrent();s.resize(.8*a.width(),.6*a.height()),e(s.getElement().$).addClass("cms-ckeditor-dialog"),e(s.parts.title.$).text(l.lang.edit);var r=l.url||window.location.href,d=encodeURIComponent(window.parent.location.pathname+window.parent.location.search),o=r.replace(/(add-plugin|edit-plugin).*$/,"edit-plugin/"+i+"/?_popup=1&no_preview&cms_history=0&cms_path="+d);e(s.parts.contents.$).find("iframe").attr("src",o).bind("load",function(){var t=e(this).contents();t.find("body").addClass("ckeditor-popup"),t.find(".submit-row").hide(),t.find("#container").css({"min-width":0,padding:0})})},addPlugin:function(e,t,n){var i=CMS.CKEditor.editors[n.id].settings;t.hide(),n.focus(),n.fire("saveSnapshot");var l={placeholder_id:i.placeholder_id,plugin_type:e.attr("rel"),plugin_parent:i.plugin_id,plugin_language:i.plugin_language,plugin_position:i.plugin_position+1+this.numberOfChildren,cms_path:window.parent.location.pathname,cms_history:0};this.addPluginDialog(e,l,n)},addPluginDialog:function(t,n,i){var l=e(window),a=CMS.CKEditor.editors[i.id].settings,s=i.getSelection().getSelectedText();i.openDialog("cmspluginsDialog");var r=CKEDITOR.dialog.getCurrent();r.resize(.8*l.width(),.6*l.height()),e(r.getElement().$).addClass("cms-ckeditor-dialog"),e(r.parts.title.$).text(a.lang.add),e(r.parts.contents.$).find("iframe").attr("src",a.add_plugin_url+"?"+e.param(n)).on("load.addplugin",function(){var t=e(this),n=t.contents();n.find(".submit-row").hide().end().find("#container").css("min-width",0).css("padding",0);var i=n.find(".js-ckeditor-use-selected-text");i.length||(i=n.find("#id_name")),i.val()&&i.val().trim()||i.val(s),t.off("load.addplugin")})},insertPlugin:function(t,n){var i=CMS.CKEditor.editors[n.id].settings;e.ajax({method:"GET",url:i.render_plugin_url,data:{token:i.action_token,plugin:t.plugin_id}}).done(function(e,t,i){CMS.CKEditor.editors[n.id].changed=!0,CMS.CKEditor.editors[n.id].child_changed=!0,200===i.status?n.insertHtml(e,"unfiltered_html"):204===i.status&&n.insertHtml(n.getSelectedHtml().$.textContent),n.fire("updateSnapshot")})},setupCancelCleanupCallback:function(t){if(window.parent&&window.parent.CMS&&window.parent.CMS.API&&window.parent.CMS.API.Helpers){var n=this,i=window.parent.CMS,l=function(l,a){if((t.delete_on_cancel||n.unsaved_child_plugins.length)&&n.unsaved_child_plugins.length){l.preventDefault(),i.API.Toolbar.showLoader();var s={token:t.action_token};t.delete_on_cancel||(s.child_plugins=n.unsaved_child_plugins),e.ajax({method:"POST",url:t.cancel_plugin_url,data:s,traditional:!0}).done(function(){i.API.Helpers.removeEventListener("modal-close.text-plugin.text-plugin-"+t.plugin_id),a.instance.close()}).fail(function(e){i.API.Messages.open({message:e.responseText+" | "+e.status+" "+e.statusText,delay:0,error:!0})})}};i.API.Helpers.addEventListener("modal-close.text-plugin.text-plugin-"+t.plugin_id,l)}},setupDataProcessor:function(i){function l(e){return e.attributes&&"div"===e.attributes["data-cke-real-element-type"]}CKEDITOR.htmlParser.element=CKEDITOR.tools.override(CKEDITOR.htmlParser.element,function(e){return function(t,n){e.call(this,t,n),"cms-plugin"===t&&"span"===n["data-cke-real-element-type"]&&(this._.isBlockLike=!1)}}),i.dataProcessor.dataFilter.addRules({elements:{span:function(t){if(CKEDITOR.plugins.widget.isParserWidgetWrapper(t)){var n=t.getFirst();if(l(n)){var a=new CKEDITOR.htmlParser.element("div",e.extend({},t.attributes));return i.widgets.registered.cmswidget.inline=!1,a.children=t.children,a.removeClass("cke_widget_inline"),a.removeClass("cke_widget_force_block"),a.addClass("cke_widget_block"),n.attributes["data-cke-real-element-type"]="div",a}i.widgets.registered.cmswidget.inline=!0,n.attributes["data-cke-real-element-type"]="span"}return t}}},{priority:1,applyToAll:!0}),i.on("toHtml",function(i){var l=i.data.dataValue.replace(/<cms-plugin(.*?)>([\s\S]*?)<\/cms-plugin>/gi,function(e,n,i){var l=t(i);return n.match(/render-plugin=["']?false/gi)?'<cms-plugin data-cke-real-element-type="'+l+'" '+n+"><"+l+' class="cms-ckeditor-plugin-label">'+n.replace(/[\s\S]*alt=["']([\s\S]*?)['"][\s\S]*/,"$1")+"</"+l+"></cms-plugin>":'<cms-plugin data-cke-real-element-type="'+l+'" '+n+">"+i+"</cms-plugin>"});if(l.match(/<cms-plugin[^>]*(?=data-cke-real-element-type=\"div)/)){var a=/<cms-plugin([^>]*(?=data-cke-real-element-type=\"div)[\s\S]*?>[\s\S]*?<\/)cms-plugin>/g,s=l.replace(a,"<div$1div>"),r=e(s).wrapAll("<div>").parent();n(r.find('div[data-cke-real-element-type="div"]'),"cms-plugin"),l=r.html()}i.data.dataValue=l},null,null,4),i.on("toHtml",function(){i.widgets&&i.widgets.registered&&i.widgets.registered.cmswidget&&(i.widgets.registered.cmswidget.inline=!0)},null,null,1)}})}(CMS.$);
 });
 })(CMS.$);
diff --git a/djangocms_text_ckeditor/widgets.py b/djangocms_text_ckeditor/widgets.py
index 0092b2802..18eae6a95 100644
--- a/djangocms_text_ckeditor/widgets.py
+++ b/djangocms_text_ckeditor/widgets.py
@@ -17,7 +17,7 @@
 
 
 # this path is changed automatically whenever you run `gulp bundle`
-PATH_TO_JS = 'djangocms_text_ckeditor/js/dist/bundle-9f0bbac8ec.cms.ckeditor.min.js'
+PATH_TO_JS = 'djangocms_text_ckeditor/js/dist/bundle-a9032984d4.cms.ckeditor.min.js'
 
 
 class TextEditorWidget(forms.Textarea):
diff --git a/package-lock.json b/package-lock.json
index bd4b4c8db..08699154e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -631,15 +631,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
@@ -650,15 +641,15 @@
       }
     },
     "node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+      "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
       "dev": true,
       "dependencies": {
-        "kind-of": "^6.0.0"
+        "hasown": "^2.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.4"
       }
     },
     "node_modules/nanomatch/node_modules/arr-diff": {
@@ -1539,15 +1530,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/serve-index/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/flush-write-stream": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
@@ -1920,18 +1902,6 @@
       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
       "dev": true
     },
-    "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/glob-watcher/node_modules/extend-shallow": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
@@ -2381,12 +2351,6 @@
       "integrity": "sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==",
       "dev": true
     },
-    "node_modules/duplexer2/node_modules/string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-      "dev": true
-    },
     "node_modules/vinyl-file/node_modules/vinyl": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
@@ -2740,19 +2704,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/gulp-cli/node_modules/wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/for-in": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -3355,15 +3306,6 @@
       "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==",
       "dev": true
     },
-    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/duplexer2/node_modules/readable-stream": {
       "version": "1.1.14",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
@@ -3629,10 +3571,13 @@
       }
     },
     "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/yargs/node_modules/ansi-regex": {
       "version": "5.0.1",
@@ -3856,18 +3801,6 @@
         "node": ">= 0.10.0"
       }
     },
-    "node_modules/class-utils/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/ignore": {
       "version": "3.3.10",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
@@ -3887,15 +3820,15 @@
       }
     },
     "node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+      "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
       "dev": true,
       "dependencies": {
-        "kind-of": "^6.0.0"
+        "hasown": "^2.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.10"
       }
     },
     "node_modules/glob-watcher/node_modules/fill-range": {
@@ -4515,18 +4448,6 @@
       "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==",
       "dev": true
     },
-    "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-      "dev": true,
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/cliui/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -4805,18 +4726,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/class-utils/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
-      "dev": true,
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -5272,12 +5181,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/localtunnel/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
     "node_modules/escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -5699,6 +5602,18 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/buffer-equal": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
@@ -5781,15 +5696,6 @@
         "node": "*"
       }
     },
-    "node_modules/phantomjs-prebuilt/node_modules/jsonfile": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
-      "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
-      "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
     "node_modules/lodash.isarray": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
@@ -5973,17 +5879,16 @@
       }
     },
     "node_modules/class-utils/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
       "dev": true,
       "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.4"
       }
     },
     "node_modules/limiter": {
@@ -6087,15 +5992,6 @@
       "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
       "dev": true
     },
-    "node_modules/vinyl-file/node_modules/clone": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
     "node_modules/gulp-cli/node_modules/get-caller-file": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
@@ -6703,15 +6599,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/snapdragon/node_modules/source-map": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@@ -7836,17 +7723,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/gulp-cli/node_modules/cliui": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-      "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      }
-    },
     "node_modules/async-settle": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
@@ -9789,55 +9665,14 @@
             "is-descriptor": "^0.1.0"
           }
         },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
         "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "version": "0.1.7",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+          "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
           "dev": true,
           "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
+            "is-accessor-descriptor": "^1.0.1",
+            "is-data-descriptor": "^1.0.1"
           }
         }
       }
@@ -9874,12 +9709,6 @@
           "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
           "dev": true
         },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
         "string-width": {
           "version": "4.2.3",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -10338,12 +10167,6 @@
             "isarray": "0.0.1",
             "string_decoder": "~0.10.x"
           }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-          "dev": true
         }
       }
     },
@@ -11403,9 +11226,9 @@
       "optional": true
     },
     "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "dev": true
     },
     "generate-function": {
@@ -11876,33 +11699,12 @@
         "yargs": "^7.1.0"
       },
       "dependencies": {
-        "cliui": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-          "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wrap-ansi": "^2.0.0"
-          }
-        },
         "get-caller-file": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
           "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
           "dev": true
         },
-        "wrap-ansi": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-          "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1"
-          }
-        },
         "y18n": {
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
@@ -12301,6 +12103,15 @@
         "pinkie-promise": "^2.0.0"
       }
     },
+    "hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.2"
+      }
+    },
     "homedir-polyfill": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
@@ -12452,20 +12263,12 @@
       }
     },
     "is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+      "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
       "dev": true,
       "requires": {
-        "kind-of": "^6.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-          "dev": true
-        }
+        "hasown": "^2.0.0"
       }
     },
     "is-arrayish": {
@@ -12499,20 +12302,12 @@
       }
     },
     "is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+      "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
       "dev": true,
       "requires": {
-        "kind-of": "^6.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-          "dev": true
-        }
+        "hasown": "^2.0.0"
       }
     },
     "is-descriptor": {
@@ -13031,12 +12826,6 @@
           "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
           "dev": true
         },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
         "string-width": {
           "version": "4.2.3",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -14052,22 +13841,6 @@
               "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
             }
           }
-        },
-        "jsonfile": {
-          "version": "2.4.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
-          "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "4.2.4"
-          },
-          "dependencies": {
-            "graceful-fs": {
-              "version": "4.2.4",
-              "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-              "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
-            }
-          }
         }
       }
     },
@@ -14729,12 +14502,6 @@
         "parseurl": "~1.3.2"
       },
       "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-          "dev": true
-        },
         "http-errors": {
           "version": "1.6.3",
           "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
@@ -16031,12 +15798,6 @@
         "vinyl": "^1.1.0"
       },
       "dependencies": {
-        "clone": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-          "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
-          "dev": true
-        },
         "clone-stats": {
           "version": "0.0.1",
           "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
diff --git a/tox.ini b/tox.ini
index 5586d908c..bcfa734bc 100644
--- a/tox.ini
+++ b/tox.ini
@@ -3,16 +3,21 @@ envlist =
     flake8
     isort
     frontend
-    py{37,38,39}-dj{22}-cms{37,38,40}
+    py{37,38,39}-dj{22}-cms{37,38}
     py{37,38,39}-dj{31}-cms{38,39}
-    py{38,39,310}-dj{32}-cms{39,310,311,41}
-    py{38,39,310}-dj{40}-cms{311,41}
-    py{38,39,310}-dj{41}-cms{311,41}
-    py{38,39,310}-dj{42}-cms{311,41}
+    py{38,39,310}-dj{32}-cms{39,310,311}
+    py{39,310}-dj{40}-cms{311,41}
+    py{39,310}-dj{41}-cms{311,41}
+    py{39,310}-dj{42}-cms{311,41}
     py{310}-dj{50}-cms{41}
 
 skip_missing_interpreters=True
 
+allowlist_exiternals =
+    nvm
+    npm
+    gulp
+
 [testenv]
 deps =
     -r{toxinidir}/tests/requirements/base.txt


Test patch:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index de9366d56..babd13f10 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -12,7 +12,6 @@ jobs:
         requirements-file: [
           dj22_cms37.txt,
           dj22_cms38.txt,
-          dj22_cms40.txt,
           dj31_cms38.txt,
           dj32_cms39.txt,
           dj32_cms310.txt,
@@ -23,8 +22,9 @@ jobs:
           dj41_cms311.txt,
           dj41_cms41.txt,
           dj42_cms311.txt,
+          dj42_cms40.txt,
           dj42_cms41.txt,
-          dj50_cms41.txt
+          dj50_cms41.txt,
         ]
         os: [
           ubuntu-20.04,
@@ -42,6 +42,8 @@ jobs:
             requirements-file: dj41_cms41.txt
           - python-version: 3.7
             requirements-file: dj42_cms311.txt
+          - python-version: 3.7
+            requirements-file: dj42_cms40.txt
           - python-version: 3.7
             requirements-file: dj42_cms41.txt
           - python-version: 3.7
@@ -49,19 +51,21 @@ jobs:
           - python-version: 3.8
             requirements-file: dj50_cms41.txt
           - python-version: 3.8
-            requirements-file: dj41_cms41.txt
+            requirements-file: dj32_cms41.txt
           - python-version: 3.8
             requirements-file: dj40_cms41.txt
           - python-version: 3.8
-            requirements-file: dj32_cms41.txt
+            requirements-file: dj41_cms41.txt
+          - python-version: 3.8
+            requirements-file: dj42_cms41.txt
           - python-version: 3.8
             requirements-file: dj42_cms41.txt
           - python-version: 3.9
             requirements-file: dj50_cms41.txt
-          - python-version: "3.10"
-            requirements-file: dj22_cms40.txt
-          - python-version: "3.11"
-            requirements-file: dj22_cms40.txt
+          - python-version: 3.11
+            requirements-file: dj42_cms40.txt
+          - python-version: 3.12
+            requirements-file: dj40_cms40.txt
     steps:
     - uses: actions/checkout@v1
     - name: Set up Python ${{ matrix.python-version }}
diff --git a/tests/requirements/base.txt b/tests/requirements/base.txt
index 9d1b92498..92c95e771 100644
--- a/tests/requirements/base.txt
+++ b/tests/requirements/base.txt
@@ -1,5 +1,5 @@
 # requirements from setup.py
-django-filer>=1.4.0
+django-filer>=1.4.0, <3.2.0
 djangocms-picture>=2.1.0
 djangocms-link>=2.2.1
 django-polymorphic>=2.0.3
diff --git a/tests/requirements/dj22_cms40.txt b/tests/requirements/dj22_cms40.txt
deleted file mode 100644
index da3a056b0..000000000
--- a/tests/requirements/dj22_cms40.txt
+++ /dev/null
@@ -1,6 +0,0 @@
--r base.txt
-django-mptt
-django-treebeard<4.5
-
-Django>=2.2,<2.3
-git+https://github.com/django-cms/django-cms@release/4.0.x#egg=django-cms
diff --git a/tests/requirements/dj32_cms41.txt b/tests/requirements/dj32_cms41.txt
index e62655f0c..701f4ca50 100644
--- a/tests/requirements/dj32_cms41.txt
+++ b/tests/requirements/dj32_cms41.txt
@@ -1,4 +1,4 @@
 -r base.txt
 
 Django>=3.2,<3.3
-git+https://github.com/django-cms/django-cms@develop-4#egg=django-cms
+django-cms>=4.1, <4.2
diff --git a/tests/requirements/dj41_cms41.txt b/tests/requirements/dj41_cms41.txt
index 3c7d239e6..c64bdd2f1 100644
--- a/tests/requirements/dj41_cms41.txt
+++ b/tests/requirements/dj41_cms41.txt
@@ -1,4 +1,4 @@
 -r base.txt
 
 Django>=4.1,<4.2
-git+https://github.com/django-cms/django-cms@develop-4#egg=django-cms
+django-cms>=4.1, <4.2
diff --git a/tests/requirements/dj42_cms40.txt b/tests/requirements/dj42_cms40.txt
new file mode 100644
index 000000000..2adaa1434
--- /dev/null
+++ b/tests/requirements/dj42_cms40.txt
@@ -0,0 +1,4 @@
+-r base.txt
+
+Django>=4.2,<4.3
+git+https://github.com/django-cms/django-cms@release/4.0.1.x#egg=django-cms
diff --git a/tests/requirements/dj42_cms41.txt b/tests/requirements/dj42_cms41.txt
index 9ba7dec2e..348a25573 100644
--- a/tests/requirements/dj42_cms41.txt
+++ b/tests/requirements/dj42_cms41.txt
@@ -1,4 +1,4 @@
 -r base.txt
 
 Django>=4.2,<5.0
-git+https://github.com/django-cms/django-cms@develop-4#egg=django-cms
\ No newline at end of file
+django-cms>=4.1, <4.2
diff --git a/tests/requirements/dj50_cms41.txt b/tests/requirements/dj50_cms41.txt
index 562a7ef4a..7586a949c 100644
--- a/tests/requirements/dj50_cms41.txt
+++ b/tests/requirements/dj50_cms41.txt
@@ -1,4 +1,4 @@
 -r base.txt
 
 Django~=5.0rc1,<5.1
-git+https://github.com/django-cms/django-cms@develop-4#egg=django-cms
\ No newline at end of file
+django-cms>=4.1, <4.2