@nicobarbieri/quickctx
Version:
Fast & easy custom context menus for your web projects.
3 lines (2 loc) • 23.1 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).QuickCTX={})}(this,(function(e){"use strict";function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=Array(t);n<t;n++)i[n]=e[n];return i}function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,l(i.key),i)}}function o(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function s(e,t,n){return(t=l(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){s(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function u(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||d(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function d(e,n){if(e){if("string"==typeof e)return t(e,n);var i={}.toString.call(e).slice(8,-1);return"Object"===i&&e.constructor&&(i=e.constructor.name),"Map"===i||"Set"===i?Array.from(e):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?t(e,n):void 0}}var m=function(){function e(t){var i=this,o=t.id,s=void 0===o?crypto.randomUUID():o,a=t.label,r=t.type,u=void 0===r?"action":r,l=t.action,c=t.targetTypes,d=void 0===c?["*"]:c,m=t.subCommands,h=void 0===m?[]:m,v=t.iconClass,g=void 0===v?null:v,p=t.disabled,f=void 0!==p&&p,b=t.visible,y=void 0===b||b,E=t.order,C=void 0===E?0:E,_=t.content,M=void 0===_?null:_;if(n(this,e),"separator"===this.type&&!a)throw new Error("MenuCommand (ID: ".concat(s,"): 'label' is required for types other than 'separator'."));this.id=s,this.label=a,this.type=u,this.action=l,this.targetTypes=Array.isArray(d)&&d.length>0?d:["*"],this.subCommands=h.map((function(t){var n=t instanceof e?t:new e(t);return n.parentCommand=i,n})),this.iconClass=g,this.disabled=f,this.visible=y,this.order=C,this.content=M}return o(e,null,[{key:"Separator",value:function(){return new e({type:"separator",content:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null})}}])}();function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=document.createElement(e);t&&(Array.isArray(t)?t.flatMap((function(e){return e.split(" ")})):u(t.split(" "))).forEach((function(e){return e&&o.classList.add(e)}));for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&o.setAttribute(s,n[s]);return i&&(o.textContent=i),o}var v=function(){return o((function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};n(this,e);var i={defaultTrigger:"contextmenu",overlapStrategy:"closest",globalFilterStrategy:"hide",classes:{container:"quickctx-container",header:"quickctx-header",list:"quickctx-list",item:"quickctx-item",separator:"quickctx-separator",sublist:"quickctx-sublist",sublistCommand:"quickctx-sublist-command",disabled:"quickctx-item--disabled",hidden:"quickctx-item--hidden",icon:"quickctx-icon",opening:"quickctx--opening",open:"quickctx--open",closing:"quickctx--closing"},animations:{submenuOpenDelay:150,menuOpenDuration:200,menuCloseDuration:200,hoverMenuOpenDelay:450,hoverMenuCloseDelay:300,submenuCloseDelay:200}};this.options=r(r(r({},i),t),{},{classes:r(r({},i.classes),t.classes||{}),animations:r(r({},i.animations),t.animations||{})}),this.logger=console.log,this.loggerIsEnabled=!1,this.menuConfigurations={},this.registeredActions={},this.functionActionMap=new Map,this.activeMenuElement=null,this.currentTargetElement=null,this.activeSubmenus=[],this.menuHideTimeout=null,this.hoverHideTimeout=null,this.hoverOpenTimeout=null,this.submenuCloseTimeout=null,this._boundHandleTrigger=this._handleTriggerEvent.bind(this),this._boundHandleKeydown=this._handleKeydown.bind(this),this._boundOutsideClick=this._handleOutsideClick.bind(this),this._boundScheduleAllSubmenusClose=this._scheduleAllSubmenusClose.bind(this),this._boundCancelAllSubmenusClose=this._cancelAllSubmenusClose.bind(this),this._boundHandleHoverEnter=this._cancelHoverHide.bind(this),this._boundHandleHoverLeave=this._scheduleHoverHide.bind(this),this._boundCancelHoverOpen=this._cancelHoverOpen.bind(this),this._init()}),[{key:"updateOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=r(r(r({},this.options),e),{},{classes:r(r({},this.options.classes),e.classes||{}),animations:r(r({},this.options.animations),e.animations||{})}),this._log({event:"updateOptions",message:"Updating options...",data:this.options}),this._setupEventListeners()}},{key:"setLogger",value:function(e){"function"==typeof e?this.logger=e:(console.warn("Logger must be a function. Default logging will be used."),this.logger=console.log)}},{key:"setLoggerIsEnabled",value:function(e){this.loggerIsEnabled=!!e}},{key:"_log",value:function(e){this.loggerIsEnabled&&this.logger(r(r({},e),{},{timestamp:new Date}))}},{key:"_init",value:function(){this._log({event:"init",message:"Initializing QuickCTX"}),this._setupEventListeners(),this._log({event:"init",message:"QuickCTX initialized"})}},{key:"_setupEventListeners",value:function(){var e=this,t=["contextmenu","click","dblclick","mouseover","mouseout"];t.forEach((function(t){document.removeEventListener(t,e._boundHandleTrigger)}));var n=new Set([this.options.defaultTrigger]);Object.values(this.menuConfigurations).forEach((function(e){e.triggerEvent&&("hover"===e.triggerEvent?["mouseover","mouseout"]:[e.triggerEvent]).forEach((function(e){return n.add(e)}))})),n.forEach((function(n){t.includes(n)&&document.addEventListener(n,e._boundHandleTrigger)})),this._log({event:"setupListeners",message:"Event listeners set up",data:{activeTriggers:Array.from(n)}})}},{key:"_handleTriggerEvent",value:function(e){var t=this;if(this._log({event:"handleTrigger",message:"Handling trigger event: ".concat(e.type),data:{target:e.target}}),"mouseout"!==e.type){var n="deepest"===this.options.overlapStrategy&&e.target.matches("[data-custom-ctxmenu]")?e.target:e.target.closest("[data-custom-ctxmenu]");if(n){var i=n.getAttribute("data-custom-ctxmenu");if(!i)throw this._log({event:"handleTrigger",message:"No menu ID found on target element: ".concat(n.tagName),data:{targetElementId:n.id||"unknown"},isError:!0}),new Error("No menu ID found on target element: ".concat(n.tagName));var o=this.menuConfigurations[i];if(!o)throw this._log({event:"handleTrigger",message:"No menu configuration found for ID: ".concat(i),data:{menuId:i},isError:!0}),new Error("No menu configuration found for ID: ".concat(i));var s="mouseover"===e.type?"hover":e.type,a=o.triggerEvent||this.options.defaultTrigger;s===a&&("hover"===a&&this.currentTargetElement===n||("hover"===s&&this.options.animations.hoverMenuOpenDelay>0?(this._cancelHoverOpen(),this.hoverOpenTimeout=setTimeout((function(){t._openMenu(o,n,e,a,i)}),this.options.animations.hoverMenuOpenDelay)):this._openMenu(o,n,e,a,i)))}}else this._cancelHoverOpen()}},{key:"_handleKeydown",value:function(e){"Escape"===e.key&&this._hideMenu(this.activeMenuElement,!1)}},{key:"_handleOutsideClick",value:function(e){if(this.activeMenuElement&&!this.activeMenuElement.classList.contains(this.options.classes.opening)&&!this.activeMenuElement.contains(e.target)){var t,n=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=d(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,o=function(){};return{s:o,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,r=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){r=!0,s=e},f:function(){try{a||null==n.return||n.return()}finally{if(r)throw s}}}}(this.activeSubmenus);try{for(n.s();!(t=n.n()).done;){var i=t.value;if(i.element&&i.element.contains(e.target))return}}catch(e){n.e(e)}finally{n.f()}this._hideMenu(this.activeMenuElement,!1)}}},{key:"_setupHoverListeners",value:function(e,t){e.addEventListener("mouseleave",this._boundHandleHoverLeave),t.addEventListener("mouseleave",this._boundHandleHoverLeave),e.addEventListener("mouseenter",this._boundHandleHoverEnter),t.addEventListener("mouseenter",this._boundHandleHoverEnter)}},{key:"_openMenu",value:function(e,t,n,i,o){this.activeMenuElement&&!this.activeMenuElement.classList.contains(this.options.classes.closing)&&this._hideMenu(this.activeMenuElement,!1),n.preventDefault(),n.stopPropagation(),this.currentTargetElement=t;var s=t.getAttribute("data-custom-ctxmenu-type")||"default",a=h("div",this.options.classes.container);Object.assign(a.style,{position:"fixed",zIndex:"10000",display:"none"}),document.body.appendChild(a),this.activeMenuElement=a,this._buildAndShowMenu(e,t,s,n.clientX,n.clientY),this._log({event:"_openMenu",message:"Opened menu ".concat(o," for target type: ").concat(s)}),"hover"===i&&this._setupHoverListeners(t,this.activeMenuElement)}},{key:"_scheduleHoverHide",value:function(){var e=this;this._cancelHoverHide(),this.hoverHideTimeout=setTimeout((function(){e._hideMenu(e.activeMenuElement)}),this.options.animations.hoverMenuCloseDelay)}},{key:"_cancelHoverHide",value:function(){this.hoverHideTimeout&&(clearTimeout(this.hoverHideTimeout),this.hoverHideTimeout=null)}},{key:"_cancelHoverOpen",value:function(){this.hoverOpenTimeout&&(clearTimeout(this.hoverOpenTimeout),this.hoverOpenTimeout=null)}},{key:"_scheduleSubmenuOpen",value:function(e,t,n){var i=this;this._cancelSubmenuOpen(e),e.openTimeout=setTimeout((function(){i._openSubmenu(e,t,n)}),this.options.animations.submenuOpenDelay)}},{key:"_cancelSubmenuOpen",value:function(e){e.openTimeout&&(clearTimeout(e.openTimeout),e.openTimeout=null)}},{key:"_openSubmenu",value:function(e,t,n){var i;if(null===(i=e.submenuElement)||void 0===i||!i.classList.contains(this.options.classes.open)){var o=e.submenuElement;o&&document.body.contains(o)||(o=h("div",[this.options.classes.container,this.options.classes.sublist]),Object.assign(o.style,{position:"fixed",zIndex:"10001",display:"none"}),document.body.appendChild(o),e.submenuElement=o),o.addEventListener("mouseenter",this._boundCancelAllSubmenusClose),o.addEventListener("mouseleave",this._boundScheduleAllSubmenusClose);var s=t.getBoundingClientRect();this._buildAndShowMenu({commands:e.subCommands},n,n.dataset.customCtxmenuType||"default",s.right,s.top,o,e)}}},{key:"_scheduleAllSubmenusClose",value:function(){var e=this;this._cancelAllSubmenusClose(),this.submenuCloseTimeout=setTimeout((function(){e._closeSubmenus()}),this.options.animations.submenuCloseDelay)}},{key:"_cancelAllSubmenusClose",value:function(){clearTimeout(this.submenuCloseTimeout)}},{key:"_closeSiblingSubmenus",value:function(e){for(var t=new Set,n=e;n;)t.add(n),n=n.parentCommand;for(var i=this.activeSubmenus.length-1;i>=0;i--){var o=this.activeSubmenus[i];t.has(o.parentCommand)||(this._closeSingleSubmenu(o),this.activeSubmenus.splice(i,1))}}},{key:"_closeSingleSubmenu",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.element;n&&(n.removeEventListener("mouseenter",this._cancelSubmenuClose),n.removeEventListener("mouseleave",this._scheduleSubmenuClose),t?n.parentElement&&document.body.removeChild(n):(n.classList.remove(this.options.classes.open),n.classList.add(this.options.classes.closing),setTimeout((function(){n.parentElement&&document.body.removeChild(n)}),this.options.animations.menuCloseDuration)))}},{key:"_closeSubmenus",value:function(){for(var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=function(){var t=e.activeSubmenus.pop();if(!t)return 1;var i=t.element,o=function(){i.style.display="none",i.classList.remove(e.options.classes.open,e.options.classes.opening,e.options.classes.closing),i.innerHTML="",i.parentElement===document.body&&document.body.removeChild(i)};n?o():(i.classList.remove(e.options.classes.open),i.classList.add(e.options.classes.closing),setTimeout(o,e.options.animations.menuCloseDuration))};this.activeSubmenus.length>t;)i()}},{key:"_hideMenu",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e){this._log({event:"hideMenu",message:"Hiding menu: ".concat(this.activeMenuElement?this.activeMenuElement.id:"none"),data:{activeMenuId:this.activeMenuElement?this.activeMenuElement.id:null}}),this._closeSubmenus(0,n);var i=function(){e.parentElement&&e.parentElement.removeChild(e),t.activeMenuElement===e&&(t.activeMenuElement=null,t.currentTargetElement=null,document.removeEventListener("click",t._boundOutsideClick,!0),document.removeEventListener("keydown",t._boundHandleKeydown))};n||0===this.options.animations.menuCloseDuration?i():(e.classList.remove(this.options.classes.open,this.options.classes.opening),e.classList.add(this.options.classes.closing),setTimeout(i,this.options.animations.menuCloseDuration)),this._log({event:"hideMenu",message:"Menu hidden successfully",data:{activeMenuId:this.activeMenuElement?this.activeMenuElement.id:null}})}}},{key:"_createMenuItemDOM",value:function(e,t,n,i){var o,s=this;this._log({event:"createMenuItemDOM",message:"Creating DOM for command: ".concat(e.label),data:{commandId:e.id,targetElementId:t.id||"unknown",isDisabled:n,isSubmenuItem:i}});var a=h("li",[this.options.classes.item]);if(a.style.position="relative","separator"===e.type)return a.classList.add(this.options.classes.separator),e.content&&(a.classList.add("quickctx-subheader"),"string"==typeof e.content?a.textContent=e.content:e.content instanceof HTMLElement&&a.appendChild(e.content)),a;if(n&&a.classList.add(this.options.classes.disabled),e.iconClass){var r=h("span",this.options.classes.icon);e.iconClass.split(" ").filter(Boolean).forEach((function(e){return r.classList.add(e,e.replace(".","_"))})),a.appendChild(r)}return a.innerHTML=a.innerHTML+e.label,e.element=a,a.addEventListener("mouseenter",(function(){var i;n||(s._boundCancelAllSubmenusClose(),s._closeSiblingSubmenus(e),"sublist"===e.type&&(null===(i=e.subCommands)||void 0===i?void 0:i.length)>0&&s._scheduleSubmenuOpen(e,a,t))})),a.addEventListener("mouseleave",this._boundScheduleAllSubmenusClose),"sublist"===e.type&&(null===(o=e.subCommands)||void 0===o?void 0:o.length)>0&&(a.classList.add(this.options.classes.sublistCommand,"has-submenu-arrow"),a.appendChild(h("span","submenu-arrow",{}," ▶"))),"action"===e.type&&a.addEventListener("click",(function(t){var i,o;if(t.stopPropagation(),!n){var a=e.action;if("string"==typeof a&&(a=s.registeredActions[a]),"undefined"===a)throw s._log({event:"actionError",message:'No action registered for command "'.concat(e.label,'"'),data:{commandId:e.id,commandLabel:e.label},isError:!0}),new Error('No action registered for command "'.concat(e.label,'"'));if("function"==typeof a)try{a({target:s.currentTargetElement,command:e})}catch(t){throw s._log({event:"actionError",message:'Error executing action for command "'.concat(e.label,'"'),data:{commandId:e.id,commandLabel:e.label,error:err.message},isError:!0}),new Error('Error executing action for command "'.concat(e.label,'": ').concat(err.message))}null===(i=s.currentTargetElement)||void 0===i||i.dispatchEvent(new CustomEvent("QuickCTXActionSelected",{detail:{commandId:e.id,commandLabel:e.label,targetElement:s.currentTargetElement,targetType:null===(o=s.currentTargetElement)||void 0===o?void 0:o.dataset.customCtxmenuType},bubbles:!0,composed:!0})),s._hideMenu(s.activeMenuElement)}})),a}},{key:"_buildAndShowMenu",value:function(e,t,n,i,o){var s=this,a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null;this._log({event:"buildMenu",message:"Building menu for target type: ".concat(n),data:{targetElementId:t.id||"unknown",parentMenuId:a?a.id:null}});var u=a||this.activeMenuElement;a&&this.activeSubmenus.push({element:u,parentCommand:r}),u.innerHTML="";var l=(e.headerText||e.headerTextTemplate||"").replace(/{type}/g,n);!a&&l&&u.appendChild(h("div",this.options.classes.header,{},l));var c=h("ul",this.options.classes.list),d=0;return e.commands.forEach((function(i){r&&(i.parentCommand=r);var o=i.targetTypes.includes("*")||i.targetTypes.includes(n);if(i.visible){var a=i.disabled;if(!o){if("hide"===(e.filterStrategy||s.options.globalFilterStrategy))return;a=!0}c.appendChild(s._createMenuItemDOM(i,t,a)),d++}})),d>0?(u.appendChild(c),this._showMenuDOM(u,i,o,r),a||(document.addEventListener("click",this._boundOutsideClick,!0),document.addEventListener("keydown",this._boundHandleKeydown))):this._hideMenu(this.activeMenuElement,!0),0===d?(a?null==r||r.element.classList.remove("has-submenu-arrow"):this._hideMenu(this.activeMenuElement,!0),null):(u.appendChild(c),this._showMenuDOM(u,i,o,t,null!==a,r),a||(document.addEventListener("click",this._boundOutsideClick,!0),document.addEventListener("keydown",this._boundHandleKeydown)),u)}},{key:"_showMenuDOM",value:function(e,t,n,i,o,s){e.style.display="block",e.classList.remove(this.options.classes.closing),e.classList.add(this.options.classes.opening);var a=e.getBoundingClientRect(),r=window.innerWidth,u=window.innerHeight;if(o&&null!=s&&s.element){var l=s.element.getBoundingClientRect();t=l.right-5,n=l.top}t+a.width>r&&(t=o?t-a.width-((null==s?void 0:s.element.getBoundingClientRect().width)||0)+10:r-a.width-10),t<10&&(t=10),n+a.height>u&&(n=u-a.height-10),n<10&&(n=10),e.style.left="".concat(t,"px"),e.style.top="".concat(n,"px"),e.offsetWidth,e.classList.remove(this.options.classes.opening),e.classList.add(this.options.classes.open)}},{key:"registerAction",value:function(e,t){"function"==typeof t||null===t?this.registeredActions[e]=t:console.error('Callback for action "'.concat(e,'" must be a function or null.'))}},{key:"addMenuConfiguration",value:function(e){if(!e.id)throw this._log({event:"addMenuConfiguration",message:"Failed to add menu configuration: ID is required.",isError:!0}),new Error("ID is required for menu configuration.");this.menuConfigurations[e.id]&&!this.menuConfigurations[e.id].isHtmlSource&&this._log({event:"addMenuConfiguration",message:"Overwriting existing menu configuration with ID: ".concat(e.id)});var t=Array.isArray(e.commands)?e.commands.map((function(e){return e instanceof m?e:new m(e)})).sort((function(e,t){return e.order-t.order})):[];this.menuConfigurations[e.id]=r(r({},e),{},{commands:t,triggerEvent:e.triggerEvent||this.options.defaultTrigger,filterStrategy:e.filterStrategy||this.options.globalFilterStrategy}),this._log({event:"addMenuConfiguration",message:"Menu configuration added for ID: ".concat(e.id),data:{commandsCount:t.length,filterStrategy:this.menuConfigurations[e.id].filterStrategy}}),this._setupEventListeners()}},{key:"updateMenuConfiguration",value:function(e,t){this.menuConfigurations[e]?(this.menuConfigurations[e]=r(r({},this.menuConfigurations[e]),t),this._setupEventListeners(),this._log({event:"updateMenuConfiguration",message:'Menu "'.concat(e,'" updated successfully.'),data:{newOptions:t}})):this._log({event:"updateMenuConfiguration",message:'Menu with ID "'.concat(e,'" not found.'),isError:!0})}},{key:"bindMenuToElements",value:function(e,t,n){var i="string"==typeof e?document.querySelectorAll(e):Array.isArray(e)?e:[e];i.forEach((function(e){e instanceof HTMLElement&&(e.dataset.customCtxmenu=t,e.dataset.customCtxmenuType=n)})),this._log({event:"bindMenuToElements",message:"Bound menu ".concat(t," to elements of type ").concat(n),data:{elementsCount:i.length,menuId:t,type:n}})}},{key:"unbindMenuFromElements",value:function(e){var t="string"==typeof e?document.querySelectorAll(e):Array.isArray(e)?e:[e];t.forEach((function(e){e instanceof HTMLElement&&(delete e.dataset.customCtxmenu,delete e.dataset.customCtxmenuType)})),this._log({event:"unbindMenuFromElements",message:"Unbound menu from elements",data:{elementsCount:t.length,selectorOrElements:e}})}},{key:"createAndBindMenu",value:function(e){var t=this,n=e.menuId,i=e.defaultTargetType,o=e.selector,s=e.structure,a=e.headerText,u=e.triggerEvent,l=e.filterStrategy;if(!n||!s)throw this._log({event:"createAndBindMenu",message:"Failed to create and bind menu: missing required parameters.",isError:!0}),new Error("`menuId` and `structure` are required for createAndBindMenu.");var d=function(e,n){return e.map((function(e){var i=e instanceof m||"object"===c(e)&&null!==e?r({},e):null;if("object"!==c(i)||null===i)return null;if(i.subCommands&&Array.isArray(i.subCommands)&&i.subCommands.length>0&&(i.type="sublist",i.subCommands=d(i.subCommands,n)),"function"==typeof i.action){var o=i.action,s=t.functionActionMap.get(o);s||(s="quickctx-action-".concat(crypto.randomUUID()),t.registerAction(s,o),t.functionActionMap.set(o,s)),i.action=s}return!i.targetTypes&&n&&(i.targetTypes=[n]),new m(i)})).filter(Boolean)};this._log({event:"createAndBindMenu",message:"Creating and binding menu with ID: ".concat(n),data:{defaultTargetType:i,selector:o,structure:s,headerText:a,triggerEvent:u,filterStrategy:l}});var h=d(s,i);this._log({event:"createAndBindMenu",message:"Processed commands for menu ".concat(n)});var v={id:n,headerTextTemplate:a,commands:h,triggerEvent:u,filterStrategy:l};this.addMenuConfiguration(v),o&&i&&this.bindMenuToElements(o,n,i)}}])}();"undefined"!=typeof window&&(window.QuickCTX||(window.QuickCTX={}),window.QuickCTX.QuickCTX=v,window.QuickCTX.MenuCommand=m),e.MenuCommand=m,e.QuickCTX=v,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=quickctx.umd.min.min.js.map