@toolbox-web/grid 1.25.1 → 1.26.0

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.
Files changed (101) hide show
  1. package/all.js +2 -2
  2. package/all.js.map +1 -1
  3. package/index.js +1 -1
  4. package/index.js.map +1 -1
  5. package/lib/core/grid.d.ts +18 -2
  6. package/lib/core/internal/diagnostics.d.ts +164 -0
  7. package/lib/core/internal/sorting.d.ts +53 -4
  8. package/lib/core/internal/utils.d.ts +0 -8
  9. package/lib/core/plugin/base-plugin.d.ts +18 -2
  10. package/lib/core/plugin/plugin-manager.d.ts +6 -4
  11. package/lib/core/types.d.ts +3 -2
  12. package/lib/features/registry.js +1 -1
  13. package/lib/features/registry.js.map +1 -1
  14. package/lib/plugins/clipboard/index.js +1 -1
  15. package/lib/plugins/clipboard/index.js.map +1 -1
  16. package/lib/plugins/column-virtualization/index.js +1 -1
  17. package/lib/plugins/column-virtualization/index.js.map +1 -1
  18. package/lib/plugins/context-menu/index.js +1 -1
  19. package/lib/plugins/context-menu/index.js.map +1 -1
  20. package/lib/plugins/editing/index.js +1 -1
  21. package/lib/plugins/editing/index.js.map +1 -1
  22. package/lib/plugins/editing/types.d.ts +52 -4
  23. package/lib/plugins/export/ExportPlugin.d.ts +2 -2
  24. package/lib/plugins/export/index.js +1 -1
  25. package/lib/plugins/export/index.js.map +1 -1
  26. package/lib/plugins/filtering/FilteringPlugin.d.ts +2 -2
  27. package/lib/plugins/filtering/index.js +1 -1
  28. package/lib/plugins/filtering/index.js.map +1 -1
  29. package/lib/plugins/grouping-columns/index.js +1 -1
  30. package/lib/plugins/grouping-columns/index.js.map +1 -1
  31. package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts +2 -2
  32. package/lib/plugins/grouping-rows/index.js +2 -2
  33. package/lib/plugins/grouping-rows/index.js.map +1 -1
  34. package/lib/plugins/master-detail/index.js +1 -1
  35. package/lib/plugins/master-detail/index.js.map +1 -1
  36. package/lib/plugins/multi-sort/MultiSortPlugin.d.ts +2 -2
  37. package/lib/plugins/multi-sort/index.js +1 -1
  38. package/lib/plugins/multi-sort/index.js.map +1 -1
  39. package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts +2 -2
  40. package/lib/plugins/pinned-columns/index.js +1 -1
  41. package/lib/plugins/pinned-columns/index.js.map +1 -1
  42. package/lib/plugins/pinned-rows/index.js +1 -1
  43. package/lib/plugins/pinned-rows/index.js.map +1 -1
  44. package/lib/plugins/pivot/index.js +1 -1
  45. package/lib/plugins/pivot/index.js.map +1 -1
  46. package/lib/plugins/print/PrintPlugin.d.ts +2 -1
  47. package/lib/plugins/print/index.js +1 -1
  48. package/lib/plugins/print/index.js.map +1 -1
  49. package/lib/plugins/print/print-isolated.d.ts +2 -1
  50. package/lib/plugins/reorder-columns/ReorderPlugin.d.ts +2 -2
  51. package/lib/plugins/reorder-columns/index.js +1 -1
  52. package/lib/plugins/reorder-columns/index.js.map +1 -1
  53. package/lib/plugins/reorder-rows/RowReorderPlugin.d.ts +2 -2
  54. package/lib/plugins/reorder-rows/index.js +1 -1
  55. package/lib/plugins/reorder-rows/index.js.map +1 -1
  56. package/lib/plugins/responsive/index.js +1 -1
  57. package/lib/plugins/responsive/index.js.map +1 -1
  58. package/lib/plugins/selection/SelectionPlugin.d.ts +2 -0
  59. package/lib/plugins/selection/index.js +1 -1
  60. package/lib/plugins/selection/index.js.map +1 -1
  61. package/lib/plugins/server-side/index.js +1 -1
  62. package/lib/plugins/server-side/index.js.map +1 -1
  63. package/lib/plugins/tree/TreePlugin.d.ts +2 -2
  64. package/lib/plugins/tree/index.js +1 -1
  65. package/lib/plugins/tree/index.js.map +1 -1
  66. package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts +2 -2
  67. package/lib/plugins/undo-redo/index.js +1 -1
  68. package/lib/plugins/undo-redo/index.js.map +1 -1
  69. package/lib/plugins/visibility/VisibilityPlugin.d.ts +2 -2
  70. package/lib/plugins/visibility/index.js +1 -1
  71. package/lib/plugins/visibility/index.js.map +1 -1
  72. package/package.json +1 -1
  73. package/umd/grid.all.umd.js +1 -1
  74. package/umd/grid.all.umd.js.map +1 -1
  75. package/umd/grid.umd.js +1 -1
  76. package/umd/grid.umd.js.map +1 -1
  77. package/umd/plugins/clipboard.umd.js +1 -1
  78. package/umd/plugins/clipboard.umd.js.map +1 -1
  79. package/umd/plugins/context-menu.umd.js +1 -1
  80. package/umd/plugins/context-menu.umd.js.map +1 -1
  81. package/umd/plugins/editing.umd.js +1 -1
  82. package/umd/plugins/editing.umd.js.map +1 -1
  83. package/umd/plugins/export.umd.js.map +1 -1
  84. package/umd/plugins/filtering.umd.js.map +1 -1
  85. package/umd/plugins/grouping-columns.umd.js +1 -1
  86. package/umd/plugins/grouping-columns.umd.js.map +1 -1
  87. package/umd/plugins/grouping-rows.umd.js.map +1 -1
  88. package/umd/plugins/multi-sort.umd.js.map +1 -1
  89. package/umd/plugins/pinned-columns.umd.js.map +1 -1
  90. package/umd/plugins/print.umd.js +1 -1
  91. package/umd/plugins/print.umd.js.map +1 -1
  92. package/umd/plugins/reorder-columns.umd.js.map +1 -1
  93. package/umd/plugins/reorder-rows.umd.js.map +1 -1
  94. package/umd/plugins/responsive.umd.js +1 -1
  95. package/umd/plugins/responsive.umd.js.map +1 -1
  96. package/umd/plugins/selection.umd.js +1 -1
  97. package/umd/plugins/selection.umd.js.map +1 -1
  98. package/umd/plugins/tree.umd.js.map +1 -1
  99. package/umd/plugins/undo-redo.umd.js +1 -1
  100. package/umd/plugins/undo-redo.umd.js.map +1 -1
  101. package/umd/plugins/visibility.umd.js.map +1 -1
