@toolbox-web/grid 3.8.0 → 3.8.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/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/types.d.ts +4 -0
- package/lib/features/registry.js +1 -1
- package/lib/plugins/clipboard/index.js +1 -1
- package/lib/plugins/column-virtualization/index.js +1 -1
- package/lib/plugins/context-menu/index.js +1 -1
- package/lib/plugins/editing/index.js +1 -1
- package/lib/plugins/export/index.js +1 -1
- package/lib/plugins/filtering/index.js +1 -1
- package/lib/plugins/grouping-columns/index.js +1 -1
- package/lib/plugins/grouping-rows/index.js +1 -1
- package/lib/plugins/master-detail/index.js +1 -1
- package/lib/plugins/multi-sort/index.js +1 -1
- package/lib/plugins/pinned-columns/index.js +1 -1
- package/lib/plugins/pinned-rows/index.js +1 -1
- package/lib/plugins/pivot/index.js +1 -1
- package/lib/plugins/print/index.js +1 -1
- package/lib/plugins/reorder-columns/index.js +1 -1
- package/lib/plugins/responsive/index.js +1 -1
- package/lib/plugins/row-drag-drop/index.js +1 -1
- package/lib/plugins/selection/index.js +1 -1
- package/lib/plugins/server-side/index.js +1 -1
- package/lib/plugins/shell/index.js +1 -1
- package/lib/plugins/sticky-rows/index.js +1 -1
- package/lib/plugins/tooltip/index.js +1 -1
- package/lib/plugins/tree/index.js +1 -1
- package/lib/plugins/undo-redo/index.js +1 -1
- package/lib/plugins/visibility/index.js +1 -1
- 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
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e="dragging",t={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};function i(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function r(e,t,r,o){return`${i(r,o)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}var o="__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("")),n=(new RegExp(`__(proto|defineGetter|defineSetter)|${o.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,l=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),a=/^\s*(javascript|vbscript|data|blob):/i;function d(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],i=e.querySelectorAll("*");for(const r of i){const e=r.tagName.toLowerCase();if(n.has(e)){t.push(r);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===r.namespaceURI)&&Array.from(r.attributes).some(e=>s.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(r);continue}const i=[];for(const t of r.attributes){const e=t.name.toLowerCase();s.test(e)?i.push(t.name):"is"!==e?(l.has(e)&&a.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&i.push(t.name):i.push(t.name)}i.forEach(e=>r.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}var u=class{static dependencies;static manifest;aliases;version="3.8.0";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const t={...this.userConfig},i={};for(const r of Object.keys(t))i[r]=this;for(const o of e){const e=o.userConfig;for(const[n,s]of Object.entries(e)){if(void 0===s)continue;if(!(n in t)){t[n]=s,i[n]=o;continue}if(t[n]===s)continue;const e=i[n]?.constructor.name??this.constructor.name,l=o.constructor.name,a=r("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${n}" supplied by both ${e} and ${l}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(a)}}Object.assign(this.userConfig,t)}refreshUserConfigFrom(e){const t=this.userConfig,i={...e.userConfig};for(const r of Object.keys(t))delete t[r];Object.assign(t,i)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const i=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(i),i.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const i=this.grid?.query?.(e,t);return Array.isArray(i)?i.some(Boolean):!!i}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...t,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),i=parseInt(t,10);if(!isNaN(i))return i}return 200}setIcon(e,t,i){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const r=this.#t(t,i);var o,n;void 0!==r?"string"==typeof r?(o=e,(n=r)&&"string"==typeof n?-1!==n.indexOf("<")||-1!==n.indexOf("&")?o.replaceChildren(d(n)):o.textContent=n:o.replaceChildren()):r instanceof HTMLElement&&e.replaceChildren(r.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const i=document.createElement("span");i.setAttribute("part","sort-indicator"),i.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(i,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(i,"sortNone"));const r=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return r?e.insertBefore(i,r):e.appendChild(i),i}warn(e,t){void 0!==t?console.warn(r(e,t,this.gridElement.id,this.name)):console.warn(`${i(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(r(e,t,this.gridElement.id,this.name))}};function c(){return"function"==typeof HTMLElement.prototype?.showPopover}function g(e,t){let i=null,r=!1,o=!1;const n=new AbortController;function s(){r&&i&&(r=!1,c()&&i.hidePopover(),i.hidden=!0)}return document.addEventListener("pointerdown",e=>{r&&i&&!e.composedPath().includes(i)&&s()},{capture:!0,signal:n.signal}),document.addEventListener("keydown",e=>{"Escape"===e.key&&s()},{capture:!0,signal:n.signal}),{get element(){return i},open(l,a,d){if(o||0===d.length)return;i||(i=function(){const i=document.createElement("div");return i.id=e,i.className=t,i.setAttribute("popover","manual"),i.setAttribute("role","group"),i.hidden=!0,i.addEventListener("focusout",e=>{const t=e.relatedTarget;t instanceof Node&&!i.contains(t)&&s()},{signal:n.signal}),i}());const u=l.closest("tbw-grid, [data-tbw-grid]")??document.body;i.parentNode!==u&&u.appendChild(i),i.setAttribute("aria-label",a),i.replaceChildren();for(const e of d){const r=document.createElement("button");r.type="button",r.className=`${t}-item`,r.textContent=e.label,r.disabled=!0===e.disabled,r.addEventListener("click",()=>{s(),e.run()}),i.appendChild(r)}i.hidden=!1,!r&&c()&&i.showPopover(),r=!0,function(e){if(!i)return;const t=e.getBoundingClientRect(),r=i.getBoundingClientRect(),o=Math.max(4,Math.min(t.left,window.innerWidth-r.width-4)),n=t.bottom+6,s=n+r.height<=window.innerHeight?n:Math.max(4,t.top-6-r.height);i.style.left=`${Math.round(o)}px`,i.style.top=`${Math.round(s)}px`}(l),i.querySelector("button:not([disabled])")?.focus()},close:s,dispose(){o=!0,s(),n.abort(),i?.remove(),i=null}}}var h=class t extends u{static dependencies=[{name:"shell",required:!0,reason:"VisibilityPlugin renders its column list in a shell tool panel"},{name:"reorder",required:!1,reason:"Enables drag-to-reorder columns in visibility panel"}];static manifest={queries:[{type:"getContextMenuItems",description:'Contributes "Hide column" item to the header context menu'}]};name="visibility";static PANEL_ID="columns";styles='@layer tbw-plugins{.tbw-visibility-content{flex-direction:column;height:100%;display:flex}.tbw-visibility-list{padding:var(--tbw-panel-padding,var(--tbw-spacing-md,.5rem));flex:1;overflow-y:auto}.tbw-visibility-row{align-items:center;gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));padding:var(--tbw-menu-item-padding,.375rem .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm,.8125rem);border-radius:var(--tbw-border-radius,.25rem);display:flex;position:relative}.tbw-visibility-row:hover{background:var(--tbw-visibility-hover,var(--tbw-color-row-hover))}.tbw-visibility-row input[type=checkbox]{cursor:pointer}.tbw-visibility-row.locked span{color:var(--tbw-color-fg-muted)}.tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs,.625rem);letter-spacing:-2px;-webkit-user-select:none;user-select:none;flex-shrink:0}.tbw-visibility-row.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}.tbw-visibility-label{align-items:center;gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));cursor:pointer;flex:1;display:flex}.tbw-visibility-row.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-row.drop-before:before{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;top:0;left:0;right:0}.tbw-visibility-row.drop-after:after{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;bottom:0;left:0;right:0}.tbw-visibility-show-all{margin:var(--tbw-panel-padding,var(--tbw-spacing-md,.5rem));padding:var(--tbw-button-padding,.5rem .75rem);border:1px solid var(--tbw-visibility-border,var(--tbw-color-border));border-radius:var(--tbw-border-radius,.25rem);background:var(--tbw-visibility-btn-bg,var(--tbw-color-header-bg));color:var(--tbw-color-fg);cursor:pointer;font-size:var(--tbw-font-size-sm,.8125rem)}.tbw-visibility-show-all:hover{background:var(--tbw-visibility-hover,var(--tbw-color-row-hover))}.tbw-visibility-group-header{padding:var(--tbw-menu-item-padding,.375rem .25rem);font-size:var(--tbw-font-size-sm,.8125rem);color:var(--tbw-color-fg);border-bottom:1px solid var(--tbw-color-border);margin-top:var(--tbw-spacing-sm,.25rem);align-items:center;font-weight:600;display:flex;position:relative}.tbw-visibility-group-header:first-child{margin-top:0}.tbw-visibility-group-header .tbw-visibility-label{gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem))}.tbw-visibility-group-header.reorderable{cursor:grab}.tbw-visibility-group-header.reorderable:hover{background:var(--tbw-visibility-hover,var(--tbw-color-row-hover))}.tbw-visibility-group-header .tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs,.625rem);letter-spacing:-2px;-webkit-user-select:none;user-select:none;flex-shrink:0}.tbw-visibility-group-header.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}@media (hover:none){.tbw-visibility-row.reorderable .tbw-visibility-handle,.tbw-visibility-group-header.reorderable .tbw-visibility-handle{color:var(--tbw-color-fg)}}@media (pointer:coarse){.tbw-visibility-handle{min-width:var(--tbw-touch-target-min,24px);min-height:var(--tbw-touch-target-min,24px);justify-content:center;align-items:center;display:inline-flex}}.tbw-visibility-group-header.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-group-header.drop-before:before{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;top:0;left:0;right:0}.tbw-visibility-group-header.drop-after:after{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;bottom:0;left:0;right:0}.tbw-visibility-row--grouped{padding-left:calc(var(--tbw-panel-padding,var(--tbw-spacing-md,.5rem)) + .75rem)}.tbw-visibility-move-menu{background:var(--tbw-color-panel-bg,light-dark(#fff,#1e1e1e));min-width:10rem;color:var(--tbw-color-panel-fg,light-dark(#1a1a1a,#eaeaea));border:1px solid var(--tbw-color-border,light-dark(#d0d0d0,#3a3a3a));border-radius:var(--tbw-border-radius,.25rem);box-shadow:var(--tbw-shadow-panel,0 4px 12px light-dark(#0003,#00000080));font:inherit;z-index:10001;flex-direction:column;margin:0;padding:4px;display:flex;position:fixed}.tbw-visibility-move-menu[hidden]{display:none}.tbw-visibility-move-menu-item{min-height:var(--tbw-touch-target-min,24px);text-align:start;color:inherit;font:inherit;border-radius:min(var(--tbw-border-radius,.25rem), 6px);cursor:pointer;background:0 0;border:0;padding:4px 8px}.tbw-visibility-move-menu-item:hover:not(:disabled){background:var(--tbw-color-row-hover,light-dark(#00000010,#ffffff14))}.tbw-visibility-move-menu-item:disabled{opacity:.5;cursor:default}}';get defaultConfig(){return{}}columnListElement=null;isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;draggedGroupId=null;draggedGroupFields=[];moveMenu=null;clearDragClasses(t){t.querySelectorAll(".tbw-visibility-row, .tbw-visibility-group-header").forEach(t=>{t.classList.remove(e,"drop-target","drop-before","drop-after")})}attach(e){super.attach(e),this.gridElement.addEventListener("column-move",()=>{this.columnListElement&&requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})},{signal:this.disconnectSignal})}detach(){this.columnListElement=null,this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.moveMenu?.dispose(),this.moveMenu=null}processColumns(e){for(const t of e){const e=t.__element;e&&(void 0===t.hidden&&e.hasAttribute("hidden")&&"false"!==e.getAttribute("hidden")&&(t.hidden=!0),void 0===t.lockVisible&&e.hasAttribute("lock-visible")&&"false"!==e.getAttribute("lock-visible")&&(t.lockVisible=!0))}return e}handleQuery(e){if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(i.lockVisible||i.meta?.lockVisibility)return;return[{id:"visibility/hide-column",label:this.t("columns.hideColumn","Hide Column"),icon:"👁",order:30,action:()=>this.hideColumn(i.field)}]}}getToolPanel(){return{id:t.PANEL_ID,title:this.t("columns.panelTitle","Columns"),icon:"☰",tooltip:"Column visibility",order:100,render:e=>this.renderPanelContent(e)}}#i(){return this.grid.getPluginByName("shell")}show(){this.#i()?.openToolPanel(t.PANEL_ID)}hide(){this.#i()?.closeToolPanel()}toggle(){const e=this.#i();e?.isToolPanelOpen||e?.openToolPanel(),e?.toggleToolPanelSection(t.PANEL_ID)}isColumnVisible(e){return this.grid.isColumnVisible(e)}setColumnVisible(e,t){this.grid.setColumnVisible(e,t)}getVisibleColumns(){return this.grid.getAllColumns().filter(e=>e.visible).map(e=>e.field)}getHiddenColumns(){return this.grid.getAllColumns().filter(e=>!e.visible).map(e=>e.field)}showAll(){this.grid.showAllColumns()}toggleColumn(e){this.grid.toggleColumnVisibility(e)}showColumn(e){this.setColumnVisible(e,!0)}hideColumn(e){this.setColumnVisible(e,!1)}getAllColumns(){return this.grid.getAllColumns()}isPanelVisible(){const e=this.#i();return!!e?.isToolPanelOpen&&e.expandedToolPanelSections.includes(t.PANEL_ID)}renderPanelContent(e){const t=document.createElement("div");t.className="tbw-visibility-content";const i=document.createElement("div");i.className="tbw-visibility-list",t.appendChild(i);const r=document.createElement("button");return r.type="button",r.className="tbw-visibility-show-all",r.textContent=this.t("columns.showAll","Show All"),r.addEventListener("click",()=>{this.grid.showAllColumns(),this.rebuildToggles(i)}),t.appendChild(r),this.columnListElement=i,this.rebuildToggles(i),e.appendChild(t),()=>{this.columnListElement=null,this.moveMenu?.close(),t.remove()}}hasReorderPlugin(){const e=this.grid?.getPluginByName?.("reorder");return!(!e||"function"!=typeof e.moveColumn)}canMoveColumn(e){const t=this.grid.columns.find(t=>t.field===e.field);if(!t)return!1;const i=this.grid.query("canMoveColumn",t);return i.length>0&&!i.includes(!1)}rebuildToggles(e){const t=this.hasReorderPlugin();e.innerHTML="";const i=this.grid.getAllColumns().filter(e=>!e.utility),r=this.currentFragments();if(r.every(e=>!e.group))this.renderFlatColumnList(i,t,e);else for(const o of r)if(o.group)this.renderGroupSection(o.group,o.columns,t,e);else{const r=i.indexOf(o.columns[0]);e.appendChild(this.createColumnRow(o.columns[0],r,t,e))}}currentFragments(){const e=this.grid.getAllColumns().filter(e=>!e.utility),t=this.grid.query("getColumnGrouping")?.flat().filter(e=>e&&e.fields.length>0)??[];if(0===t.length)return e.map(e=>({group:null,columns:[e]}));const i=/* @__PURE__ */new Map;for(const r of t)for(const e of r.fields)i.set(e,r);return this.computeFragments(e,i)}computeFragments(e,t){const i=[];let r=null,o=[];for(const n of e){const e=t.get(n.field)??null;e&&r&&e.id===r.id?o.push(n):(o.length>0&&i.push({group:r,columns:o}),r=e,o=[n])}return o.length>0&&i.push({group:r,columns:o}),i}renderGroupSection(e,t,i,r){const o=t.map(e=>e.field),n=document.createElement("div");n.className="tbw-visibility-group-header",n.setAttribute("data-group-id",e.id),i&&(n.draggable=!0,n.classList.add("reorderable"),this.setupGroupDragListeners(n,e,o,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox";const a=t.filter(e=>e.visible).length,d=t.every(e=>e.lockVisible);a===t.length?(l.checked=!0,l.indeterminate=!1):0===a?(l.checked=!1,l.indeterminate=!1):(l.checked=!1,l.indeterminate=!0),l.disabled=d,l.addEventListener("change",()=>{const e=l.checked;for(const i of t)i.lockVisible||this.grid.setColumnVisible(i.field,e);setTimeout(()=>this.rebuildToggles(r),0)});const u=document.createElement("span");if(u.textContent=e.label,s.appendChild(l),s.appendChild(u),n.appendChild(s),i){const t=document.createElement("span");t.className="tbw-visibility-handle",this.setIcon(t,"dragHandle"),t.title=this.t("columns.dragGroupHandle","Drag to reorder group, or click for move options"),this.wireMoveHandle(t,e.label,()=>this.groupMoveActions(o)),n.insertBefore(t,s)}r.appendChild(n);const c=this.grid.getAllColumns().filter(e=>!e.utility);for(const g of t){const e=c.findIndex(e=>e.field===g.field),t=this.createColumnRow(g,e,i,r);t.classList.add("tbw-visibility-row--grouped"),r.appendChild(t)}}renderFlatColumnList(e,t,i){const r=this.grid.getAllColumns().filter(e=>!e.utility);for(const o of e){const e=r.findIndex(e=>e.field===o.field);i.appendChild(this.createColumnRow(o,e,t,i))}}createColumnRow(e,t,i,r){const o=e.header||e.field,n=document.createElement("div");n.className=e.lockVisible?"tbw-visibility-row locked":"tbw-visibility-row",n.setAttribute("data-field",e.field),n.setAttribute("data-index",String(t)),i&&this.canMoveColumn(e)&&(n.draggable=!0,n.classList.add("reorderable"),this.setupDragListeners(n,e.field,t,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox",l.checked=e.visible,l.disabled=e.lockVisible??!1,l.addEventListener("change",()=>{this.grid.toggleColumnVisibility(e.field),setTimeout(()=>this.rebuildToggles(r),0)});const a=document.createElement("span");if(a.textContent=o,s.appendChild(l),s.appendChild(a),i&&this.canMoveColumn(e)){const t=document.createElement("span");t.className="tbw-visibility-handle",this.setIcon(t,"dragHandle"),t.title=this.t("columns.dragHandle","Drag to reorder, or click for move options"),this.wireMoveHandle(t,o,()=>this.columnMoveActions(e.field)),n.appendChild(t)}return n.appendChild(s),n}wireMoveHandle(e,t,i){e.setAttribute("role","button"),e.tabIndex=-1,e.setAttribute("aria-label",`${t} — ${this.t("columns.moveHandleHint","drag, or activate for move options")}`),e.addEventListener("click",()=>{this.moveMenu??=g("tbw-visibility-move-menu","tbw-visibility-move-menu"),this.moveMenu.open(e,t,i())})}requestColumnMove(e,t,i){const r=i>t?i-1:i;if(r===t)return;const o=this.grid.getAllColumns(),n=o.filter(e=>!e.utility)[r]?.field,s=n?o.findIndex(e=>e.field===n):o.length;this.emit("column-reorder-request",{field:e,fromIndex:t,toIndex:s})}columnMoveActions(e){const t=this.grid.getAllColumns().filter(e=>!e.utility),i=t.findIndex(t=>t.field===e),r=e=>e>=0&&e<t.length&&this.canMoveColumn(t[e]);return[{label:this.t("columns.moveUp","Move up"),disabled:!r(i-1),run:()=>this.requestColumnMove(e,i,i-1)},{label:this.t("columns.moveDown","Move down"),disabled:!r(i+1),run:()=>this.requestColumnMove(e,i,i+2)},{label:this.t("columns.moveToTop","Move to top"),disabled:i<=0||!r(0),run:()=>this.requestColumnMove(e,i,0)},{label:this.t("columns.moveToBottom","Move to bottom"),disabled:i<0||i>=t.length-1||!r(t.length-1),run:()=>this.requestColumnMove(e,i,t.length)}]}groupMoveActions(e){const t=this.currentFragments(),i=t.findIndex(t=>t.columns[0]?.field===e[0]),r=e=>t[e].columns.map(e=>e.field),o=i<=0,n=i<0||i>=t.length-1;return[{label:this.t("columns.moveUp","Move up"),disabled:o,run:()=>this.executeGroupDrop(e,r(i-1),!0)},{label:this.t("columns.moveDown","Move down"),disabled:n,run:()=>this.executeGroupDrop(e,r(i+1),!1)},{label:this.t("columns.moveToTop","Move to top"),disabled:o,run:()=>this.executeGroupDrop(e,r(0),!0)},{label:this.t("columns.moveToBottom","Move to bottom"),disabled:n,run:()=>this.executeGroupDrop(e,r(t.length-1),!1)}]}setupGroupDragListeners(t,i,r,o){t.addEventListener("dragstart",n=>{this.isDragging=!0,this.draggedGroupId=i.id,this.draggedGroupFields=[...r],this.draggedField=null,this.draggedIndex=null,n.dataTransfer&&(n.dataTransfer.effectAllowed="move",n.dataTransfer.setData("text/plain",`group:${i.id}`)),t.classList.add(e),o.querySelectorAll(".tbw-visibility-row--grouped").forEach(t=>{const i=t.getAttribute("data-field");i&&this.draggedGroupFields.includes(i)&&t.classList.add(e)})}),t.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedGroupId=null,this.draggedGroupFields=[],this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(o)}),t.addEventListener("dragover",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length===r.length&&this.draggedGroupFields.every(e=>r.includes(e)))return;if(!this.draggedGroupId)return;const i=t.getBoundingClientRect(),n=i.top+i.height/2,s=e.clientY<n;this.clearDragClasses(o),t.classList.add("drop-target"),t.classList.toggle("drop-before",s),t.classList.toggle("drop-after",!s)}),t.addEventListener("dragleave",()=>{t.classList.remove("drop-target","drop-before","drop-after")}),t.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging||!this.draggedGroupId)return;if(this.draggedGroupFields.length===r.length&&this.draggedGroupFields.every(e=>r.includes(e)))return;const i=t.getBoundingClientRect(),o=e.clientY<i.top+i.height/2;this.executeGroupDrop(this.draggedGroupFields,r,o)})}executeGroupDrop(e,t,i){const r=this.grid.getAllColumns().map(e=>e.field),o=r.filter(t=>!e.includes(t)),n=i?t[0]:t[t.length-1],s=o.indexOf(n);if(-1===s)return;const l=i?s:s+1,a=r.filter(t=>e.includes(t));o.splice(l,0,...a);const d=this.grid.getPluginByName?.("reorder");d?.setColumnOrder&&d.gridElement?d.setColumnOrder(o):this.grid.setColumnOrder(o),requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})}setupDragListeners(t,i,r,o){t.addEventListener("dragstart",o=>{this.isDragging=!0,this.draggedField=i,this.draggedIndex=r,this.draggedGroupId=null,this.draggedGroupFields=[],o.dataTransfer&&(o.dataTransfer.effectAllowed="move",o.dataTransfer.setData("text/plain",i)),t.classList.add(e)}),t.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(o)}),t.addEventListener("dragover",n=>{if(n.preventDefault(),!this.isDragging)return;if(this.draggedGroupId){if(t.classList.contains("tbw-visibility-row--grouped"))return}else if(this.draggedField===i)return;const s=t.getBoundingClientRect(),l=s.top+s.height/2;this.dropIndex=n.clientY<l?r:r+1,this.clearDragClasses(o),this.draggedGroupId?(o.querySelector(`.tbw-visibility-group-header[data-group-id="${this.draggedGroupId}"]`)?.classList.add(e),o.querySelectorAll(".tbw-visibility-row--grouped").forEach(t=>{const i=t.getAttribute("data-field");i&&this.draggedGroupFields.includes(i)&&t.classList.add(e)})):this.draggedField&&o.querySelector(`.tbw-visibility-row[data-field="${this.draggedField}"]`)?.classList.add(e),t.classList.add("drop-target"),t.classList.toggle("drop-before",n.clientY<l),t.classList.toggle("drop-after",n.clientY>=l)}),t.addEventListener("dragleave",()=>{t.classList.remove("drop-target","drop-before","drop-after")}),t.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupId&&this.draggedGroupFields.length>0){if(t.classList.contains("tbw-visibility-row--grouped"))return;const r=t.getBoundingClientRect(),o=e.clientY<r.top+r.height/2;return void this.executeGroupDrop(this.draggedGroupFields,[i],o)}const r=this.draggedField,o=this.draggedIndex,n=this.dropIndex;if(null===r||null===o||null===n)return;const s=n>o?n-1:n;if(s!==o){const e=this.grid.getAllColumns(),t=e.filter(e=>!e.utility)[s]?.field,i={field:r,fromIndex:o,toIndex:t?e.findIndex(e=>e.field===t):e.length};this.emit("column-reorder-request",i)}})}};export{h as VisibilityPlugin};
|
|
1
|
+
var e="dragging",t={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};function i(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function r(e,t,r,o){return`${i(r,o)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}var o="__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("")),n=(new RegExp(`__(proto|defineGetter|defineSetter)|${o.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,l=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),a=/^\s*(javascript|vbscript|data|blob):/i;function d(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],i=e.querySelectorAll("*");for(const r of i){const e=r.tagName.toLowerCase();if(n.has(e)){t.push(r);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===r.namespaceURI)&&Array.from(r.attributes).some(e=>s.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(r);continue}const i=[];for(const t of r.attributes){const e=t.name.toLowerCase();s.test(e)?i.push(t.name):"is"!==e?(l.has(e)&&a.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&i.push(t.name):i.push(t.name)}i.forEach(e=>r.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}var u=class{static dependencies;static manifest;aliases;version="3.8.2";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const t={...this.userConfig},i={};for(const r of Object.keys(t))i[r]=this;for(const o of e){const e=o.userConfig;for(const[n,s]of Object.entries(e)){if(void 0===s)continue;if(!(n in t)){t[n]=s,i[n]=o;continue}if(t[n]===s)continue;const e=i[n]?.constructor.name??this.constructor.name,l=o.constructor.name,a=r("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${n}" supplied by both ${e} and ${l}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(a)}}Object.assign(this.userConfig,t)}refreshUserConfigFrom(e){const t=this.userConfig,i={...e.userConfig};for(const r of Object.keys(t))delete t[r];Object.assign(t,i)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const i=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(i),i.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const i=this.grid?.query?.(e,t);return Array.isArray(i)?i.some(Boolean):!!i}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...t,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),i=parseInt(t,10);if(!isNaN(i))return i}return 200}setIcon(e,t,i){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const r=this.#t(t,i);var o,n;void 0!==r?"string"==typeof r?(o=e,(n=r)&&"string"==typeof n?-1!==n.indexOf("<")||-1!==n.indexOf("&")?o.replaceChildren(d(n)):o.textContent=n:o.replaceChildren()):r instanceof HTMLElement&&e.replaceChildren(r.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const i=document.createElement("span");i.setAttribute("part","sort-indicator"),i.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(i,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(i,"sortNone"));const r=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return r?e.insertBefore(i,r):e.appendChild(i),i}warn(e,t){void 0!==t?console.warn(r(e,t,this.gridElement.id,this.name)):console.warn(`${i(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(r(e,t,this.gridElement.id,this.name))}};function c(){return"function"==typeof HTMLElement.prototype?.showPopover}function g(e,t){let i=null,r=!1,o=!1;const n=new AbortController;function s(){r&&i&&(r=!1,c()&&i.hidePopover(),i.hidden=!0)}return document.addEventListener("pointerdown",e=>{r&&i&&!e.composedPath().includes(i)&&s()},{capture:!0,signal:n.signal}),document.addEventListener("keydown",e=>{"Escape"===e.key&&s()},{capture:!0,signal:n.signal}),{get element(){return i},open(l,a,d){if(o||0===d.length)return;i||(i=function(){const i=document.createElement("div");return i.id=e,i.className=t,i.setAttribute("popover","manual"),i.setAttribute("role","group"),i.hidden=!0,i.addEventListener("focusout",e=>{const t=e.relatedTarget;t instanceof Node&&!i.contains(t)&&s()},{signal:n.signal}),i}());const u=l.closest("tbw-grid, [data-tbw-grid]")??document.body;i.parentNode!==u&&u.appendChild(i),i.setAttribute("aria-label",a),i.replaceChildren();for(const e of d){const r=document.createElement("button");r.type="button",r.className=`${t}-item`,r.textContent=e.label,r.disabled=!0===e.disabled,r.addEventListener("click",()=>{s(),e.run()}),i.appendChild(r)}i.hidden=!1,!r&&c()&&i.showPopover(),r=!0,function(e){if(!i)return;const t=e.getBoundingClientRect(),r=i.getBoundingClientRect(),o=Math.max(4,Math.min(t.left,window.innerWidth-r.width-4)),n=t.bottom+6,s=n+r.height<=window.innerHeight?n:Math.max(4,t.top-6-r.height);i.style.left=`${Math.round(o)}px`,i.style.top=`${Math.round(s)}px`}(l),i.querySelector("button:not([disabled])")?.focus()},close:s,dispose(){o=!0,s(),n.abort(),i?.remove(),i=null}}}var h=class t extends u{static dependencies=[{name:"shell",required:!0,reason:"VisibilityPlugin renders its column list in a shell tool panel"},{name:"reorder",required:!1,reason:"Enables drag-to-reorder columns in visibility panel"}];static manifest={queries:[{type:"getContextMenuItems",description:'Contributes "Hide column" item to the header context menu'}]};name="visibility";static PANEL_ID="columns";styles='@layer tbw-plugins{.tbw-visibility-content{flex-direction:column;height:100%;display:flex}.tbw-visibility-list{padding:var(--tbw-panel-padding,var(--tbw-spacing-md,.5rem));flex:1;overflow-y:auto}.tbw-visibility-row{align-items:center;gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));padding:var(--tbw-menu-item-padding,.375rem .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm,.8125rem);border-radius:var(--tbw-border-radius,.25rem);display:flex;position:relative}.tbw-visibility-row:hover{background:var(--tbw-visibility-hover,var(--tbw-color-row-hover))}.tbw-visibility-row input[type=checkbox]{cursor:pointer}.tbw-visibility-row.locked span{color:var(--tbw-color-fg-muted)}.tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs,.625rem);letter-spacing:-2px;-webkit-user-select:none;user-select:none;flex-shrink:0}.tbw-visibility-row.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}.tbw-visibility-label{align-items:center;gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));cursor:pointer;flex:1;display:flex}.tbw-visibility-row.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-row.drop-before:before{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;top:0;left:0;right:0}.tbw-visibility-row.drop-after:after{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;bottom:0;left:0;right:0}.tbw-visibility-show-all{margin:var(--tbw-panel-padding,var(--tbw-spacing-md,.5rem));padding:var(--tbw-button-padding,.5rem .75rem);border:1px solid var(--tbw-visibility-border,var(--tbw-color-border));border-radius:var(--tbw-border-radius,.25rem);background:var(--tbw-visibility-btn-bg,var(--tbw-color-header-bg));color:var(--tbw-color-fg);cursor:pointer;font-size:var(--tbw-font-size-sm,.8125rem)}.tbw-visibility-show-all:hover{background:var(--tbw-visibility-hover,var(--tbw-color-row-hover))}.tbw-visibility-group-header{padding:var(--tbw-menu-item-padding,.375rem .25rem);font-size:var(--tbw-font-size-sm,.8125rem);color:var(--tbw-color-fg);border-bottom:1px solid var(--tbw-color-border);margin-top:var(--tbw-spacing-sm,.25rem);align-items:center;font-weight:600;display:flex;position:relative}.tbw-visibility-group-header:first-child{margin-top:0}.tbw-visibility-group-header .tbw-visibility-label{gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem))}.tbw-visibility-group-header.reorderable{cursor:grab}.tbw-visibility-group-header.reorderable:hover{background:var(--tbw-visibility-hover,var(--tbw-color-row-hover))}.tbw-visibility-group-header .tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs,.625rem);letter-spacing:-2px;-webkit-user-select:none;user-select:none;flex-shrink:0}.tbw-visibility-group-header.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}@media (hover:none){.tbw-visibility-row.reorderable .tbw-visibility-handle,.tbw-visibility-group-header.reorderable .tbw-visibility-handle{color:var(--tbw-color-fg)}}@media (pointer:coarse){.tbw-visibility-handle{min-width:var(--tbw-touch-target-min,24px);min-height:var(--tbw-touch-target-min,24px);justify-content:center;align-items:center;display:inline-flex}}.tbw-visibility-group-header.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-group-header.drop-before:before{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;top:0;left:0;right:0}.tbw-visibility-group-header.drop-after:after{content:"";background:var(--tbw-visibility-indicator,var(--tbw-color-accent));height:2px;position:absolute;bottom:0;left:0;right:0}.tbw-visibility-row--grouped{padding-left:calc(var(--tbw-panel-padding,var(--tbw-spacing-md,.5rem)) + .75rem)}.tbw-visibility-move-menu{background:var(--tbw-color-panel-bg,light-dark(#fff,#1e1e1e));min-width:10rem;color:var(--tbw-color-panel-fg,light-dark(#1a1a1a,#eaeaea));border:1px solid var(--tbw-color-border,light-dark(#d0d0d0,#3a3a3a));border-radius:var(--tbw-border-radius,.25rem);box-shadow:var(--tbw-shadow-panel,0 4px 12px light-dark(#0003,#00000080));font:inherit;z-index:10001;flex-direction:column;margin:0;padding:4px;display:flex;position:fixed}.tbw-visibility-move-menu[hidden]{display:none}.tbw-visibility-move-menu-item{min-height:var(--tbw-touch-target-min,24px);text-align:start;color:inherit;font:inherit;border-radius:min(var(--tbw-border-radius,.25rem), 6px);cursor:pointer;background:0 0;border:0;padding:4px 8px}.tbw-visibility-move-menu-item:hover:not(:disabled){background:var(--tbw-color-row-hover,light-dark(#00000010,#ffffff14))}.tbw-visibility-move-menu-item:disabled{opacity:.5;cursor:default}}';get defaultConfig(){return{}}columnListElement=null;isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;draggedGroupId=null;draggedGroupFields=[];moveMenu=null;clearDragClasses(t){t.querySelectorAll(".tbw-visibility-row, .tbw-visibility-group-header").forEach(t=>{t.classList.remove(e,"drop-target","drop-before","drop-after")})}attach(e){super.attach(e),this.gridElement.addEventListener("column-move",()=>{this.columnListElement&&requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})},{signal:this.disconnectSignal})}detach(){this.columnListElement=null,this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.moveMenu?.dispose(),this.moveMenu=null}processColumns(e){for(const t of e){const e=t.__element;e&&(void 0===t.hidden&&e.hasAttribute("hidden")&&"false"!==e.getAttribute("hidden")&&(t.hidden=!0),void 0===t.lockVisible&&e.hasAttribute("lock-visible")&&"false"!==e.getAttribute("lock-visible")&&(t.lockVisible=!0))}return e}handleQuery(e){if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(i.lockVisible||i.meta?.lockVisibility)return;return[{id:"visibility/hide-column",label:this.t("columns.hideColumn","Hide Column"),icon:"👁",order:30,action:()=>this.hideColumn(i.field)}]}}getToolPanel(){return{id:t.PANEL_ID,title:this.t("columns.panelTitle","Columns"),icon:"☰",tooltip:"Column visibility",order:100,render:e=>this.renderPanelContent(e)}}#i(){return this.grid.getPluginByName("shell")}show(){this.#i()?.openToolPanel(t.PANEL_ID)}hide(){this.#i()?.closeToolPanel()}toggle(){const e=this.#i();e?.isToolPanelOpen||e?.openToolPanel(),e?.toggleToolPanelSection(t.PANEL_ID)}isColumnVisible(e){return this.grid.isColumnVisible(e)}setColumnVisible(e,t){this.grid.setColumnVisible(e,t)}getVisibleColumns(){return this.grid.getAllColumns().filter(e=>e.visible).map(e=>e.field)}getHiddenColumns(){return this.grid.getAllColumns().filter(e=>!e.visible).map(e=>e.field)}showAll(){this.grid.showAllColumns()}toggleColumn(e){this.grid.toggleColumnVisibility(e)}showColumn(e){this.setColumnVisible(e,!0)}hideColumn(e){this.setColumnVisible(e,!1)}getAllColumns(){return this.grid.getAllColumns()}isPanelVisible(){const e=this.#i();return!!e?.isToolPanelOpen&&e.expandedToolPanelSections.includes(t.PANEL_ID)}renderPanelContent(e){const t=document.createElement("div");t.className="tbw-visibility-content";const i=document.createElement("div");i.className="tbw-visibility-list",t.appendChild(i);const r=document.createElement("button");return r.type="button",r.className="tbw-visibility-show-all",r.textContent=this.t("columns.showAll","Show All"),r.addEventListener("click",()=>{this.grid.showAllColumns(),this.rebuildToggles(i)}),t.appendChild(r),this.columnListElement=i,this.rebuildToggles(i),e.appendChild(t),()=>{this.columnListElement=null,this.moveMenu?.close(),t.remove()}}hasReorderPlugin(){const e=this.grid?.getPluginByName?.("reorder");return!(!e||"function"!=typeof e.moveColumn)}canMoveColumn(e){const t=this.grid.columns.find(t=>t.field===e.field);if(!t)return!1;const i=this.grid.query("canMoveColumn",t);return i.length>0&&!i.includes(!1)}rebuildToggles(e){const t=this.hasReorderPlugin();e.innerHTML="";const i=this.grid.getAllColumns().filter(e=>!e.utility),r=this.currentFragments();if(r.every(e=>!e.group))this.renderFlatColumnList(i,t,e);else for(const o of r)if(o.group)this.renderGroupSection(o.group,o.columns,t,e);else{const r=i.indexOf(o.columns[0]);e.appendChild(this.createColumnRow(o.columns[0],r,t,e))}}currentFragments(){const e=this.grid.getAllColumns().filter(e=>!e.utility),t=this.grid.query("getColumnGrouping")?.flat().filter(e=>e&&e.fields.length>0)??[];if(0===t.length)return e.map(e=>({group:null,columns:[e]}));const i=/* @__PURE__ */new Map;for(const r of t)for(const e of r.fields)i.set(e,r);return this.computeFragments(e,i)}computeFragments(e,t){const i=[];let r=null,o=[];for(const n of e){const e=t.get(n.field)??null;e&&r&&e.id===r.id?o.push(n):(o.length>0&&i.push({group:r,columns:o}),r=e,o=[n])}return o.length>0&&i.push({group:r,columns:o}),i}renderGroupSection(e,t,i,r){const o=t.map(e=>e.field),n=document.createElement("div");n.className="tbw-visibility-group-header",n.setAttribute("data-group-id",e.id),i&&(n.draggable=!0,n.classList.add("reorderable"),this.setupGroupDragListeners(n,e,o,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox";const a=t.filter(e=>e.visible).length,d=t.every(e=>e.lockVisible);a===t.length?(l.checked=!0,l.indeterminate=!1):0===a?(l.checked=!1,l.indeterminate=!1):(l.checked=!1,l.indeterminate=!0),l.disabled=d,l.addEventListener("change",()=>{const e=l.checked;for(const i of t)i.lockVisible||this.grid.setColumnVisible(i.field,e);setTimeout(()=>this.rebuildToggles(r),0)});const u=document.createElement("span");if(u.textContent=e.label,s.appendChild(l),s.appendChild(u),n.appendChild(s),i){const t=document.createElement("span");t.className="tbw-visibility-handle",this.setIcon(t,"dragHandle"),t.title=this.t("columns.dragGroupHandle","Drag to reorder group, or click for move options"),this.wireMoveHandle(t,e.label,()=>this.groupMoveActions(o)),n.insertBefore(t,s)}r.appendChild(n);const c=this.grid.getAllColumns().filter(e=>!e.utility);for(const g of t){const e=c.findIndex(e=>e.field===g.field),t=this.createColumnRow(g,e,i,r);t.classList.add("tbw-visibility-row--grouped"),r.appendChild(t)}}renderFlatColumnList(e,t,i){const r=this.grid.getAllColumns().filter(e=>!e.utility);for(const o of e){const e=r.findIndex(e=>e.field===o.field);i.appendChild(this.createColumnRow(o,e,t,i))}}createColumnRow(e,t,i,r){const o=e.header||e.field,n=document.createElement("div");n.className=e.lockVisible?"tbw-visibility-row locked":"tbw-visibility-row",n.setAttribute("data-field",e.field),n.setAttribute("data-index",String(t)),i&&this.canMoveColumn(e)&&(n.draggable=!0,n.classList.add("reorderable"),this.setupDragListeners(n,e.field,t,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox",l.checked=e.visible,l.disabled=e.lockVisible??!1,l.addEventListener("change",()=>{this.grid.toggleColumnVisibility(e.field),setTimeout(()=>this.rebuildToggles(r),0)});const a=document.createElement("span");if(a.textContent=o,s.appendChild(l),s.appendChild(a),i&&this.canMoveColumn(e)){const t=document.createElement("span");t.className="tbw-visibility-handle",this.setIcon(t,"dragHandle"),t.title=this.t("columns.dragHandle","Drag to reorder, or click for move options"),this.wireMoveHandle(t,o,()=>this.columnMoveActions(e.field)),n.appendChild(t)}return n.appendChild(s),n}wireMoveHandle(e,t,i){e.setAttribute("role","button"),e.tabIndex=-1,e.setAttribute("aria-label",`${t} — ${this.t("columns.moveHandleHint","drag, or activate for move options")}`),e.addEventListener("click",()=>{this.moveMenu??=g("tbw-visibility-move-menu","tbw-visibility-move-menu"),this.moveMenu.open(e,t,i())})}requestColumnMove(e,t,i){const r=i>t?i-1:i;if(r===t)return;const o=this.grid.getAllColumns(),n=o.filter(e=>!e.utility)[r]?.field,s=n?o.findIndex(e=>e.field===n):o.length;this.emit("column-reorder-request",{field:e,fromIndex:t,toIndex:s})}columnMoveActions(e){const t=this.grid.getAllColumns().filter(e=>!e.utility),i=t.findIndex(t=>t.field===e),r=e=>e>=0&&e<t.length&&this.canMoveColumn(t[e]);return[{label:this.t("columns.moveUp","Move up"),disabled:!r(i-1),run:()=>this.requestColumnMove(e,i,i-1)},{label:this.t("columns.moveDown","Move down"),disabled:!r(i+1),run:()=>this.requestColumnMove(e,i,i+2)},{label:this.t("columns.moveToTop","Move to top"),disabled:i<=0||!r(0),run:()=>this.requestColumnMove(e,i,0)},{label:this.t("columns.moveToBottom","Move to bottom"),disabled:i<0||i>=t.length-1||!r(t.length-1),run:()=>this.requestColumnMove(e,i,t.length)}]}groupMoveActions(e){const t=this.currentFragments(),i=t.findIndex(t=>t.columns[0]?.field===e[0]),r=e=>t[e].columns.map(e=>e.field),o=i<=0,n=i<0||i>=t.length-1;return[{label:this.t("columns.moveUp","Move up"),disabled:o,run:()=>this.executeGroupDrop(e,r(i-1),!0)},{label:this.t("columns.moveDown","Move down"),disabled:n,run:()=>this.executeGroupDrop(e,r(i+1),!1)},{label:this.t("columns.moveToTop","Move to top"),disabled:o,run:()=>this.executeGroupDrop(e,r(0),!0)},{label:this.t("columns.moveToBottom","Move to bottom"),disabled:n,run:()=>this.executeGroupDrop(e,r(t.length-1),!1)}]}setupGroupDragListeners(t,i,r,o){t.addEventListener("dragstart",n=>{this.isDragging=!0,this.draggedGroupId=i.id,this.draggedGroupFields=[...r],this.draggedField=null,this.draggedIndex=null,n.dataTransfer&&(n.dataTransfer.effectAllowed="move",n.dataTransfer.setData("text/plain",`group:${i.id}`)),t.classList.add(e),o.querySelectorAll(".tbw-visibility-row--grouped").forEach(t=>{const i=t.getAttribute("data-field");i&&this.draggedGroupFields.includes(i)&&t.classList.add(e)})}),t.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedGroupId=null,this.draggedGroupFields=[],this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(o)}),t.addEventListener("dragover",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length===r.length&&this.draggedGroupFields.every(e=>r.includes(e)))return;if(!this.draggedGroupId)return;const i=t.getBoundingClientRect(),n=i.top+i.height/2,s=e.clientY<n;this.clearDragClasses(o),t.classList.add("drop-target"),t.classList.toggle("drop-before",s),t.classList.toggle("drop-after",!s)}),t.addEventListener("dragleave",()=>{t.classList.remove("drop-target","drop-before","drop-after")}),t.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging||!this.draggedGroupId)return;if(this.draggedGroupFields.length===r.length&&this.draggedGroupFields.every(e=>r.includes(e)))return;const i=t.getBoundingClientRect(),o=e.clientY<i.top+i.height/2;this.executeGroupDrop(this.draggedGroupFields,r,o)})}executeGroupDrop(e,t,i){const r=this.grid.getAllColumns().map(e=>e.field),o=r.filter(t=>!e.includes(t)),n=i?t[0]:t[t.length-1],s=o.indexOf(n);if(-1===s)return;const l=i?s:s+1,a=r.filter(t=>e.includes(t));o.splice(l,0,...a);const d=this.grid.getPluginByName?.("reorder");d?.setColumnOrder&&d.gridElement?d.setColumnOrder(o):this.grid.setColumnOrder(o),requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})}setupDragListeners(t,i,r,o){t.addEventListener("dragstart",o=>{this.isDragging=!0,this.draggedField=i,this.draggedIndex=r,this.draggedGroupId=null,this.draggedGroupFields=[],o.dataTransfer&&(o.dataTransfer.effectAllowed="move",o.dataTransfer.setData("text/plain",i)),t.classList.add(e)}),t.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(o)}),t.addEventListener("dragover",n=>{if(n.preventDefault(),!this.isDragging)return;if(this.draggedGroupId){if(t.classList.contains("tbw-visibility-row--grouped"))return}else if(this.draggedField===i)return;const s=t.getBoundingClientRect(),l=s.top+s.height/2;this.dropIndex=n.clientY<l?r:r+1,this.clearDragClasses(o),this.draggedGroupId?(o.querySelector(`.tbw-visibility-group-header[data-group-id="${this.draggedGroupId}"]`)?.classList.add(e),o.querySelectorAll(".tbw-visibility-row--grouped").forEach(t=>{const i=t.getAttribute("data-field");i&&this.draggedGroupFields.includes(i)&&t.classList.add(e)})):this.draggedField&&o.querySelector(`.tbw-visibility-row[data-field="${this.draggedField}"]`)?.classList.add(e),t.classList.add("drop-target"),t.classList.toggle("drop-before",n.clientY<l),t.classList.toggle("drop-after",n.clientY>=l)}),t.addEventListener("dragleave",()=>{t.classList.remove("drop-target","drop-before","drop-after")}),t.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupId&&this.draggedGroupFields.length>0){if(t.classList.contains("tbw-visibility-row--grouped"))return;const r=t.getBoundingClientRect(),o=e.clientY<r.top+r.height/2;return void this.executeGroupDrop(this.draggedGroupFields,[i],o)}const r=this.draggedField,o=this.draggedIndex,n=this.dropIndex;if(null===r||null===o||null===n)return;const s=n>o?n-1:n;if(s!==o){const e=this.grid.getAllColumns(),t=e.filter(e=>!e.utility)[s]?.field,i={field:r,fromIndex:o,toIndex:t?e.findIndex(e=>e.field===t):e.length};this.emit("column-reorder-request",i)}})}};export{h as VisibilityPlugin};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toolbox-web/grid",
|
|
3
|
-
"version": "3.8.
|
|
3
|
+
"version": "3.8.2",
|
|
4
4
|
"description": "Zero-dependency, framework-agnostic data grid web component with virtualization, sorting, filtering, editing, and 20+ plugins. Works in vanilla JS, React, Vue, Angular, and any framework.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|