@toolbox-web/grid 3.9.1 → 3.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/all.js +1 -1
- package/all.js.map +1 -1
- package/custom-elements.json +2 -2
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/grid.d.ts +8 -4
- package/lib/core/plugin/base-plugin.d.ts +7 -0
- package/lib/core/types.d.ts +2 -0
- package/lib/features/registry.js +1 -1
- package/lib/plugins/context-menu/context-menu-plugin.d.ts +9 -4
- package/lib/plugins/context-menu/index.js +1 -1
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/context-menu/types.d.ts +8 -4
- package/lib/plugins/editing/index.js +1 -1
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/editing/internal/dirty-tracking-manager.d.ts +2 -1
- package/lib/plugins/filtering/filter-model.d.ts +2 -1
- package/lib/plugins/filtering/filtering-plugin.d.ts +5 -2
- package/lib/plugins/filtering/index.js +1 -1
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-rows/grouping-rows-plugin.d.ts +7 -14
- package/lib/plugins/grouping-rows/grouping-rows.d.ts +48 -0
- package/lib/plugins/grouping-rows/index.d.ts +1 -1
- package/lib/plugins/grouping-rows/index.js +1 -1
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/grouping-rows/types.d.ts +21 -0
- package/lib/plugins/master-detail/index.d.ts +1 -1
- package/lib/plugins/master-detail/index.js +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/master-detail/master-detail-plugin.d.ts +28 -6
- package/lib/plugins/master-detail/master-detail.d.ts +0 -8
- package/lib/plugins/master-detail/types.d.ts +25 -1
- package/lib/plugins/multi-sort/index.js +1 -1
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/selection/index.js +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/selection/selection-plugin.d.ts +8 -1
- package/lib/plugins/server-side/datasource-types.d.ts +28 -0
- package/lib/plugins/server-side/datasource.d.ts +7 -0
- package/lib/plugins/server-side/index.js +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/server-side/server-side-plugin.d.ts +61 -8
- package/lib/plugins/server-side/types.d.ts +9 -1
- package/lib/plugins/tree/index.js +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/tree/tree-plugin.d.ts +5 -11
- package/lib/plugins/tree/types.d.ts +22 -6
- package/lib/plugins/undo-redo/history.d.ts +2 -1
- package/lib/plugins/undo-redo/index.js +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/undo-redo/types.d.ts +13 -1
- package/lib/plugins/undo-redo/undo-redo-plugin.d.ts +15 -2
- package/package.json +1 -1
- package/umd/grid.all.umd.js +1 -1
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +1 -1
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/context-menu.umd.js +1 -1
- package/umd/plugins/context-menu.umd.js.map +1 -1
- package/umd/plugins/editing.umd.js +1 -1
- package/umd/plugins/editing.umd.js.map +1 -1
- package/umd/plugins/filtering.umd.js +1 -1
- package/umd/plugins/filtering.umd.js.map +1 -1
- package/umd/plugins/grouping-rows.umd.js +1 -1
- package/umd/plugins/grouping-rows.umd.js.map +1 -1
- package/umd/plugins/master-detail.umd.js +1 -1
- package/umd/plugins/master-detail.umd.js.map +1 -1
- package/umd/plugins/multi-sort.umd.js +1 -1
- package/umd/plugins/multi-sort.umd.js.map +1 -1
- package/umd/plugins/selection.umd.js +1 -1
- package/umd/plugins/selection.umd.js.map +1 -1
- package/umd/plugins/server-side.umd.js +1 -1
- package/umd/plugins/server-side.umd.js.map +1 -1
- package/umd/plugins/tree.umd.js +1 -1
- package/umd/plugins/tree.umd.js.map +1 -1
- package/umd/plugins/undo-redo.umd.js +1 -1
- package/umd/plugins/undo-redo.umd.js.map +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@toolbox-web/grid")):"function"==typeof define&&define.amd?define(["exports","@toolbox-web/grid"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TbwGridPlugin_contextMenu={},e.TbwGrid)}(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});var n="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),o=(new RegExp(`__(proto|defineGetter|defineSetter)|${n.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),s=/^on\w+$/i,r=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),i=/^\s*(javascript|vbscript|data|blob):/i;function a(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],n=e.querySelectorAll("*");for(const a of n){const e=a.tagName.toLowerCase();if(o.has(e)){t.push(a);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===a.namespaceURI)&&Array.from(a.attributes).some(e=>s.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(a);continue}const n=[];for(const t of a.attributes){const e=t.name.toLowerCase();s.test(e)?n.push(t.name):"is"!==e?(r.has(e)&&i.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&n.push(t.name):n.push(t.name)}n.forEach(e=>a.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}function l(e,t){t&&"string"==typeof t?-1!==t.indexOf("<")||-1!==t.indexOf("&")?e.replaceChildren(a(t)):e.textContent=t:e.replaceChildren()}function c(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase()}function u(e,t){return("function"==typeof e?e(t):e).filter(e=>!0!==e.hidden&&("function"!=typeof e.hidden||!e.hidden(t)))}function d(e,t){return!0===e.disabled||"function"==typeof e.disabled&&e.disabled(t)}function m(e,t,n,o){const s=document.createElement("div");s.className="tbw-context-menu",s.setAttribute("role","menu");const r=e.some(e=>!e.separator&&e.icon);for(const i of e){if(i.separator){const e=document.createElement("div");e.className="tbw-context-menu-separator",e.setAttribute("role","separator"),s.appendChild(e);continue}const e=document.createElement("div");e.className="tbw-context-menu-item",i.cssClass&&e.classList.add(i.cssClass),e.setAttribute("role","menuitem"),e.setAttribute("data-id",i.id),e.setAttribute("tabindex","-1");const a=d(i,t);if(a&&(e.classList.add("disabled"),e.setAttribute("aria-disabled","true")),i.icon){const t=document.createElement("span");t.className="tbw-context-menu-icon",l(t,i.icon),e.appendChild(t)}else if(r){const t=document.createElement("span");t.className="tbw-context-menu-icon",t.innerHTML=" ",e.appendChild(t)}const p=document.createElement("span");if(p.className="tbw-context-menu-label",p.textContent=i.name,e.appendChild(p),i.shortcut){const t=document.createElement("span");if(t.className="tbw-context-menu-shortcut",Array.isArray(i.shortcut))i.shortcut.forEach((e,n)=>{n>0&&t.appendChild(document.createTextNode("+"));const o=document.createElement("kbd");o.textContent=e,t.appendChild(o)});else{const e=document.createElement("kbd");e.textContent=i.shortcut,t.appendChild(e)}e.appendChild(t)}if(i.subMenu?.length){const s=document.createElement("span");s.className="tbw-context-menu-arrow",s.dataset.icon=c("submenuArrow"),void 0!==o&&("string"==typeof o?l(s,o):o instanceof HTMLElement&&s.appendChild(o.cloneNode(!0))),e.appendChild(s),e.addEventListener("mouseenter",()=>{if(e.querySelector(".tbw-context-menu"))return;if(!i.subMenu)return;const s=m(u(i.subMenu,t),t,n,o);s.classList.add("tbw-context-submenu"),s.style.position="absolute",s.style.left="100%",s.style.top="0",e.style.position="relative",e.appendChild(s)}),e.addEventListener("mouseleave",()=>{const t=e.querySelector(".tbw-context-menu");t&&t.remove()})}a||!i.action||i.subMenu||e.addEventListener("click",e=>{e.stopPropagation(),n(i)}),s.appendChild(e)}return s}var p="getContextMenuItems",b=null,h=null,w=0,f=new Set,x=[{id:"copy",name:"Copy",shortcut:"Ctrl+C",action:e=>{e.grid?.query?.("clipboard:copy")}},{separator:!0,id:"sep1",name:""},{id:"export-csv",name:"Export CSV",action:e=>{e.grid?.query?.("export:csv")}}],g=class e extends t.BaseGridPlugin{static manifest={queries:[{type:p,description:"Collects context menu items from other plugins for header right-click menus"}]};name="contextMenu";get defaultConfig(){return{items:x}}isOpen=!1;position={x:0,y:0};params=null;menuElement=null;boundHost=null;attach(e){super.attach(e),this.installGlobalHandlers(),w++,f.add(this)}detach(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen=!1,this.params=null,this.boundHost=null,f.delete(this),this.uninstallGlobalHandlers()}syncSelectionOnContextMenu(e){if(e<0)return[];const t=(this.grid?.query("getSelectedRowIndices"))?.[0];return t?t.includes(e)?t:(this.grid?.query("selectRows",[e]),[e]):[e]}static CSS_VARS_TO_COPY=["--tbw-color-panel-bg","--tbw-color-fg","--tbw-color-fg-muted","--tbw-color-border","--tbw-color-row-hover","--tbw-color-shadow","--tbw-color-danger","--tbw-border-radius","--tbw-font-family","--tbw-font-size-sm","--tbw-font-size-xs","--tbw-font-size-2xs","--tbw-spacing-xs","--tbw-icon-size","--tbw-menu-min-width","--tbw-menu-item-padding","--tbw-menu-item-gap","--tbw-context-menu-bg","--tbw-context-menu-fg","--tbw-context-menu-border","--tbw-context-menu-radius","--tbw-context-menu-shadow","--tbw-context-menu-hover","--tbw-context-menu-danger","--tbw-context-menu-muted","--tbw-context-menu-min-width","--tbw-context-menu-font-size","--tbw-context-menu-font-family","--tbw-context-menu-item-padding","--tbw-context-menu-item-gap","--tbw-context-menu-icon-size","--tbw-context-menu-shortcut-size","--tbw-context-menu-arrow-size","--tbw-icon-submenu-arrow"];copyGridStyles(t){const n=this.gridElement;if(!n)return;const o=getComputedStyle(n),s=[],r=o.getPropertyValue("color-scheme").trim();r&&s.push(`color-scheme: ${r}`);for(const i of e.CSS_VARS_TO_COPY){const e=o.getPropertyValue(i).trim();e&&s.push(`${i}: ${e}`)}if(s.length>0){const e=t.getAttribute("style")||"";t.setAttribute("style",e+s.join("; ")+";")}}installGlobalHandlers(){if(h||"undefined"==typeof document||((h=document.createElement("style")).id="tbw-context-menu-styles",h.textContent="@layer tbw-plugins{.tbw-context-menu{background:var(--tbw-context-menu-bg,var(--tbw-color-panel-bg));color:var(--tbw-context-menu-fg,var(--tbw-color-fg));border:1px solid var(--tbw-context-menu-border,var(--tbw-color-border));border-radius:var(--tbw-context-menu-radius,var(--tbw-border-radius));box-shadow:var(--tbw-context-menu-shadow,0 2px 10px var(--tbw-color-shadow));min-width:var(--tbw-context-menu-min-width,var(--tbw-menu-min-width));padding:var(--tbw-spacing-xs) 0;z-index:10000;font-size:var(--tbw-context-menu-font-size,var(--tbw-font-size-sm));font-family:var(--tbw-context-menu-font-family,var(--tbw-font-family));position:fixed}.tbw-context-menu-item{padding:var(--tbw-context-menu-item-padding,var(--tbw-menu-item-padding));cursor:pointer;align-items:center;gap:var(--tbw-context-menu-item-gap,var(--tbw-menu-item-gap));display:flex}.tbw-context-menu-item:hover:not(.disabled){background:var(--tbw-context-menu-hover,var(--tbw-color-row-hover))}.tbw-context-menu-item.disabled{opacity:.5;cursor:default}.tbw-context-menu-item.danger{color:var(--tbw-context-menu-danger,var(--tbw-color-danger))}.tbw-context-menu-icon{width:var(--tbw-context-menu-icon-size,var(--tbw-icon-size));text-align:center}.tbw-context-menu-label{flex:1}.tbw-context-menu-shortcut kbd{color:var(--tbw-context-menu-muted,var(--tbw-color-fg-muted));font-size:var(--tbw-context-menu-shortcut-size,var(--tbw-font-size-xs))}.tbw-context-menu-arrow{font-size:var(--tbw-context-menu-arrow-size,var(--tbw-font-size-2xs));color:var(--tbw-context-menu-muted,var(--tbw-color-fg-muted))}.tbw-context-menu-separator{background:var(--tbw-context-menu-border,var(--tbw-color-border));height:1px;margin:var(--tbw-spacing-xs) 0}}",document.head.appendChild(h)),!b){const e=(b=new AbortController).signal,t=()=>{for(const e of f)e.isMenuOpen()&&e.hideMenu();document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove())};document.addEventListener("click",t,{signal:e}),document.addEventListener("keydown",e=>{"Escape"===e.key&&t()},{signal:e}),document.addEventListener("scroll",t,{capture:!0,signal:e})}}uninstallGlobalHandlers(){--w>0||(b&&(b.abort(),b=null),h&&(h.remove(),h=null))}collectPluginItems(e){if(!this.grid)return[];const t=this.grid.query(p,e),n=[];for(const o of t)Array.isArray(o)&&n.push(...o);return n.sort((e,t)=>(e.order??100)-(t.order??100)),this.insertGroupSeparators(n)}insertGroupSeparators(e){if(e.length<=1)return e;const t=[];let n=-1;for(const o of e){if(o.separator){t.push(o);continue}const e=Math.floor((o.order??100)/10);n>=0&&e!==n&&t.push({id:`__sep-${n}-${e}`,label:"",separator:!0,action:()=>{}}),n=e,t.push(o)}return t}convertPluginItems(e){return e.map(e=>({id:e.id,name:e.label,icon:e.icon,shortcut:e.shortcut,disabled:e.disabled??!1,action:()=>e.action(),separator:e.separator,cssClass:e.cssClass}))}openMenuAt(e,t,n,o=!1){this.params=e,this.position={x:t,y:n};const s=this.collectPluginItems(e);let r=u(this.config.items??x,e);if(s.length>0){const e=this.convertPluginItems(s);r=r.length>0&&e.length>0?[...r,{id:"__plugin-sep",name:"",separator:!0},...e]:[...r,...e]}var i,a;(r=function(e){const t=[];for(const n of e)n.separator&&(0===t.length||t[t.length-1].separator)||t.push(n);return t.length>0&&t[t.length-1].separator&&t.pop(),t}(r),r.length)&&(document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove()),this.menuElement=null,this.menuElement=m(r,e,t=>{t.action&&t.action(e),this.hideMenu()},this.grid?.gridConfig?.icons?.submenuArrow),i=this.menuElement,a=()=>this.hideMenu(),i.addEventListener("keydown",e=>{const t=Array.from(i.querySelectorAll('[role="menuitem"]:not(.disabled)'));if(!t.length)return;const n=document.activeElement,o=t.indexOf(n);switch(e.key){case"ArrowDown":e.preventDefault(),t[o<t.length-1?o+1:0].focus();break;case"ArrowUp":e.preventDefault(),t[o>0?o-1:t.length-1].focus();break;case"Enter":case" ":e.preventDefault(),n&&t.includes(n)&&n.click();break;case"Escape":e.preventDefault(),a()}}),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),function(e,t,n){e.style.position="fixed",e.style.left=`${t}px`,e.style.top=`${n}px`,e.style.visibility="hidden",e.style.zIndex="10000";const o=e.getBoundingClientRect(),s=window.innerWidth,r=window.innerHeight;let i=t,a=n;t+o.width>s&&(i=t-o.width),n+o.height>r&&(a=n-o.height),i=Math.max(0,i),a=Math.max(0,a),e.style.left=`${i}px`,e.style.top=`${a}px`,e.style.visibility="visible"}(this.menuElement,t,n),this.isOpen=!0,o&&function(e){e.querySelector('[role="menuitem"]:not(.disabled)')?.focus()}(this.menuElement),this.emit("context-menu-open",{params:e,items:r}))}openMenuAtFocusedCell(e){const t=this.grid;if(!t)return!1;const n=t._focusRow,o=t._focusCol;if(n<0||o<0)return!1;const s=this.visibleColumns[o],r=this.rows[n],i=this.gridElement?.querySelector(`[data-row="${n}"][data-col="${o}"]`);if(!i&&!0===r?.__loading)return!1;let a=0,l=0;if(i){const e=i.getBoundingClientRect();a=e.left+e.width/2,l=e.bottom}const c=this.syncSelectionOnContextMenu(n);return this.openMenuAt({row:r,rowIndex:n,column:s,columnIndex:o,field:s?.field??"",value:r?.[s?.field]??null,isHeader:!1,event:e,selectedRows:c},a,l,!0),!0}handleContextMenu=e=>{const t=e;t.preventDefault();const n=t.target,o=n?.closest("[data-row][data-col]"),s=n?.closest('[part~="header-cell"]');let r;if(o){const e=parseInt(o.getAttribute("data-row")??"-1",10),n=parseInt(o.getAttribute("data-col")??"-1",10),s=this.visibleColumns[n],i=this.rows[e],a=this.syncSelectionOnContextMenu(e);r={row:i,rowIndex:e,column:s,columnIndex:n,field:s?.field??"",value:i?.[s?.field]??null,isHeader:!1,event:t,selectedRows:a}}else{if(!s)return void(-1===t.button&&t.target===this.boundHost&&this.openMenuAtFocusedCell(t));{const e=parseInt(s.getAttribute("data-col")??"-1",10),n=this.visibleColumns[e];r={row:null,rowIndex:-1,column:n,columnIndex:e,field:n?.field??"",value:null,isHeader:!0,event:t,selectedRows:[]}}}this.openMenuAt(r,t.clientX,t.clientY)};afterRender(){const e=this.gridElement;e&&this.boundHost!==e&&(this.boundHost=e,e.addEventListener("contextmenu",this.handleContextMenu,{signal:this.disconnectSignal}))}onKeyDown(e){const t="F10"===e.key&&e.shiftKey,n="ContextMenu"===e.key;if((t||n)&&(e.preventDefault(),this.openMenuAtFocusedCell(e)))return!0}showMenu(e,t,n){const o={row:n.row??null,rowIndex:n.rowIndex??-1,column:n.column??null,columnIndex:n.columnIndex??-1,field:n.field??"",value:n.value??null,isHeader:n.isHeader??!1,event:n.event??new MouseEvent("contextmenu"),selectedRows:n.selectedRows??[]};this.openMenuAt(o,e,t)}hideMenu(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen&&(this.isOpen=!1)}isMenuOpen(){return this.isOpen}};e.ContextMenuPlugin=g});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@toolbox-web/grid")):"function"==typeof define&&define.amd?define(["exports","@toolbox-web/grid"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TbwGridPlugin_contextMenu={},e.TbwGrid)}(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});var n="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),o=(new RegExp(`__(proto|defineGetter|defineSetter)|${n.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),r=/^on\w+$/i,s=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),i=/^\s*(javascript|vbscript|data|blob):/i;function a(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],n=e.querySelectorAll("*");for(const a of n){const e=a.tagName.toLowerCase();if(o.has(e)){t.push(a);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===a.namespaceURI)&&Array.from(a.attributes).some(e=>r.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(a);continue}const n=[];for(const t of a.attributes){const e=t.name.toLowerCase();r.test(e)?n.push(t.name):"is"!==e?(s.has(e)&&i.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&n.push(t.name):n.push(t.name)}n.forEach(e=>a.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}function l(e,t){t&&"string"==typeof t?-1!==t.indexOf("<")||-1!==t.indexOf("&")?e.replaceChildren(a(t)):e.textContent=t:e.replaceChildren()}function c(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase()}function u(e,t){return("function"==typeof e?e(t):e).filter(e=>!0!==e.hidden&&("function"!=typeof e.hidden||!e.hidden(t)))}function d(e,t){return!0===e.disabled||"function"==typeof e.disabled&&e.disabled(t)}function m(e,t,n,o){const r=document.createElement("div");r.className="tbw-context-menu",r.setAttribute("role","menu");const s=e.some(e=>!e.separator&&e.icon);for(const i of e){if(i.separator){const e=document.createElement("div");e.className="tbw-context-menu-separator",e.setAttribute("role","separator"),r.appendChild(e);continue}const e=document.createElement("div");e.className="tbw-context-menu-item",i.cssClass&&e.classList.add(i.cssClass),e.setAttribute("role","menuitem"),e.setAttribute("data-id",i.id),e.setAttribute("tabindex","-1");const a=d(i,t);if(a&&(e.classList.add("disabled"),e.setAttribute("aria-disabled","true")),i.icon){const t=document.createElement("span");t.className="tbw-context-menu-icon",l(t,i.icon),e.appendChild(t)}else if(s){const t=document.createElement("span");t.className="tbw-context-menu-icon",t.innerHTML=" ",e.appendChild(t)}const p=document.createElement("span");if(p.className="tbw-context-menu-label",p.textContent=i.name,e.appendChild(p),i.shortcut){const t=document.createElement("span");if(t.className="tbw-context-menu-shortcut",Array.isArray(i.shortcut))i.shortcut.forEach((e,n)=>{n>0&&t.appendChild(document.createTextNode("+"));const o=document.createElement("kbd");o.textContent=e,t.appendChild(o)});else{const e=document.createElement("kbd");e.textContent=i.shortcut,t.appendChild(e)}e.appendChild(t)}if(i.subMenu?.length){const r=document.createElement("span");r.className="tbw-context-menu-arrow",r.dataset.icon=c("submenuArrow"),void 0!==o&&("string"==typeof o?l(r,o):o instanceof HTMLElement&&r.appendChild(o.cloneNode(!0))),e.appendChild(r),e.addEventListener("mouseenter",()=>{if(e.querySelector(".tbw-context-menu"))return;if(!i.subMenu)return;const r=m(u(i.subMenu,t),t,n,o);r.classList.add("tbw-context-submenu"),r.style.position="absolute",r.style.left="100%",r.style.top="0",e.style.position="relative",e.appendChild(r)}),e.addEventListener("mouseleave",()=>{const t=e.querySelector(".tbw-context-menu");t&&t.remove()})}a||!i.action||i.subMenu||e.addEventListener("click",e=>{e.stopPropagation(),n(i)}),r.appendChild(e)}return r}var p="getContextMenuItems",b=null,h=null,f=0,w=new Set,x=[{id:"copy",name:"Copy",shortcut:"Ctrl+C",action:e=>{e.grid?.query?.("clipboard:copy")}},{separator:!0,id:"sep1",name:""},{id:"export-csv",name:"Export CSV",action:e=>{e.grid?.query?.("export:csv")}}],g=class e extends t.BaseGridPlugin{static manifest={queries:[{type:p,description:"Collects context menu items from other plugins for header right-click menus"}]};name="contextMenu";get defaultConfig(){return{items:x}}isOpen=!1;position={x:0,y:0};params=null;menuElement=null;boundHost=null;attach(e){super.attach(e),this.installGlobalHandlers(),f++,w.add(this)}detach(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen=!1,this.params=null,this.boundHost=null,w.delete(this),this.uninstallGlobalHandlers()}syncSelectionOnContextMenu(e,t){if(e<0)return[];const n=this.grid?.query("selectContextMenuTarget",{rowIndex:e,colIndex:t})?.[0];return n?.includes(e)?n:[e]}static CSS_VARS_TO_COPY=["--tbw-color-panel-bg","--tbw-color-fg","--tbw-color-fg-muted","--tbw-color-border","--tbw-color-row-hover","--tbw-color-shadow","--tbw-color-danger","--tbw-border-radius","--tbw-font-family","--tbw-font-size-sm","--tbw-font-size-xs","--tbw-font-size-2xs","--tbw-spacing-xs","--tbw-icon-size","--tbw-menu-min-width","--tbw-menu-item-padding","--tbw-menu-item-gap","--tbw-context-menu-bg","--tbw-context-menu-fg","--tbw-context-menu-border","--tbw-context-menu-radius","--tbw-context-menu-shadow","--tbw-context-menu-hover","--tbw-context-menu-danger","--tbw-context-menu-muted","--tbw-context-menu-min-width","--tbw-context-menu-font-size","--tbw-context-menu-font-family","--tbw-context-menu-item-padding","--tbw-context-menu-item-gap","--tbw-context-menu-icon-size","--tbw-context-menu-shortcut-size","--tbw-context-menu-arrow-size","--tbw-icon-submenu-arrow"];copyGridStyles(t){const n=this.gridElement;if(!n)return;const o=getComputedStyle(n),r=[],s=o.getPropertyValue("color-scheme").trim();s&&r.push(`color-scheme: ${s}`);for(const i of e.CSS_VARS_TO_COPY){const e=o.getPropertyValue(i).trim();e&&r.push(`${i}: ${e}`)}if(r.length>0){const e=t.getAttribute("style")||"";t.setAttribute("style",e+r.join("; ")+";")}}installGlobalHandlers(){if(h||"undefined"==typeof document||((h=document.createElement("style")).id="tbw-context-menu-styles",h.textContent="@layer tbw-plugins{.tbw-context-menu{background:var(--tbw-context-menu-bg,var(--tbw-color-panel-bg));color:var(--tbw-context-menu-fg,var(--tbw-color-fg));border:1px solid var(--tbw-context-menu-border,var(--tbw-color-border));border-radius:var(--tbw-context-menu-radius,var(--tbw-border-radius));box-shadow:var(--tbw-context-menu-shadow,0 2px 10px var(--tbw-color-shadow));min-width:var(--tbw-context-menu-min-width,var(--tbw-menu-min-width));padding:var(--tbw-spacing-xs) 0;z-index:10000;font-size:var(--tbw-context-menu-font-size,var(--tbw-font-size-sm));font-family:var(--tbw-context-menu-font-family,var(--tbw-font-family));position:fixed}.tbw-context-menu-item{padding:var(--tbw-context-menu-item-padding,var(--tbw-menu-item-padding));cursor:pointer;align-items:center;gap:var(--tbw-context-menu-item-gap,var(--tbw-menu-item-gap));display:flex}.tbw-context-menu-item:hover:not(.disabled){background:var(--tbw-context-menu-hover,var(--tbw-color-row-hover))}.tbw-context-menu-item.disabled{opacity:.5;cursor:default}.tbw-context-menu-item.danger{color:var(--tbw-context-menu-danger,var(--tbw-color-danger))}.tbw-context-menu-icon{width:var(--tbw-context-menu-icon-size,var(--tbw-icon-size));text-align:center}.tbw-context-menu-label{flex:1}.tbw-context-menu-shortcut kbd{color:var(--tbw-context-menu-muted,var(--tbw-color-fg-muted));font-size:var(--tbw-context-menu-shortcut-size,var(--tbw-font-size-xs))}.tbw-context-menu-arrow{font-size:var(--tbw-context-menu-arrow-size,var(--tbw-font-size-2xs));color:var(--tbw-context-menu-muted,var(--tbw-color-fg-muted))}.tbw-context-menu-separator{background:var(--tbw-context-menu-border,var(--tbw-color-border));height:1px;margin:var(--tbw-spacing-xs) 0}}",document.head.appendChild(h)),!b){const e=(b=new AbortController).signal,t=()=>{for(const e of w)e.isMenuOpen()&&e.hideMenu();document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove())};document.addEventListener("click",t,{signal:e}),document.addEventListener("keydown",e=>{"Escape"===e.key&&t()},{signal:e}),document.addEventListener("scroll",t,{capture:!0,signal:e})}}uninstallGlobalHandlers(){--f>0||(b&&(b.abort(),b=null),h&&(h.remove(),h=null))}collectPluginItems(e){if(!this.grid)return[];const t=this.grid.query(p,e),n=[];for(const o of t)Array.isArray(o)&&n.push(...o);return n.sort((e,t)=>(e.order??100)-(t.order??100)),this.insertGroupSeparators(n)}insertGroupSeparators(e){if(e.length<=1)return e;const t=[];let n=-1;for(const o of e){if(o.separator){t.push(o);continue}const e=Math.floor((o.order??100)/10);n>=0&&e!==n&&t.push({id:`__sep-${n}-${e}`,label:"",separator:!0,action:()=>{}}),n=e,t.push(o)}return t}convertPluginItems(e){return e.map(e=>({id:e.id,name:e.label,icon:e.icon,shortcut:e.shortcut,disabled:e.disabled??!1,action:()=>e.action(),separator:e.separator,cssClass:e.cssClass}))}openMenuAt(e,t,n,o=!1){this.params=e,this.position={x:t,y:n};const r=this.collectPluginItems(e);let s=u(this.config.items??x,e);if(r.length>0){const e=this.convertPluginItems(r);s=s.length>0&&e.length>0?[...s,{id:"__plugin-sep",name:"",separator:!0},...e]:[...s,...e]}var i,a;(s=function(e){const t=[];for(const n of e)n.separator&&(0===t.length||t[t.length-1].separator)||t.push(n);return t.length>0&&t[t.length-1].separator&&t.pop(),t}(s),s.length)&&(document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove()),this.menuElement=null,this.menuElement=m(s,e,t=>{t.action&&t.action(e),this.hideMenu()},this.grid?.gridConfig?.icons?.submenuArrow),i=this.menuElement,a=()=>this.hideMenu(),i.addEventListener("keydown",e=>{const t=Array.from(i.querySelectorAll('[role="menuitem"]:not(.disabled)'));if(!t.length)return;const n=document.activeElement,o=t.indexOf(n);switch(e.key){case"ArrowDown":e.preventDefault(),t[o<t.length-1?o+1:0].focus();break;case"ArrowUp":e.preventDefault(),t[o>0?o-1:t.length-1].focus();break;case"Enter":case" ":e.preventDefault(),n&&t.includes(n)&&n.click();break;case"Escape":e.preventDefault(),a()}}),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),function(e,t,n){e.style.position="fixed",e.style.left=`${t}px`,e.style.top=`${n}px`,e.style.visibility="hidden",e.style.zIndex="10000";const o=e.getBoundingClientRect(),r=window.innerWidth,s=window.innerHeight;let i=t,a=n;t+o.width>r&&(i=t-o.width),n+o.height>s&&(a=n-o.height),i=Math.max(0,i),a=Math.max(0,a),e.style.left=`${i}px`,e.style.top=`${a}px`,e.style.visibility="visible"}(this.menuElement,t,n),this.isOpen=!0,o&&function(e){e.querySelector('[role="menuitem"]:not(.disabled)')?.focus()}(this.menuElement),this.emit("context-menu-open",{params:e,items:s}))}openMenuAtFocusedCell(e){const t=this.grid;if(!t)return!1;const n=t._focusRow,o=t._focusCol;if(n<0||o<0)return!1;const r=this.visibleColumns[o],s=this.rows[n],i=this.gridElement?.querySelector(`[data-row="${n}"][data-col="${o}"]`);if(!i&&!0===s?.__loading)return!1;let a=0,l=0;if(i){const e=i.getBoundingClientRect();a=e.left+e.width/2,l=e.bottom}const c=this.syncSelectionOnContextMenu(n,o);return this.openMenuAt({row:s,rowIndex:n,column:r,columnIndex:o,field:r?.field??"",value:s?.[r?.field]??null,isHeader:!1,event:e,selectedRows:c},a,l,!0),!0}handleContextMenu=e=>{const t=e;t.preventDefault();const n=t.target,o=n?.closest("[data-row][data-col]"),r=n?.closest('[part~="header-cell"]');let s;if(o){const e=parseInt(o.getAttribute("data-row")??"-1",10),n=parseInt(o.getAttribute("data-col")??"-1",10),r=this.visibleColumns[n],i=this.rows[e],a=this.syncSelectionOnContextMenu(e,n);s={row:i,rowIndex:e,column:r,columnIndex:n,field:r?.field??"",value:i?.[r?.field]??null,isHeader:!1,event:t,selectedRows:a}}else{if(!r)return void(-1===t.button&&t.target===this.boundHost&&this.openMenuAtFocusedCell(t));{const e=parseInt(r.getAttribute("data-col")??"-1",10),n=this.visibleColumns[e];s={row:null,rowIndex:-1,column:n,columnIndex:e,field:n?.field??"",value:null,isHeader:!0,event:t,selectedRows:[]}}}this.openMenuAt(s,t.clientX,t.clientY)};afterRender(){const e=this.gridElement;e&&this.boundHost!==e&&(this.boundHost=e,e.addEventListener("contextmenu",this.handleContextMenu,{signal:this.disconnectSignal}))}onKeyDown(e){const t="F10"===e.key&&e.shiftKey,n="ContextMenu"===e.key;if((t||n)&&(e.preventDefault(),this.openMenuAtFocusedCell(e)))return!0}showMenu(e,t,n){const o={row:n.row??null,rowIndex:n.rowIndex??-1,column:n.column??null,columnIndex:n.columnIndex??-1,field:n.field??"",value:n.value??null,isHeader:n.isHeader??!1,event:n.event??new MouseEvent("contextmenu"),selectedRows:n.selectedRows??[]};this.openMenuAt(o,e,t)}hideMenu(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen&&(this.isOpen=!1)}isMenuOpen(){return this.isOpen}};e.ContextMenuPlugin=g});
|
|
2
2
|
//# sourceMappingURL=context-menu.umd.js.map
|