@@ -1,2 +1,2 @@
1
- function e(e){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function r(r){return r.map(r=>{if(r.id)return r;if(!r.header)throw new Error('[tbw-grid] ColumnGroupDefinition requires either an "id" or a "header" to generate an id from.');return{...r,id:e(r.header)}})}function t(e){if(!e.length)return[];const r=/* @__PURE__ */new Map,t=[],o=(e,r)=>{if(!r.length)return;const o=t[t.length-1];o&&o.implicit&&o.firstIndex+o.columns.length===e?o.columns.push(...r):t.push({id:"__implicit__"+e,label:void 0,columns:r,firstIndex:e,implicit:!0})};let i=[],n=0;return e.forEach((e,s)=>{const l=e.group;if(!l)return 0===i.length&&(n=s),void i.push(e);i.length&&(o(n,i.slice()),i=[]);const d="string"==typeof l?l:l.id;let u=r.get(d);u||(u={id:d,label:"string"==typeof l?void 0:l.label,columns:[],firstIndex:s},r.set(d,u),t.push(u)),u.columns.push(e)}),i.length&&o(n,i),1===t.length&&t[0].implicit&&t[0].columns.length===e.length?[]:t}function o(e,r){const t=e.columns[0],o=e.columns[e.columns.length-1],i=t?r.findIndex(e=>e.field===t.field):-1,n=o?r.findIndex(e=>e.field===o.field):-1;return-1!==i&&-1!==n?[i,n]:null}function i(e,r){const t=/* @__PURE__ */new Set,i=[];for(const n of e){if(String(n.id).startsWith("__implicit__"))continue;const e=o(n,r);e&&i.push(e)}for(const n of e){if(!String(n.id).startsWith("__implicit__"))continue;const e=o(n,r);if(!e)continue;const[s,l]=e;i.some(([e,r])=>s>=e&&l<=r)&&t.add(String(n.id))}return t}const n='<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>',s={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:n,filterActive:n,print:"🖨️"};class l{static dependencies;static manifest;aliases;version="undefined"!=typeof __GRID_VERSION__?__GRID_VERSION__:"dev";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}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,r){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:r,bubbles:!0}))}emitCancelable(e,r){const t=new CustomEvent(e,{detail:r,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(t),t.defaultPrevented}on(e,r){this.grid?._pluginManager?.subscribe(this,e,r)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,r){this.grid?._pluginManager?.emitPluginEvent(e,r)}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{...s,...e}}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 r=this.gridElement;if(r){return"0"!==getComputedStyle(r).getPropertyValue("--tbw-animation-enabled").trim()}return!0}get animationDuration(){const e=this.gridElement;if(e){const r=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),t=parseInt(r,10);if(!isNaN(t))return t}return 200}resolveIcon(e,r){return void 0!==r?r:this.gridIcons[e]}setIcon(e,r){"string"==typeof r?e.innerHTML=r:r instanceof HTMLElement&&(e.innerHTML="",e.appendChild(r.cloneNode(!0)))}warn(e){var r,t;console.warn(`${r=this.gridElement.id,t=this.name,`[tbw-grid${r?`#${r}`:""}${t?`:${t}`:""}]`} ${e}`)}}class d extends l{static manifest={ownedProperties:[{property:"group",level:"column",description:'the "group" column property'},{property:"columnGroups",level:"config",description:'the "columnGroups" config property',isUsed:e=>Array.isArray(e)&&e.length>0}],queries:[{type:"getColumnGrouping",description:"Returns column group metadata for the visibility panel"}]};name="groupingColumns";styles="@layer tbw-plugins{.header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:var(--tbw-button-padding-sm, .25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm, .9em);text-transform:uppercase;letter-spacing:.5px;border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";get defaultConfig(){return{showGroupBorders:!0,lockGroupOrder:!1}}groups=[];isActive=!1;#r=/* @__PURE__ */new Set;#t=[];#o=/* @__PURE__ */new Map;attach(e){super.attach(e),this.gridElement.addEventListener("column-move",this.#i,{signal:this.disconnectSignal})}detach(){this.groups=[],this.isActive=!1,this.#r.clear(),this.#t=[],this.#o.clear()}#i=e=>{if(!this.isActive)return;const r=e,{field:t,columnOrder:o}=r.detail;if(this.config.lockGroupOrder)for(const i of this.groups)if(!i.id.startsWith("__implicit__")&&!this.#n(i,o))return r.preventDefault(),void this.#s(t);this.#l(o)};#l(e){this.#r.clear();const r=this.#d(e);for(const t of this.groups){const o=new Set(t.columns.map(e=>e.field));for(let t=e.length-1;t>=0;t--)if(o.has(e[t])){const o=e[t];o!==r&&this.#r.add(o);break}}}#d(e){if(0===this.groups.length)return null;for(let r=e.length-1;r>=0;r--){const t=e[r];for(const r of this.groups)if(r.columns.some(e=>e.field===t)){const t=new Set(r.columns.map(e=>e.field));for(let r=e.length-1;r>=0;r--)if(t.has(e[r]))return e[r]}}return null}#n(e,r){const t=e.columns.map(e=>r.indexOf(e.field)).filter(e=>-1!==e).sort((e,r)=>e-r);return t.length<=1||t.length===t[t.length-1]-t[0]+1}#s(e){const r=this.gridElement?.querySelector(`.header-row [part~="header-cell"][data-field="${e}"]`);r&&(r.style.setProperty("--_flash-color","var(--tbw-color-error)"),r.animate([{backgroundColor:"rgba(from var(--_flash-color) r g b / 30%)"},{backgroundColor:"transparent"}],{duration:400,easing:"ease-out"}))}handleQuery(e){if("getColumnGrouping"===e.type)return this.#u()}#u(){let e;if(this.#t.length>0)e=this.#t.filter(e=>e.children.length>0).map(e=>({id:e.id,label:e.header,fields:[...e.children]}));else if(this.isActive&&this.groups.length>0){e=this.groups.filter(e=>!e.id.startsWith("__implicit__")).map(e=>({id:e.id,label:e.label??e.id,fields:e.columns.map(e=>e.field)}));const r=this.columns;for(const t of r)if(t.hidden&&t.group){const r="string"==typeof t.group?t.group:t.group.id,o="string"==typeof t.group?t.group:t.group.label??t.group.id,i=e.find(e=>e.id===r);i?i.fields.includes(t.field)||i.fields.push(t.field):e.push({id:r,label:o,fields:[t.field]})}}else{const r=this.columns,t=/* @__PURE__ */new Map;for(const e of r){if(!e.group)continue;const r="string"==typeof e.group?e.group:e.group.id,o="string"==typeof e.group?e.group:e.group.label??e.group.id,i=t.get(r);i?i.fields.includes(e.field)||i.fields.push(e.field):t.set(r,{id:r,label:o,fields:[e.field]})}e=Array.from(t.values())}const r=this.grid?.getColumnOrder();if(r&&r.length>0){const t=new Map(r.map((e,r)=>[e,r]));for(const r of e)r.fields.sort((e,r)=>(t.get(e)??1/0)-(t.get(r)??1/0))}return e}static detect(e,r){const t=r?.features?.groupingColumns;if(t&&"object"==typeof t&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;if(r?.columnGroups&&Array.isArray(r.columnGroups)&&r.columnGroups.length>0)return!0;const o=r?.columns;return!!Array.isArray(o)&&function(e){return e.some(e=>null!=e.group)}(o)}processColumns(e){const o=this.config?.columnGroups,i=this.grid?.gridConfig?.columnGroups;let n,s;if(o&&Array.isArray(o)&&o.length>0?(i&&Array.isArray(i)&&i.length>0&&console.warn("[tbw-grid] columnGroups defined in both gridConfig and groupingColumns feature config. Using feature config (higher precedence)."),n=o):i&&Array.isArray(i)&&i.length>0&&(n=i),n&&n.length>0){const t=r(n);this.#t=t,this.#o.clear();for(const e of t)e.renderer&&this.#o.set(e.id,e.renderer);const o=/* @__PURE__ */new Map;for(const e of t)for(const r of e.children)o.set(r,{id:e.id,label:e.header});s=e.map(e=>{const r=o.get(e.field);return r&&!e.group?{...e,group:r}:e})}else this.#t=[],this.#o.clear(),s=[...e];const l=t(s);if(0===l.length)return this.isActive=!1,this.groups=[],s;if(this.#o.size>0)for(const r of l){const e=this.#o.get(r.id);e&&(r.renderer=e)}this.isActive=!0,this.groups=l,this.#r.clear();for(const r of l){const e=r.columns[r.columns.length-1];e?.field&&this.#r.add(e.field)}return s}afterRender(){if(!this.isActive){const e=this.gridElement?.querySelector(".header"),r=e?.querySelector(".header-group-row");return void(r&&r.remove())}const e=this.gridElement?.querySelector(".header");if(!e)return;const r=e.querySelector(".header-group-row");r&&r.remove();const n=this.visibleColumns,s=t(n);if(0===s.length)return;if(this.#o.size>0)for(const t of s){const e=this.#o.get(t.id);e&&(t.renderer=e)}this.#r.clear();const l=i(s,n);for(let t=0;t<s.length;t++){const e=s[t];if(String(e.id).startsWith("__implicit__")&&l.has(String(e.id)))continue;const r=e.columns[e.columns.length-1];r?.field&&t<s.length-1&&this.#r.add(r.field)}const d=function(e,r,t){if(0===e.length)return null;const n=document.createElement("div");n.className="header-group-row",n.setAttribute("role","row");const s=i(e,r);for(const i of e){const e=String(i.id),l=e.startsWith("__implicit__");if(l&&s.has(e))continue;const d=o(i,r);if(!d)continue;const[u,c]=d,g=c-u+1,a=l?"":i.label||i.id,h=document.createElement("div");h.className="cell header-group-cell",l&&h.classList.add("implicit-group"),h.setAttribute("data-group",e),h.style.gridColumn=`${u+1} / span ${g}`;const p=!l&&(i.renderer||t)||void 0;if(p&&!l){const r=p({id:e,label:String(a),columns:i.columns,firstIndex:u,isImplicit:!1});r instanceof HTMLElement?h.appendChild(r):"string"==typeof r?h.innerHTML=r:h.textContent=a}else h.textContent=a;n.appendChild(h)}return n}(s,n,this.config.groupHeaderRenderer);if(d){d.classList.toggle("no-borders",!this.config.showGroupBorders);const r=e.querySelector(".header-row");r?e.insertBefore(d,r):e.appendChild(d)}const u=e.querySelector(".header-row");u&&(u.classList.toggle("no-group-borders",!this.config.showGroupBorders),function(e,r,t){if(!r.length||!e)return;const o=i(r,t),n=/* @__PURE__ */new Map;for(const i of r)if(!String(i.id).startsWith("__implicit__")||!o.has(String(i.id)))for(const e of i.columns)e.field&&n.set(e.field,i.id);const s=Array.from(e.querySelectorAll(".cell[data-field]"));s.forEach(e=>{const r=e.getAttribute("data-field")||"",t=n.get(r);t&&(e.classList.add("grouped"),e.getAttribute("data-group")||e.setAttribute("data-group",t))});for(const i of r){if(String(i.id).startsWith("__implicit__")&&o.has(String(i.id)))continue;const e=i.columns[i.columns.length-1],r=s.find(r=>r.getAttribute("data-field")===e.field);r&&r.classList.add("group-end")}}(u,s,n))}afterCellRender(e){this.isActive&&this.config.showGroupBorders&&e.cellElement.classList.toggle("group-end",this.#r.has(e.column.field))}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){const r=this.groups.find(r=>r.id===e);return r?r.columns:[]}refresh(){this.requestRender()}}export{d as GroupingColumnsPlugin,r as resolveColumnGroupDefs,e as slugifyHeader};
1
+ function e(e,r){return`[tbw-grid${e?`#${e}`:""}${r?`:${r}`:""}]`}function r(r,t,o,i){return`${e(o,i)} ${r}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(r)}`}function t(e){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function o(e){return e.map(e=>e.id?e:(e.header||function(e,t,o,i){throw new Error(r(e,t,o,i))}("TBW113",'ColumnGroupDefinition requires either an "id" or a "header" to generate an id from.'),{...e,id:t(e.header)}))}function i(e){if(!e.length)return[];const r=/* @__PURE__ */new Map,t=[],o=(e,r)=>{if(!r.length)return;const o=t[t.length-1];o&&o.implicit&&o.firstIndex+o.columns.length===e?o.columns.push(...r):t.push({id:"__implicit__"+e,label:void 0,columns:r,firstIndex:e,implicit:!0})};let i=[],n=0;return e.forEach((e,s)=>{const l=e.group;if(!l)return 0===i.length&&(n=s),void i.push(e);i.length&&(o(n,i.slice()),i=[]);const d="string"==typeof l?l:l.id;let u=r.get(d);u||(u={id:d,label:"string"==typeof l?void 0:l.label,columns:[],firstIndex:s},r.set(d,u),t.push(u)),u.columns.push(e)}),i.length&&o(n,i),1===t.length&&t[0].implicit&&t[0].columns.length===e.length?[]:t}function n(e,r){const t=e.columns[0],o=e.columns[e.columns.length-1],i=t?r.findIndex(e=>e.field===t.field):-1,n=o?r.findIndex(e=>e.field===o.field):-1;return-1!==i&&-1!==n?[i,n]:null}function s(e,r){const t=/* @__PURE__ */new Set,o=[];for(const i of e){if(String(i.id).startsWith("__implicit__"))continue;const e=n(i,r);e&&o.push(e)}for(const i of e){if(!String(i.id).startsWith("__implicit__"))continue;const e=n(i,r);if(!e)continue;const[s,l]=e;o.some(([e,r])=>s>=e&&l<=r)&&t.add(String(i.id))}return t}const l='<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>',d={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:l,filterActive:l,print:"🖨️"};class u{static dependencies;static manifest;aliases;version="undefined"!=typeof __GRID_VERSION__?__GRID_VERSION__:"dev";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}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,r){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:r,bubbles:!0}))}emitCancelable(e,r){const t=new CustomEvent(e,{detail:r,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(t),t.defaultPrevented}on(e,r){this.grid?._pluginManager?.subscribe(this,e,r)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,r){this.grid?._pluginManager?.emitPluginEvent(e,r)}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{...d,...e}}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 r=this.gridElement;if(r){return"0"!==getComputedStyle(r).getPropertyValue("--tbw-animation-enabled").trim()}return!0}get animationDuration(){const e=this.gridElement;if(e){const r=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),t=parseInt(r,10);if(!isNaN(t))return t}return 200}resolveIcon(e,r){return void 0!==r?r:this.gridIcons[e]}setIcon(e,r){"string"==typeof r?e.innerHTML=r:r instanceof HTMLElement&&(e.innerHTML="",e.appendChild(r.cloneNode(!0)))}warn(t,o){void 0!==o?console.warn(r(t,o,this.gridElement.id,this.name)):console.warn(`${e(this.gridElement.id,this.name)} ${t}`)}throwDiagnostic(e,t){throw new Error(r(e,t,this.gridElement.id,this.name))}}class c extends u{static manifest={ownedProperties:[{property:"group",level:"column",description:'the "group" column property'},{property:"columnGroups",level:"config",description:'the "columnGroups" config property',isUsed:e=>Array.isArray(e)&&e.length>0}],queries:[{type:"getColumnGrouping",description:"Returns column group metadata for the visibility panel"}]};name="groupingColumns";styles="@layer tbw-plugins{.header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:var(--tbw-button-padding-sm, .25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm, .9em);text-transform:uppercase;letter-spacing:.5px;border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";get defaultConfig(){return{showGroupBorders:!0,lockGroupOrder:!1}}groups=[];isActive=!1;#r=/* @__PURE__ */new Set;#t=[];#o=/* @__PURE__ */new Map;attach(e){super.attach(e),this.gridElement.addEventListener("column-move",this.#i,{signal:this.disconnectSignal})}detach(){this.groups=[],this.isActive=!1,this.#r.clear(),this.#t=[],this.#o.clear()}#i=e=>{if(!this.isActive)return;const r=e,{field:t,columnOrder:o}=r.detail;if(this.config.lockGroupOrder)for(const i of this.groups)if(!i.id.startsWith("__implicit__")&&!this.#n(i,o))return r.preventDefault(),void this.#s(t);this.#l(o)};#l(e){this.#r.clear();const r=this.#d(e);for(const t of this.groups){const o=new Set(t.columns.map(e=>e.field));for(let t=e.length-1;t>=0;t--)if(o.has(e[t])){const o=e[t];o!==r&&this.#r.add(o);break}}}#d(e){if(0===this.groups.length)return null;for(let r=e.length-1;r>=0;r--){const t=e[r];for(const r of this.groups)if(r.columns.some(e=>e.field===t)){const t=new Set(r.columns.map(e=>e.field));for(let r=e.length-1;r>=0;r--)if(t.has(e[r]))return e[r]}}return null}#n(e,r){const t=e.columns.map(e=>r.indexOf(e.field)).filter(e=>-1!==e).sort((e,r)=>e-r);return t.length<=1||t.length===t[t.length-1]-t[0]+1}#s(e){const r=this.gridElement?.querySelector(`.header-row [part~="header-cell"][data-field="${e}"]`);r&&(r.style.setProperty("--_flash-color","var(--tbw-color-error)"),r.animate([{backgroundColor:"rgba(from var(--_flash-color) r g b / 30%)"},{backgroundColor:"transparent"}],{duration:400,easing:"ease-out"}))}handleQuery(e){if("getColumnGrouping"===e.type)return this.#u()}#u(){let e;if(this.#t.length>0)e=this.#t.filter(e=>e.children.length>0).map(e=>({id:e.id,label:e.header,fields:[...e.children]}));else if(this.isActive&&this.groups.length>0){e=this.groups.filter(e=>!e.id.startsWith("__implicit__")).map(e=>({id:e.id,label:e.label??e.id,fields:e.columns.map(e=>e.field)}));const r=this.columns;for(const t of r)if(t.hidden&&t.group){const r="string"==typeof t.group?t.group:t.group.id,o="string"==typeof t.group?t.group:t.group.label??t.group.id,i=e.find(e=>e.id===r);i?i.fields.includes(t.field)||i.fields.push(t.field):e.push({id:r,label:o,fields:[t.field]})}}else{const r=this.columns,t=/* @__PURE__ */new Map;for(const e of r){if(!e.group)continue;const r="string"==typeof e.group?e.group:e.group.id,o="string"==typeof e.group?e.group:e.group.label??e.group.id,i=t.get(r);i?i.fields.includes(e.field)||i.fields.push(e.field):t.set(r,{id:r,label:o,fields:[e.field]})}e=Array.from(t.values())}const r=this.grid?.getColumnOrder();if(r&&r.length>0){const t=new Map(r.map((e,r)=>[e,r]));for(const r of e)r.fields.sort((e,r)=>(t.get(e)??1/0)-(t.get(r)??1/0))}return e}static detect(e,r){const t=r?.features?.groupingColumns;if(t&&"object"==typeof t&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;if(r?.columnGroups&&Array.isArray(r.columnGroups)&&r.columnGroups.length>0)return!0;const o=r?.columns;return!!Array.isArray(o)&&function(e){return e.some(e=>null!=e.group)}(o)}processColumns(e){const r=this.config?.columnGroups,t=this.grid?.gridConfig?.columnGroups;let n,s;if(r&&Array.isArray(r)&&r.length>0?(t&&Array.isArray(t)&&t.length>0&&this.warn("TBW114","columnGroups defined in both gridConfig and groupingColumns feature config. Using feature config (higher precedence)."),n=r):t&&Array.isArray(t)&&t.length>0&&(n=t),n&&n.length>0){const r=o(n);this.#t=r,this.#o.clear();for(const e of r)e.renderer&&this.#o.set(e.id,e.renderer);const t=/* @__PURE__ */new Map;for(const e of r)for(const r of e.children)t.set(r,{id:e.id,label:e.header});s=e.map(e=>{const r=t.get(e.field);return r&&!e.group?{...e,group:r}:e})}else this.#t=[],this.#o.clear(),s=[...e];const l=i(s);if(0===l.length)return this.isActive=!1,this.groups=[],s;if(this.#o.size>0)for(const o of l){const e=this.#o.get(o.id);e&&(o.renderer=e)}this.isActive=!0,this.groups=l,this.#r.clear();for(const o of l){const e=o.columns[o.columns.length-1];e?.field&&this.#r.add(e.field)}return s}afterRender(){if(!this.isActive){const e=this.gridElement?.querySelector(".header"),r=e?.querySelector(".header-group-row");return void(r&&r.remove())}const e=this.gridElement?.querySelector(".header");if(!e)return;const r=e.querySelector(".header-group-row");r&&r.remove();const t=this.visibleColumns,o=i(t);if(0===o.length)return;if(this.#o.size>0)for(const i of o){const e=this.#o.get(i.id);e&&(i.renderer=e)}this.#r.clear();const l=s(o,t);for(let i=0;i<o.length;i++){const e=o[i];if(String(e.id).startsWith("__implicit__")&&l.has(String(e.id)))continue;const r=e.columns[e.columns.length-1];r?.field&&i<o.length-1&&this.#r.add(r.field)}const d=function(e,r,t){if(0===e.length)return null;const o=document.createElement("div");o.className="header-group-row",o.setAttribute("role","row");const i=s(e,r);for(const s of e){const e=String(s.id),l=e.startsWith("__implicit__");if(l&&i.has(e))continue;const d=n(s,r);if(!d)continue;const[u,c]=d,g=c-u+1,a=l?"":s.label||s.id,h=document.createElement("div");h.className="cell header-group-cell",l&&h.classList.add("implicit-group"),h.setAttribute("data-group",e),h.style.gridColumn=`${u+1} / span ${g}`;const p=!l&&(s.renderer||t)||void 0;if(p&&!l){const r=p({id:e,label:String(a),columns:s.columns,firstIndex:u,isImplicit:!1});r instanceof HTMLElement?h.appendChild(r):"string"==typeof r?h.innerHTML=r:h.textContent=a}else h.textContent=a;o.appendChild(h)}return o}(o,t,this.config.groupHeaderRenderer);if(d){d.classList.toggle("no-borders",!this.config.showGroupBorders);const r=e.querySelector(".header-row");r?e.insertBefore(d,r):e.appendChild(d)}const u=e.querySelector(".header-row");u&&(u.classList.toggle("no-group-borders",!this.config.showGroupBorders),function(e,r,t){if(!r.length||!e)return;const o=s(r,t),i=/* @__PURE__ */new Map;for(const s of r)if(!String(s.id).startsWith("__implicit__")||!o.has(String(s.id)))for(const e of s.columns)e.field&&i.set(e.field,s.id);const n=Array.from(e.querySelectorAll(".cell[data-field]"));n.forEach(e=>{const r=e.getAttribute("data-field")||"",t=i.get(r);t&&(e.classList.add("grouped"),e.getAttribute("data-group")||e.setAttribute("data-group",t))});for(const s of r){if(String(s.id).startsWith("__implicit__")&&o.has(String(s.id)))continue;const e=s.columns[s.columns.length-1],r=n.find(r=>r.getAttribute("data-field")===e.field);r&&r.classList.add("group-end")}}(u,o,t))}afterCellRender(e){this.isActive&&this.config.showGroupBorders&&e.cellElement.classList.toggle("group-end",this.#r.has(e.column.field))}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){const r=this.groups.find(r=>r.id===e);return r?r.columns:[]}refresh(){this.requestRender()}}export{c as GroupingColumnsPlugin,o as resolveColumnGroupDefs,t as slugifyHeader};
2
2
  //# sourceMappingURL=index.js.map