@toolbox-web/grid 1.28.2 → 1.30.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 (107) hide show
  1. package/all.js +2 -2
  2. package/all.js.map +1 -1
  3. package/custom-elements.json +43 -1
  4. package/index.js +1 -1
  5. package/index.js.map +1 -1
  6. package/lib/core/constants.d.ts +1 -7
  7. package/lib/core/grid.d.ts +47 -3
  8. package/lib/core/internal/render-scheduler.d.ts +3 -1
  9. package/lib/core/plugin/base-plugin.d.ts +1 -1
  10. package/lib/core/plugin/plugin-manager.d.ts +2 -0
  11. package/lib/core/types.d.ts +55 -0
  12. package/lib/plugins/clipboard/ClipboardPlugin.d.ts +0 -21
  13. package/lib/plugins/clipboard/index.js.map +1 -1
  14. package/lib/plugins/column-virtualization/ColumnVirtualizationPlugin.d.ts +0 -16
  15. package/lib/plugins/column-virtualization/index.js.map +1 -1
  16. package/lib/plugins/context-menu/index.js.map +1 -1
  17. package/lib/plugins/editing/index.js +1 -1
  18. package/lib/plugins/editing/index.js.map +1 -1
  19. package/lib/plugins/export/ExportPlugin.d.ts +0 -18
  20. package/lib/plugins/export/index.js.map +1 -1
  21. package/lib/plugins/filtering/FilteringPlugin.d.ts +0 -21
  22. package/lib/plugins/filtering/filter-model.d.ts +8 -1
  23. package/lib/plugins/filtering/index.js +1 -1
  24. package/lib/plugins/filtering/index.js.map +1 -1
  25. package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts +0 -16
  26. package/lib/plugins/grouping-columns/grouping-columns.d.ts +23 -3
  27. package/lib/plugins/grouping-columns/index.js +1 -1
  28. package/lib/plugins/grouping-columns/index.js.map +1 -1
  29. package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts +0 -23
  30. package/lib/plugins/grouping-rows/index.js +2 -2
  31. package/lib/plugins/grouping-rows/index.js.map +1 -1
  32. package/lib/plugins/master-detail/MasterDetailPlugin.d.ts +0 -22
  33. package/lib/plugins/master-detail/index.js.map +1 -1
  34. package/lib/plugins/multi-sort/MultiSortPlugin.d.ts +0 -18
  35. package/lib/plugins/multi-sort/index.js +1 -1
  36. package/lib/plugins/multi-sort/index.js.map +1 -1
  37. package/lib/plugins/multi-sort/multi-sort.d.ts +7 -0
  38. package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts +18 -4
  39. package/lib/plugins/pinned-columns/index.js +1 -1
  40. package/lib/plugins/pinned-columns/index.js.map +1 -1
  41. package/lib/plugins/pinned-columns/pinned-columns.d.ts +38 -2
  42. package/lib/plugins/pinned-rows/PinnedRowsPlugin.d.ts +0 -11
  43. package/lib/plugins/pinned-rows/index.js.map +1 -1
  44. package/lib/plugins/pivot/PivotPlugin.d.ts +0 -24
  45. package/lib/plugins/pivot/index.js +1 -1
  46. package/lib/plugins/pivot/index.js.map +1 -1
  47. package/lib/plugins/print/PrintPlugin.d.ts +2 -21
  48. package/lib/plugins/print/index.js.map +1 -1
  49. package/lib/plugins/reorder-columns/ReorderPlugin.d.ts +0 -7
  50. package/lib/plugins/reorder-columns/index.js +1 -1
  51. package/lib/plugins/reorder-columns/index.js.map +1 -1
  52. package/lib/plugins/reorder-rows/RowReorderPlugin.d.ts +1 -13
  53. package/lib/plugins/reorder-rows/index.js +1 -1
  54. package/lib/plugins/reorder-rows/index.js.map +1 -1
  55. package/lib/plugins/responsive/index.js +1 -1
  56. package/lib/plugins/responsive/index.js.map +1 -1
  57. package/lib/plugins/selection/index.js +1 -1
  58. package/lib/plugins/selection/index.js.map +1 -1
  59. package/lib/plugins/server-side/ServerSidePlugin.d.ts +0 -16
  60. package/lib/plugins/server-side/index.js.map +1 -1
  61. package/lib/plugins/tooltip/index.js.map +1 -1
  62. package/lib/plugins/tree/TreePlugin.d.ts +0 -22
  63. package/lib/plugins/tree/index.js +1 -1
  64. package/lib/plugins/tree/index.js.map +1 -1
  65. package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts +0 -19
  66. package/lib/plugins/undo-redo/index.js +1 -1
  67. package/lib/plugins/undo-redo/index.js.map +1 -1
  68. package/lib/plugins/visibility/VisibilityPlugin.d.ts +0 -16
  69. package/lib/plugins/visibility/index.js +1 -1
  70. package/lib/plugins/visibility/index.js.map +1 -1
  71. package/package.json +1 -1
  72. package/themes/dg-theme-material.css +5 -0
  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.map +1 -1
  78. package/umd/plugins/column-virtualization.umd.js.map +1 -1
  79. package/umd/plugins/export.umd.js.map +1 -1
  80. package/umd/plugins/filtering.umd.js +1 -1
  81. package/umd/plugins/filtering.umd.js.map +1 -1
  82. package/umd/plugins/grouping-columns.umd.js +1 -1
  83. package/umd/plugins/grouping-columns.umd.js.map +1 -1
  84. package/umd/plugins/grouping-rows.umd.js +1 -1
  85. package/umd/plugins/grouping-rows.umd.js.map +1 -1
  86. package/umd/plugins/master-detail.umd.js.map +1 -1
  87. package/umd/plugins/multi-sort.umd.js +1 -1
  88. package/umd/plugins/multi-sort.umd.js.map +1 -1
  89. package/umd/plugins/pinned-columns.umd.js +1 -1
  90. package/umd/plugins/pinned-columns.umd.js.map +1 -1
  91. package/umd/plugins/pinned-rows.umd.js.map +1 -1
  92. package/umd/plugins/pivot.umd.js +1 -1
  93. package/umd/plugins/pivot.umd.js.map +1 -1
  94. package/umd/plugins/print.umd.js.map +1 -1
  95. package/umd/plugins/reorder-columns.umd.js +1 -1
  96. package/umd/plugins/reorder-columns.umd.js.map +1 -1
  97. package/umd/plugins/reorder-rows.umd.js +1 -1
  98. package/umd/plugins/reorder-rows.umd.js.map +1 -1
  99. package/umd/plugins/selection.umd.js +1 -1
  100. package/umd/plugins/selection.umd.js.map +1 -1
  101. package/umd/plugins/server-side.umd.js.map +1 -1
  102. package/umd/plugins/tree.umd.js +1 -1
  103. package/umd/plugins/tree.umd.js.map +1 -1
  104. package/umd/plugins/undo-redo.umd.js +1 -1
  105. package/umd/plugins/undo-redo.umd.js.map +1 -1
  106. package/umd/plugins/visibility.umd.js +1 -1
  107. package/umd/plugins/visibility.umd.js.map +1 -1
@@ -14,18 +14,6 @@ import { BlankMode, FilterConfig, FilterModel } from './types';
14
14
  * import { FilteringPlugin } from '@toolbox-web/grid/plugins/filtering';
15
15
  * ```
16
16
  *
17
- * ## Configuration Options
18
- *
19
- * | Option | Type | Default | Description |
20
- * |--------|------|---------|-------------|
21
- * | `debounceMs` | `number` | `300` | Debounce delay for filter input |
22
- * | `caseSensitive` | `boolean` | `false` | Case-sensitive string matching |
23
- * | `trimInput` | `boolean` | `true` | Trim whitespace from filter input |
24
- * | `useWorker` | `boolean` | `true` | Use Web Worker for datasets >1000 rows |
25
- * | `filterPanelRenderer` | `FilterPanelRenderer` | - | Custom filter panel renderer |
26
- * | `valuesHandler` | `FilterValuesHandler` | - | Async handler to fetch unique filter values |
27
- * | `filterHandler` | `FilterHandler<TRow>` | - | Async handler to apply filters remotely |
28
- *
29
17
  * ## Column Configuration
30
18
  *
31
19
  * | Property | Type | Description |
@@ -34,15 +22,6 @@ import { BlankMode, FilterConfig, FilterModel } from './types';
34
22
  * | `filterType` | `'text' \| 'select' \| 'number' \| 'date'` | Filter UI type |
35
23
  * | `filterOptions` | `unknown[]` | Predefined options for select filters |
36
24
  *
37
- * ## Programmatic API
38
- *
39
- * | Method | Signature | Description |
40
- * |--------|-----------|-------------|
41
- * | `setFilter` | `(field, value) => void` | Set filter value for a column |
42
- * | `getFilters` | `() => FilterModel[]` | Get all current filters |
43
- * | `clearFilters` | `() => void` | Clear all filters |
44
- * | `clearFilter` | `(field) => void` | Clear filter for a specific column |
45
- *
46
25
  * ## CSS Custom Properties
47
26
  *
48
27
  * | Property | Default | Description |
@@ -8,6 +8,10 @@ export declare const BLANK_FILTER_VALUE = "(Blank)";
8
8
  /**
9
9
  * Check if a single row matches a filter condition.
10
10
  *
11
+ * Delegates to `compileFilter` to avoid duplicating operator logic. The compiled
12
+ * predicate is created per call, so prefer `filterRows` (which pre-compiles once)
13
+ * for bulk filtering.
14
+ *
11
15
  * @param row - The row data object
12
16
  * @param filter - The filter to apply
13
17
  * @param caseSensitive - Whether text comparisons are case sensitive
@@ -19,13 +23,16 @@ export declare function matchesFilter(row: Record<string, unknown>, filter: Filt
19
23
  * Filter rows based on multiple filter conditions (AND logic).
20
24
  * All filters must match for a row to be included.
21
25
  *
26
+ * Pre-compiles each filter into a specialized predicate to avoid
27
+ * repeated type coercion and branch checks inside the hot loop.
28
+ *
22
29
  * @param rows - The rows to filter
23
30
  * @param filters - Array of filters to apply
24
31
  * @param caseSensitive - Whether text comparisons are case sensitive
25
32
  * @param filterValues - Optional map of field → value extractor for complex columns
26
33
  * @returns Filtered rows
27
34
  */
28
- export declare function filterRows<T extends Record<string, unknown>>(rows: T[], filters: FilterModel[], caseSensitive?: boolean, filterValues?: Map<string, (value: unknown, row: T) => unknown | unknown[]>): T[];
35
+ export declare function filterRows<T extends Record<string, unknown>>(rows: readonly T[], filters: FilterModel[], caseSensitive?: boolean, filterValues?: Map<string, (value: unknown, row: T) => unknown | unknown[]>): T[];
29
36
  /**
30
37
  * Compute a cache key for a set of filters.
31
38
  * Used for memoization of filter results.
@@ -1,2 +1,2 @@
1
- const e="(Blank)";function t(e){if(e instanceof Date)return e.getTime();const t=Number(e);if(!isNaN(t))return t;return new Date(e).getTime()}function r(r,i,n=!1,l){return i.length?r.filter(r=>i.every(i=>function(r,i,n=!1,l){const a=r[i.field];if("blank"===i.operator)return null==a||""===a;if("notBlank"===i.operator)return null!=a&&""!==a;if(l&&("notIn"===i.operator||"in"===i.operator)){const t=l(a,r),n=Array.isArray(t)?t:null!=t?[t]:[];if("notIn"===i.operator){const t=i.value;return!Array.isArray(t)||(0===n.length?!t.includes(e):!n.some(e=>t.includes(e)))}if("in"===i.operator){const t=i.value;return!!Array.isArray(t)&&(0===n.length?t.includes(e):n.some(e=>t.includes(e)))}}if("notIn"===i.operator)return null==a||""===a?!Array.isArray(i.value)||!i.value.includes(e):Array.isArray(i.value)&&!i.value.includes(a);if("in"===i.operator)return null==a||""===a?Array.isArray(i.value)&&i.value.includes(e):Array.isArray(i.value)&&i.value.includes(a);if(null==a)return!1;const s=String(a),o=n?s:s.toLowerCase(),c=n?String(i.value):String(i.value).toLowerCase();switch(i.operator){case"contains":return o.includes(c);case"notContains":return!o.includes(c);case"equals":return o===c;case"notEquals":return o!==c;case"startsWith":return o.startsWith(c);case"endsWith":return o.endsWith(c);case"lessThan":return t(a)<t(i.value);case"lessThanOrEqual":return t(a)<=t(i.value);case"greaterThan":return t(a)>t(i.value);case"greaterThanOrEqual":return t(a)>=t(i.value);case"between":return t(a)>=t(i.value)&&t(a)<=t(i.valueTo);default:return!0}}(r,i,n,l?.get(i.field)))):r}function i(t,r,i){const n=/* @__PURE__ */new Set;let l=!1;for(const e of t){const t=e[r];if(i){const r=i(t,e);if(Array.isArray(r)){0===r.length&&(l=!0);for(const e of r)null!=e&&n.add(e)}else null!=r?n.add(r):l=!0}else null!=t&&""!==t?n.add(t):l=!0}return l&&n.add(e),[...n].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}function n(e,t){const r=e.querySelector?.(".tbw-sr-only");r&&(r.textContent="",requestAnimationFrame(()=>{r.textContent=t}))}function l(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function a(e,t,r,i){return`${l(r,i)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}const s=/* @__PURE__ */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"]),o=/^on\w+$/i,c=/* @__PURE__ */new Set(["href","src","action","formaction","data","srcdoc","xlink:href","poster","srcset"]),d=/^\s*(javascript|vbscript|data|blob):/i;function u(e){if(!e||"string"!=typeof e)return"";if(-1===e.indexOf("<"))return e;const t=document.createElement("template");return t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const i of r){const e=i.tagName.toLowerCase();if(s.has(e)){t.push(i);continue}if("svg"===e||"http://www.w3.org/2000/svg"===i.namespaceURI){if(Array.from(i.attributes).some(e=>o.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(i);continue}}const r=[];for(const t of i.attributes){const e=t.name.toLowerCase();o.test(e)?r.push(t.name):(c.has(e)&&d.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name)}r.forEach(e=>i.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content),t.innerHTML}const p='<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>',h={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:p,filterActive:p,print:"🖨️"};class f{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,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.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)}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{...h,...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 t=this.gridElement;if(t){return"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}return!0}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}resolveIcon(e,t){return void 0!==t?t:this.gridIcons[e]}setIcon(e,t){"string"==typeof t?e.innerHTML=u(t):t instanceof HTMLElement&&(e.innerHTML="",e.appendChild(t.cloneNode(!0)))}warn(e,t){void 0!==t?console.warn(a(e,t,this.gridElement.id,this.name)):console.warn(`${l(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(a(e,t,this.gridElement.id,this.name))}}function b(e){return e?e.toISOString().split("T")[0]:""}function g(e){return e?"string"==typeof e?e:"number"==typeof e?b(new Date(e)):"":""}function m(e,t,r,i,n,l){const{field:a,column:s}=t,o=function(e){if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-filter-item-height");if(t&&t.trim()){const e=parseFloat(t);if(!isNaN(e)&&e>0)return e}}return 28}(e),c=e=>{if(null==e)return"(Blank)";if(s.format&&!s.filterValue){const t=s.format(e,void 0);if(t)return t}return String(e)};r=r.slice().sort((e,t)=>c(e).localeCompare(c(t)));const d=document.createElement("div");d.className="tbw-filter-search";const u=document.createElement("input");u.type="text",u.placeholder="Search...",u.className="tbw-filter-search-input",u.value=l.get(a)??"",d.appendChild(u),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-actions";const h=document.createElement("label");h.className="tbw-filter-value-item",h.style.padding="0",h.style.margin="0";const f=document.createElement("input");f.type="checkbox",f.className="tbw-filter-checkbox";const b=document.createElement("span");b.textContent="Select All",h.appendChild(f),h.appendChild(b),p.appendChild(h);const g=/* @__PURE__ */new Map;r.forEach(e=>{const t=null==e?"__null__":String(e);g.set(t,!i.has(e))});const m=()=>{const e=[...g.values()],t=e.every(e=>e),r=e.every(e=>!e);f.checked=t,f.indeterminate=!t&&!r};f.addEventListener("change",()=>{const e=f.checked;for(const t of g.keys())g.set(t,e);m(),E()}),m(),e.appendChild(p);const v=document.createElement("div");v.className="tbw-filter-values";const w=document.createElement("div");w.className="tbw-filter-values-spacer",v.appendChild(w);const y=document.createElement("div");y.className="tbw-filter-values-content",v.appendChild(y);let x=[];const C=(e,t)=>{const r=c(e),i=null==e?"__null__":String(e),n=document.createElement("label");n.className="tbw-filter-value-item",n.style.position="absolute",n.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,n.style.left="0",n.style.right="0",n.style.boxSizing="border-box";const l=document.createElement("input");l.type="checkbox",l.className="tbw-filter-checkbox",l.checked=g.get(i)??!0,l.dataset.value=i,l.addEventListener("change",()=>{g.set(i,l.checked),m()});const a=document.createElement("span");return a.textContent=r,n.appendChild(l),n.appendChild(a),n},E=()=>{const e=x.length,t=v.clientHeight,r=v.scrollTop;if(w.style.height=e*o+"px",e<=50/3)return y.innerHTML="",y.style.transform="translateY(0px)",void x.forEach((e,t)=>{y.appendChild(C(e,t))});const i=function(e){const{totalRows:t,viewportHeight:r,scrollTop:i,rowHeight:n,overscan:l}=e,a=Math.ceil(r/n);let s=Math.floor(i/n)-l;s<0&&(s=0);let o=s+a+2*l;return o>t&&(o=t),o===t&&s>0&&(s=Math.max(0,o-a-2*l)),{start:s,end:o,offsetY:s*n,totalHeight:t*n}}({totalRows:e,viewportHeight:t,scrollTop:r,rowHeight:o,overscan:3});y.style.transform=`translateY(${i.offsetY}px)`,y.innerHTML="";for(let n=i.start;n<i.end;n++)y.appendChild(C(x[n],n-i.start))},k=e=>{const t=n.caseSensitive??!1,i=t?e:e.toLowerCase();if(x=r.filter(r=>{const n=c(r),l=t?n:n.toLowerCase();return!e||l.includes(i)}),x.sort((e,t)=>{const r=null==e?"__null__":String(e),i=null==t?"__null__":String(t),n=g.get(r)??!0;return n!==(g.get(i)??!0)?n?-1:1:c(e).localeCompare(c(t))}),0===x.length){w.style.height="0px",y.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent="No matching values",void y.appendChild(e)}E()};let S;v.addEventListener("scroll",()=>{x.length>0&&E()},{passive:!0}),k(u.value),e.appendChild(v),u.addEventListener("input",()=>{clearTimeout(S),S=setTimeout(()=>{l.set(a,u.value),k(u.value)},n.debounceMs??150)});const F=document.createElement("div");F.className="tbw-filter-buttons";const A=document.createElement("button");A.className="tbw-filter-apply-btn",A.textContent="Apply",A.addEventListener("click",()=>{const e=[];for(const[t,i]of g)if(!i)if("__null__"===t)e.push(null);else{const i=r.find(e=>String(e)===t);e.push(void 0!==i?i:t)}t.applySetFilter(e)}),F.appendChild(A);const N=document.createElement("button");N.className="tbw-filter-clear-btn",N.textContent="Clear Filter",N.addEventListener("click",()=>{t.clearFilter()}),F.appendChild(N),e.appendChild(F)}function v(e,t){if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t}class w extends f{static manifest={events:[{type:"filter-applied",description:"Emitted when filter criteria change. Subscribers can react to row visibility changes."}],queries:[{type:"getContextMenuItems",description:"Contributes filter-related items to the header context menu"}]};name="filtering";styles='@layer tbw-plugins{tbw-grid .tbw-quick-filter-input{flex:1;max-width:300px;height:var(--tbw-input-height, 1.75rem);padding:var(--tbw-input-padding, 0 .5rem);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);background:var(--tbw-color-bg);color:var(--tbw-color-fg);font-size:var(--tbw-font-size-sm, .8125rem)}tbw-grid .tbw-quick-filter-input:focus{outline:none;border-color:var(--tbw-color-accent)}tbw-grid .header-cell.filtered:before{content:"";position:absolute;top:var(--tbw-spacing-xs, .25rem);right:var(--tbw-spacing-xs, .25rem);width:var(--tbw-indicator-size, .375rem);height:var(--tbw-indicator-size, .375rem);background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:50%}tbw-grid .tbw-filter-btn{display:var(--tbw-filter-btn-display, inline-flex);visibility:var(--tbw-filter-btn-visibility, visible);align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:2px;margin-left:var(--tbw-spacing-xs, .25rem);opacity:.4;transition:opacity .15s,visibility 0s,display 0s allow-discrete;color:inherit;vertical-align:middle;transition-behavior:allow-discrete}tbw-grid .tbw-filter-btn:hover,tbw-grid .tbw-filter-btn.active{opacity:1;visibility:visible;display:inline-flex}tbw-grid .tbw-filter-btn.active{color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}tbw-grid .header-row .cell:hover .tbw-filter-btn,tbw-grid .header-row .cell.filtered .tbw-filter-btn{display:inline-flex;visibility:visible}}';get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return!1!==this.grid.effectiveConfig?.filterable}isColumnFilterable(e){return!!this.isFilteringEnabled()&&!1!==e.filterable}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const r of e)r.field&&r.filterValue&&(t||(t=/* @__PURE__ */new Map),t.set(r.field,r.filterValue));return t}filters=/* @__PURE__ */new Map;cachedResult=null;cacheKey=null;cachedInputSpot=null;openPanelField=null;panelElement=null;panelAnchorElement=null;searchText=/* @__PURE__ */new Map;excludedValues=/* @__PURE__ */new Map;panelAbortController=null;globalStylesInjected=!1;computeSelected(){const t={},r=[];for(const[e,i]of this.filters)if("set"===i.type)if("in"===i.operator&&Array.isArray(i.value))t[e]=i.value;else if("notIn"===i.operator){const t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e);r.push({field:e,filterValue:t?.filterValue})}if(r.length>0){const i=function(t,r){const i=/* @__PURE__ */new Map;for(const{field:e,filterValue:l}of r)i.set(e,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!l});for(const e of t)for(const{field:t,filterValue:n}of r){const r=i.get(t),l=e[t];if(n){const t=n(l,e);if(Array.isArray(t)){0===t.length&&(r.hasBlank=!0);for(const e of t)null!=e&&r.values.add(e)}else null!=t?r.values.add(t):r.hasBlank=!0}else null!=l&&""!==l?r.values.add(l):r.hasBlank=!0}const n=/* @__PURE__ */new Map;for(const[l,{values:a,hasBlank:s}]of i)s&&a.add(e),n.set(l,[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return n}(this.sourceRows,r);for(const{field:e}of r){const r=this.excludedValues.get(e),n=i.get(e)??[];t[e]=r?n.filter(e=>!r.has(e)):n}}return t}syncExcludedValues(t,r){if(r)if("set"===r.type&&"notIn"===r.operator&&Array.isArray(r.value))this.excludedValues.set(t,new Set(r.value));else if("set"===r.type&&"in"===r.operator&&Array.isArray(r.value)){const i=this.sourceRows;if(!i||0===i.length)return void this.excludedValues.delete(t);const n=r.value,l=new Set(n.map(t=>null==t?e:t)),a=this.getUniqueValues(t),s=new Set(a.filter(e=>!l.has(e)));this.excludedValues.set(t,s)}else"set"===r.type&&this.excludedValues.delete(t);else this.excludedValues.delete(t)}attach(e){super.attach(e),this.injectGlobalStyles()}detach(){this.filters.clear(),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.openPanelField=null,this.panelElement&&(this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}handleQuery(e){if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const r=t.column;if(!r?.field)return;if(!this.isFilteringEnabled())return;if(!this.isColumnFilterable(r))return;const i=[],n=this.isFieldFiltered(r.field),l=this.filters.size>0;return n&&i.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),l&&i.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!l,action:()=>this.clearAllFilters()}),i.length>0?i:void 0}}processRows(e){const t=[...this.filters.values()];if(!t.length)return[...e];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:[...e];const i=(n=t,JSON.stringify(n.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var n;const l={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},a=null!=this.cachedInputSpot&&l.len===this.cachedInputSpot.len&&l.first===this.cachedInputSpot.first&&l.mid===this.cachedInputSpot.mid&&l.last===this.cachedInputSpot.last;if(this.cacheKey===i&&this.cachedResult&&a)return this.cachedResult;if(!a)for(const[r,o]of this.filters)"set"===o.type&&"in"===o.operator&&this.syncExcludedValues(r,o);const s=r([...e],t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=s,this.cacheKey=i,this.cachedInputSpot=l,s}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(e=>{const t=e.getAttribute("data-col");if(null===t)return;const r=this.visibleColumns[parseInt(t,10)];if(!r||!this.isColumnFilterable(r))return;if(i=r,!0===i.meta?.utility)return;var i;const n=r.field;if(!n)return;const l=this.filters.has(n);let a=e.querySelector(".tbw-filter-btn");if(a){const t=a.classList.contains("active");if(a.classList.toggle("active",l),e.classList.toggle("filtered",l),l?e.setAttribute("aria-description","Filtered"):e.removeAttribute("aria-description"),t!==l){const e=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(e))}return}a=document.createElement("button"),a.className="tbw-filter-btn",a.setAttribute("aria-label",`Filter ${r.header??n}`);const s=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(s)),l&&(a.classList.add("active"),e.classList.add("filtered"),e.setAttribute("aria-description","Filtered")),a.addEventListener("click",e=>{e.stopPropagation(),this.toggleFilterPanel(n,r,a)});const o=e.querySelector(".resize-handle");o?e.insertBefore(a,o):e.appendChild(a)})}setFilter(e,t,r){if(null===t)this.filters.delete(e),this.syncExcludedValues(e,null);else{const r={...t,field:e};this.filters.set(e,r),this.syncExcludedValues(e,r)}if(this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,!r?.silent){this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.();const r=this.grid.effectiveConfig?.columns?.find(t=>t.field===e)?.header??e;n(this.gridElement,null===t?`Filter cleared from ${r}`:`Filter applied on ${r}`)}this.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}getFilter(e){return this.filters.get(e)}getFilters(){return[...this.filters.values()]}getFilterModel(){return this.getFilters()}setFilterModel(e,t){this.filters.clear(),this.excludedValues.clear();for(const r of e)this.filters.set(r.field,r),this.syncExcludedValues(r.field,r);this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,t?.silent||(this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent),e?.silent||n(this.gridElement,"All filters cleared")}clearFieldFilter(e,t){if(this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent),!t?.silent){const t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e)?.header??e;n(this.gridElement,`Filter cleared from ${t}`)}}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e),r=t?.filterValue;return i(this.sourceRows,e,r)}getStaleFilters(){const e=[];for(const[t,r]of this.filters){if("set"!==r.type)continue;const i=this.getUniqueValues(t);if("notIn"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===i.filter(e=>!t.has(e)).length&&e.push(r)}else if("in"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===i.filter(e=>t.has(e)).length&&e.push(r)}}return e}getBlankMode(e){const t=this.filters.get(e);return"blank"===t?.operator?"blanksOnly":"notBlank"===t?.operator?"nonBlanksOnly":"all"}toggleBlankFilter(e,t){if("all"===t){const t=this.filters.get(e);if(t?.valueTo&&"object"==typeof t.valueTo){const r=t.valueTo;this.setFilter(e,r)}else this.setFilter(e,null);return}const r=this.filters.get(e),i=r&&"blank"!==r.operator&&"notBlank"!==r.operator?{type:r.type,operator:r.operator,value:r.value,valueTo:r.valueTo}:r?.valueTo;this.setFilter(e,{type:r?.type??"text",operator:"blanksOnly"===t?"blank":"notBlank",value:"",valueTo:i})}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const i of t.classList)i.startsWith("tbw-")||"selecting"===i||e.classList.add(i);const r=t.dataset.theme;r&&(e.dataset.theme=r)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles"))return void(this.globalStylesInjected=!0);const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent="@layer tbw-plugins{.tbw-filter-panel{position:fixed;background:var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));color:var(--tbw-filter-panel-fg, var(--tbw-color-fg, light-dark(#222222, #eeeeee)));border:1px solid var(--tbw-filter-panel-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-panel-radius, var(--tbw-border-radius, .25rem));box-shadow:0 4px 16px var(--tbw-filter-panel-shadow, var(--tbw-color-shadow, light-dark(rgba(0, 0, 0, .1), rgba(0, 0, 0, .3))));padding:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));z-index:10000;min-width:200px;max-width:280px;max-height:350px;display:flex;flex-direction:column;font-family:var(--tbw-font-family, system-ui, sans-serif);font-size:var(--tbw-font-size, .8125rem);transform-origin:top center}.tbw-filter-panel.tbw-filter-panel-above{transform-origin:bottom center}.tbw-filter-panel.tbw-filter-panel-animated{animation:tbw-filter-panel-enter var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}.tbw-filter-panel.tbw-filter-panel-above.tbw-filter-panel-animated{animation:tbw-filter-panel-enter-above var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}@keyframes tbw-filter-panel-enter{0%{opacity:0;transform:scaleY(.3) translateY(-10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@keyframes tbw-filter-panel-enter-above{0%{opacity:0;transform:scaleY(.3) translateY(10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@supports (anchor-name: --test){.tbw-filter-panel{position-anchor:--tbw-filter-anchor;top:anchor(bottom);left:anchor(left);margin-top:4px;position-try-fallbacks:flip-inline,flip-block,flip-block flip-inline}}.tbw-filter-search{margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-search-input{height:var(--tbw-filter-item-height, 28px);width:100%;padding:var(--tbw-filter-search-padding, var(--tbw-spacing-sm, .375rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-search-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-actions{display:flex;padding:var(--tbw-button-padding-sm, .25rem .125rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-bottom:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-actions .tbw-filter-value-item{flex:1}.tbw-filter-values{flex:1;overflow-y:auto;margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));max-height:180px;position:relative}.tbw-filter-values-spacer{width:1px}.tbw-filter-values-content{position:absolute;top:0;left:0;right:0}.tbw-filter-value-item{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding:var(--tbw-button-padding-sm, .25rem .125rem);cursor:pointer;border-radius:3px;height:var(--tbw-filter-item-height, 28px)}.tbw-filter-value-item:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-checkbox{margin:0;cursor:pointer;accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}.tbw-filter-no-match{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem)) 0;text-align:center;font-style:italic}.tbw-filter-buttons{display:flex;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding-top:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-top:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)))}.tbw-filter-apply-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));color:var(--tbw-filter-accent-fg, var(--tbw-color-accent-fg, light-dark(#ffffff, #000000)));border:none;border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-apply-btn:hover{filter:brightness(.9)}.tbw-filter-clear-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:transparent;color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-clear-btn:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-range-inputs,.tbw-filter-date-range{display:flex;align-items:flex-end;gap:var(--tbw-spacing-sm, .375rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-group,.tbw-filter-date-group{display:flex;flex-direction:column;gap:var(--tbw-spacing-xs, .25rem);flex:1}.tbw-filter-range-label{font-size:var(--tbw-font-size-xs, .75rem);color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)))}.tbw-filter-range-input,.tbw-filter-date-input{width:100%;height:var(--tbw-filter-item-height, 28px);padding:var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-sm, .375rem);background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-range-input:focus,.tbw-filter-date-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-range-separator{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding-bottom:var(--tbw-spacing-xs, .25rem)}.tbw-filter-blank-option{display:flex;align-items:center;gap:var(--tbw-spacing-sm, .375rem);padding:var(--tbw-spacing-xs, .25rem) 0;margin-bottom:var(--tbw-spacing-xs, .25rem);font-size:var(--tbw-font-size-sm, .8125rem);cursor:pointer;-webkit-user-select:none;user-select:none}.tbw-filter-blank-checkbox{accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));margin:0;cursor:pointer}.tbw-filter-date-range.tbw-filter-disabled,.tbw-filter-range-inputs.tbw-filter-disabled,.tbw-filter-range-slider.tbw-filter-disabled{opacity:.4;pointer-events:none}.tbw-filter-range-slider{position:relative;height:24px;margin:var(--tbw-spacing-md, .5rem) 0 var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-track{position:absolute;top:50%;left:0;right:0;height:4px;background:var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-fill{position:absolute;top:50%;height:4px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-thumb{position:absolute;top:0;width:100%;height:100%;background:none;pointer-events:none;-webkit-appearance:none;appearance:none}.tbw-filter-range-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-moz-range-thumb{width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-webkit-slider-thumb:hover{transform:scale(1.1)}.tbw-filter-range-thumb::-moz-range-thumb:hover{transform:scale(1.1)}}",document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,r){if(this.openPanelField===e)return void this.closeFilterPanel();this.closeFilterPanel();const n=document.createElement("div");if(n.className="tbw-filter-panel",this.copyGridThemeContext(n),this.isAnimationEnabled&&n.classList.add("tbw-filter-panel-animated"),this.panelElement=n,this.openPanelField=e,this.config.valuesHandler)return n.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(n),this.positionPanel(n,r),this.setupPanelCloseHandler(n,r),void this.config.valuesHandler(e,t).then(r=>{this.openPanelField===e&&this.panelElement&&(n.innerHTML="",this.renderPanelContent(e,t,n,r))});const l=i(this.sourceRows,e,t.filterValue);document.body.appendChild(n),this.positionPanel(n,r),this.renderPanelContent(e,t,n,l),this.setupPanelCloseHandler(n,r)}renderPanelContent(t,r,i,n){const l=this.filters.get(t);if("in"===l?.operator&&"set"===l.type&&Array.isArray(l.value)&&!this.excludedValues.has(t)){const r=l.value,i=new Set(r.map(t=>null==t?e:t)),a=new Set(n.filter(e=>!i.has(e)));this.excludedValues.set(t,a)}let a=this.excludedValues.get(t);a||(a=/* @__PURE__ */new Set,this.excludedValues.set(t,a));const s=this.searchText.get(t)??"",o={field:t,column:r,uniqueValues:n,excludedValues:a,searchText:s,currentFilter:this.filters.get(t),applySetFilter:(e,r)=>{this.applySetFilter(t,e,r),this.closeFilterPanel()},applyTextFilter:(e,r,i)=>{this.applyTextFilter(t,e,r,i),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(t),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let c=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(i,o),c=i.children.length>0),!c&&r.type){const e=this.grid.effectiveConfig.typeDefaults?.[r.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(i,o),c=i.children.length>0)}if(!c){const e=r.type;"number"===e?function(e,t,r,i){const{field:n,column:l}=t,a=l.filterParams,s=l.editorParams,o=r.filter(e=>"number"==typeof e&&!isNaN(e)),c=o.length>0?Math.min(...o):0,d=o.length>0?Math.max(...o):100,u=v(a?.min??s?.min,c),p=v(a?.max??s?.max,d),h=a?.step??s?.step??1,f=i.get(n);let b=u,g=p;const m="blank"===f?.operator;"between"===f?.operator?(b=v(f.value,u),g=v(f.valueTo,p)):"greaterThanOrEqual"===f?.operator?b=v(f.value,u):"lessThanOrEqual"===f?.operator&&(g=v(f.value,p));const w=document.createElement("div");w.className="tbw-filter-range-inputs";const y=document.createElement("div");y.className="tbw-filter-range-group";const x=document.createElement("label");x.textContent="Min",x.className="tbw-filter-range-label";const C=document.createElement("input");C.type="number",C.className="tbw-filter-range-input",C.min=String(u),C.max=String(p),C.step=String(h),C.value=String(b),y.appendChild(x),y.appendChild(C),w.appendChild(y);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",w.appendChild(E);const k=document.createElement("div");k.className="tbw-filter-range-group";const S=document.createElement("label");S.textContent="Max",S.className="tbw-filter-range-label";const F=document.createElement("input");F.type="number",F.className="tbw-filter-range-input",F.min=String(u),F.max=String(p),F.step=String(h),F.value=String(g),k.appendChild(S),k.appendChild(F),w.appendChild(k),e.appendChild(w);const A=document.createElement("div");A.className="tbw-filter-range-slider";const N=document.createElement("div");N.className="tbw-filter-range-track";const T=document.createElement("div");T.className="tbw-filter-range-fill";const R=document.createElement("input");R.type="range",R.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",R.min=String(u),R.max=String(p),R.step=String(h),R.value=String(b);const P=document.createElement("input");P.type="range",P.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",P.min=String(u),P.max=String(p),P.step=String(h),P.value=String(g),A.appendChild(N),A.appendChild(T),A.appendChild(R),A.appendChild(P),e.appendChild(A);const L=document.createElement("label");L.className="tbw-filter-blank-option";const I=document.createElement("input");I.type="checkbox",I.className="tbw-filter-blank-checkbox",I.checked=m;const M=document.createTextNode("Blank");L.appendChild(I),L.appendChild(M);const V=e=>{C.disabled=e,F.disabled=e,R.disabled=e,P.disabled=e,w.classList.toggle("tbw-filter-disabled",e),A.classList.toggle("tbw-filter-disabled",e)};V(m),I.addEventListener("change",()=>{V(I.checked)}),e.appendChild(L);const q=()=>{const e=parseFloat(R.value),t=parseFloat(P.value),r=p-u,i=(e-u)/r*100,n=(t-u)/r*100;T.style.left=`${i}%`,T.style.width=n-i+"%"};R.addEventListener("input",()=>{const e=Math.min(parseFloat(R.value),parseFloat(P.value));R.value=String(e),C.value=String(e),q()}),P.addEventListener("input",()=>{const e=Math.max(parseFloat(P.value),parseFloat(R.value));P.value=String(e),F.value=String(e),q()}),C.addEventListener("input",()=>{let e=parseFloat(C.value)||u;e=Math.max(u,Math.min(e,parseFloat(F.value))),R.value=String(e),q()}),F.addEventListener("input",()=>{let e=parseFloat(F.value)||p;e=Math.min(p,Math.max(e,parseFloat(C.value))),P.value=String(e),q()}),q();const _=document.createElement("div");_.className="tbw-filter-buttons";const z=document.createElement("button");z.className="tbw-filter-apply-btn",z.textContent="Apply",z.addEventListener("click",()=>{if(I.checked)return void t.applyTextFilter("blank","");const e=parseFloat(C.value),r=parseFloat(F.value);t.applyTextFilter("between",e,r)}),_.appendChild(z);const H=document.createElement("button");H.className="tbw-filter-clear-btn",H.textContent="Clear Filter",H.addEventListener("click",()=>{t.clearFilter()}),_.appendChild(H),e.appendChild(_)}(i,o,n,this.filters):"date"===e?function(e,t,r,i){const{field:n,column:l}=t,a=l.filterParams,s=l.editorParams,o=r.filter(e=>e instanceof Date||"string"==typeof e&&!isNaN(Date.parse(e))).map(e=>e instanceof Date?e:new Date(e)).filter(e=>!isNaN(e.getTime())),c=o.length>0?new Date(Math.min(...o.map(e=>e.getTime()))):null,d=o.length>0?new Date(Math.max(...o.map(e=>e.getTime()))):null,u=g(a?.min)||g(s?.min)||b(c),p=g(a?.max)||g(s?.max)||b(d),h=i.get(n);let f="",m="";const v="blank"===h?.operator;"between"===h?.operator?(f=g(h.value)||"",m=g(h.valueTo)||""):"greaterThanOrEqual"===h?.operator?f=g(h.value)||"":"lessThanOrEqual"===h?.operator&&(m=g(h.value)||"");const w=document.createElement("div");w.className="tbw-filter-date-range";const y=document.createElement("div");y.className="tbw-filter-date-group";const x=document.createElement("label");x.textContent="From",x.className="tbw-filter-range-label";const C=document.createElement("input");C.type="date",C.className="tbw-filter-date-input",u&&(C.min=u),p&&(C.max=p),C.value=f,y.appendChild(x),y.appendChild(C),w.appendChild(y);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",w.appendChild(E);const k=document.createElement("div");k.className="tbw-filter-date-group";const S=document.createElement("label");S.textContent="To",S.className="tbw-filter-range-label";const F=document.createElement("input");F.type="date",F.className="tbw-filter-date-input",u&&(F.min=u),p&&(F.max=p),F.value=m,k.appendChild(S),k.appendChild(F),w.appendChild(k),e.appendChild(w);const A=document.createElement("label");A.className="tbw-filter-blank-option";const N=document.createElement("input");N.type="checkbox",N.className="tbw-filter-blank-checkbox",N.checked=v;const T=document.createTextNode("Show only blank");A.appendChild(N),A.appendChild(T);const R=e=>{C.disabled=e,F.disabled=e,w.classList.toggle("tbw-filter-disabled",e)};R(v),N.addEventListener("change",()=>{R(N.checked)}),e.appendChild(A);const P=document.createElement("div");P.className="tbw-filter-buttons";const L=document.createElement("button");L.className="tbw-filter-apply-btn",L.textContent="Apply",L.addEventListener("click",()=>{if(N.checked)return void t.applyTextFilter("blank","");const e=C.value,r=F.value;e&&r?t.applyTextFilter("between",e,r):e?t.applyTextFilter("greaterThanOrEqual",e):r?t.applyTextFilter("lessThanOrEqual",r):t.clearFilter()}),P.appendChild(L);const I=document.createElement("button");I.className="tbw-filter-clear-btn",I.textContent="Clear Filter",I.addEventListener("click",()=>{t.clearFilter()}),P.appendChild(I),e.appendChild(P)}(i,o,n,this.filters):m(i,o,n,a,{caseSensitive:this.config.caseSensitive,debounceMs:this.config.debounceMs},this.searchText)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController,setTimeout(()=>{document.addEventListener("click",r=>{e.contains(r.target)||r.target===t||this.closeFilterPanel()},{signal:this.panelAbortController?.signal})},0)}closeFilterPanel(){const e=this.panelElement;e&&(e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return null===w.supportsAnchorPositioning&&(w.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),w.supportsAnchorPositioning}positionPanel(e,t){const r=t.closest(".cell")??t;if(r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r,w.checkAnchorPositioningSupport())return void requestAnimationFrame(()=>{const t=e.getBoundingClientRect(),i=r.getBoundingClientRect();t.top<i.top&&e.classList.add("tbw-filter-panel-above")});const i=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${i.bottom+4}px`,e.style.left=`${i.left}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();t.right>window.innerWidth-8&&(e.style.left=i.right-t.width+"px"),t.bottom>window.innerHeight-8&&(e.style.top=i.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}applySetFilter(e,t,r){if(this.excludedValues.set(e,new Set(t)),0===t.length)this.filters.delete(e);else{const i=this.filters.get(e);if("in"===i?.operator){const i=this.getUniqueValues(e),n=new Set(t),l=i.filter(e=>!n.has(e));this.filters.set(e,{field:e,type:"set",operator:"in",value:l,...void 0!==r&&{valueTo:r}})}else this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==r&&{valueTo:r}})}this.applyFiltersInternal()}applyTextFilter(e,t,r,i){this.filters.set(e,{field:e,type:"text",operator:t,value:r,valueTo:i}),this.applyFiltersInternal()}applyFiltersInternal(e){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const t=[...this.filters.values()];if(this.config.filterHandler){this.gridElement.setAttribute("aria-busy","true");const r=this.config.filterHandler(t,this.sourceRows),i=r=>{this.gridElement.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,e||(this.emit("filter-change",{filters:t,filteredRowCount:r.length,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.emitPluginEvent("filter-applied",{filters:t}),this.requestRender()};return void(r&&"function"==typeof r.then?r.then(i):i(r))}e||(this.emit("filter-change",{filters:t,filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.emitPluginEvent("filter-applied",{filters:t}),this.requestRender()}getColumnState(e){if(!this.config.trackColumnState)return;const t=this.filters.get(e);return t?{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}:void 0}applyColumnState(e,t){if(!this.config.trackColumnState)return;if(!t.filter)return void this.filters.delete(e);const r={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,r),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null}}export{e as BLANK_FILTER_VALUE,w as FilteringPlugin};
1
+ const e="(Blank)";function t(e){if("number"==typeof e)return e;if(e instanceof Date)return e.getTime();const t=Number(e);if(!isNaN(t))return t;return new Date(e).getTime()}function r(r,n,i=!1,l){if(!n.length)return r;const a=n.map(r=>function(r,n,i){const l=r.field,a=r.operator;if("blank"===a)return e=>{const t=e[l];return null==t||""===t};if("notBlank"===a)return e=>{const t=e[l];return null!=t&&""!==t};if(i&&("notIn"===a||"in"===a)){const t=r.value;if("notIn"===a){if(!Array.isArray(t))return()=>!0;const r=new Set(t);return t=>{const n=i(t[l],t),a=Array.isArray(n)?n:null!=n?[n]:[];return 0===a.length?!r.has(e):!a.some(e=>r.has(e))}}if(!Array.isArray(t))return()=>!1;const n=new Set(t);return t=>{const r=i(t[l],t),a=Array.isArray(r)?r:null!=r?[r]:[];return 0===a.length?n.has(e):a.some(e=>n.has(e))}}if("notIn"===a){if(!Array.isArray(r.value))return()=>!0;const t=new Set(r.value);return r=>{const n=r[l];return null==n||""===n?!t.has(e):!t.has(n)}}if("in"===a){if(!Array.isArray(r.value))return()=>!1;const t=new Set(r.value);return r=>{const n=r[l];return null==n||""===n?t.has(e):t.has(n)}}const s="number"===r.type;if("greaterThan"===a){const e=t(r.value);return s?t=>t[l]>e:r=>{const n=r[l];return null!=n&&t(n)>e}}if("greaterThanOrEqual"===a){const e=t(r.value);return s?t=>t[l]>=e:r=>{const n=r[l];return null!=n&&t(n)>=e}}if("lessThan"===a){const e=t(r.value);return s?t=>t[l]<e:r=>{const n=r[l];return null!=n&&t(n)<e}}if("lessThanOrEqual"===a){const e=t(r.value);return s?t=>t[l]<=e:r=>{const n=r[l];return null!=n&&t(n)<=e}}if("between"===a){const e=t(r.value),n=t(r.valueTo);return s?t=>{const r=t[l];return r>=e&&r<=n}:r=>{const i=r[l];if(null==i)return!1;const a=t(i);return a>=e&&a<=n}}const o=n?String(r.value):String(r.value).toLowerCase();return"contains"===a?n?e=>{const t=e[l];return null!=t&&String(t).includes(o)}:e=>{const t=e[l];return null!=t&&String(t).toLowerCase().includes(o)}:"notContains"===a?n?e=>{const t=e[l];return null!=t&&!String(t).includes(o)}:e=>{const t=e[l];return null!=t&&!String(t).toLowerCase().includes(o)}:"equals"===a?n?e=>{const t=e[l];return null!=t&&String(t)===o}:e=>{const t=e[l];return null!=t&&String(t).toLowerCase()===o}:"notEquals"===a?n?e=>{const t=e[l];return null!=t&&String(t)!==o}:e=>{const t=e[l];return null!=t&&String(t).toLowerCase()!==o}:"startsWith"===a?n?e=>{const t=e[l];return null!=t&&String(t).startsWith(o)}:e=>{const t=e[l];return null!=t&&String(t).toLowerCase().startsWith(o)}:"endsWith"===a?n?e=>{const t=e[l];return null!=t&&String(t).endsWith(o)}:e=>{const t=e[l];return null!=t&&String(t).toLowerCase().endsWith(o)}:()=>!0}(r,i,l?.get(r.field)));return 1===a.length?r.filter(a[0]):r.filter(e=>{for(let t=0;t<a.length;t++)if(!a[t](e))return!1;return!0})}function n(t,r,n){const i=/* @__PURE__ */new Set;let l=!1;for(const e of t){const t=e[r];if(n){const r=n(t,e);if(Array.isArray(r)){0===r.length&&(l=!0);for(const e of r)null!=e&&i.add(e)}else null!=r?i.add(r):l=!0}else null!=t&&""!==t?i.add(t):l=!0}return l&&i.add(e),[...i].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}function i(e,t){const r=e.querySelector?.(".tbw-sr-only");r&&(r.textContent="",requestAnimationFrame(()=>{r.textContent=t}))}function l(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function a(e,t,r,n){return`${l(r,n)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}const s=/* @__PURE__ */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"]),o=/^on\w+$/i,c=/* @__PURE__ */new Set(["href","src","action","formaction","data","srcdoc","xlink:href","poster","srcset"]),d=/^\s*(javascript|vbscript|data|blob):/i;function u(e){if(!e||"string"!=typeof e)return"";if(-1===e.indexOf("<"))return e;const t=document.createElement("template");return t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(s.has(e)){t.push(n);continue}if("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI){if(Array.from(n.attributes).some(e=>o.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();o.test(e)?r.push(t.name):(c.has(e)&&d.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content),t.innerHTML}const p='<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>',h={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:p,filterActive:p,print:"🖨️"};class f{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,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.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)}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{...h,...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 t=this.gridElement;if(t){return"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}return!0}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}resolveIcon(e,t){return void 0!==t?t:this.gridIcons[e]}setIcon(e,t){"string"==typeof t?e.innerHTML=u(t):t instanceof HTMLElement&&(e.innerHTML="",e.appendChild(t.cloneNode(!0)))}warn(e,t){void 0!==t?console.warn(a(e,t,this.gridElement.id,this.name)):console.warn(`${l(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(a(e,t,this.gridElement.id,this.name))}}function b(e){return e?e.toISOString().split("T")[0]:""}function g(e){return e?"string"==typeof e?e:"number"==typeof e?b(new Date(e)):"":""}function m(e,t,r,n,i,l){const{field:a,column:s}=t,o=function(e){if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-filter-item-height");if(t&&t.trim()){const e=parseFloat(t);if(!isNaN(e)&&e>0)return e}}return 28}(e),c=e=>{if(null==e)return"(Blank)";if(s.format&&!s.filterValue){const t=s.format(e,void 0);if(t)return t}return String(e)};r=r.slice().sort((e,t)=>c(e).localeCompare(c(t)));const d=document.createElement("div");d.className="tbw-filter-search";const u=document.createElement("input");u.type="text",u.placeholder="Search...",u.className="tbw-filter-search-input",u.value=l.get(a)??"",d.appendChild(u),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-actions";const h=document.createElement("label");h.className="tbw-filter-value-item",h.style.padding="0",h.style.margin="0";const f=document.createElement("input");f.type="checkbox",f.className="tbw-filter-checkbox";const b=document.createElement("span");b.textContent="Select All",h.appendChild(f),h.appendChild(b),p.appendChild(h);const g=/* @__PURE__ */new Map;r.forEach(e=>{const t=null==e?"__null__":String(e);g.set(t,!n.has(e))});const m=()=>{const e=[...g.values()],t=e.every(e=>e),r=e.every(e=>!e);f.checked=t,f.indeterminate=!t&&!r};f.addEventListener("change",()=>{const e=f.checked;for(const t of g.keys())g.set(t,e);m(),E()}),m(),e.appendChild(p);const v=document.createElement("div");v.className="tbw-filter-values";const w=document.createElement("div");w.className="tbw-filter-values-spacer",v.appendChild(w);const y=document.createElement("div");y.className="tbw-filter-values-content",v.appendChild(y);let x=[];const C=(e,t)=>{const r=c(e),n=null==e?"__null__":String(e),i=document.createElement("label");i.className="tbw-filter-value-item",i.style.position="absolute",i.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,i.style.left="0",i.style.right="0",i.style.boxSizing="border-box";const l=document.createElement("input");l.type="checkbox",l.className="tbw-filter-checkbox",l.checked=g.get(n)??!0,l.dataset.value=n,l.addEventListener("change",()=>{g.set(n,l.checked),m()});const a=document.createElement("span");return a.textContent=r,i.appendChild(l),i.appendChild(a),i},E=()=>{const e=x.length,t=v.clientHeight,r=v.scrollTop;if(w.style.height=e*o+"px",e<=50/3)return y.innerHTML="",y.style.transform="translateY(0px)",void x.forEach((e,t)=>{y.appendChild(C(e,t))});const n=function(e){const{totalRows:t,viewportHeight:r,scrollTop:n,rowHeight:i,overscan:l}=e,a=Math.ceil(r/i);let s=Math.floor(n/i)-l;s<0&&(s=0);let o=s+a+2*l;return o>t&&(o=t),o===t&&s>0&&(s=Math.max(0,o-a-2*l)),{start:s,end:o,offsetY:s*i,totalHeight:t*i}}({totalRows:e,viewportHeight:t,scrollTop:r,rowHeight:o,overscan:3});y.style.transform=`translateY(${n.offsetY}px)`,y.innerHTML="";for(let i=n.start;i<n.end;i++)y.appendChild(C(x[i],i-n.start))},S=e=>{const t=i.caseSensitive??!1,n=t?e:e.toLowerCase();if(x=r.filter(r=>{const i=c(r),l=t?i:i.toLowerCase();return!e||l.includes(n)}),x.sort((e,t)=>{const r=null==e?"__null__":String(e),n=null==t?"__null__":String(t),i=g.get(r)??!0;return i!==(g.get(n)??!0)?i?-1:1:c(e).localeCompare(c(t))}),0===x.length){w.style.height="0px",y.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent="No matching values",void y.appendChild(e)}E()};let k;v.addEventListener("scroll",()=>{x.length>0&&E()},{passive:!0}),S(u.value),e.appendChild(v),u.addEventListener("input",()=>{clearTimeout(k),k=setTimeout(()=>{l.set(a,u.value),S(u.value)},i.debounceMs??150)});const F=document.createElement("div");F.className="tbw-filter-buttons";const A=document.createElement("button");A.className="tbw-filter-apply-btn",A.textContent="Apply",A.addEventListener("click",()=>{const e=[];for(const[t,n]of g)if(!n)if("__null__"===t)e.push(null);else{const n=r.find(e=>String(e)===t);e.push(void 0!==n?n:t)}t.applySetFilter(e)}),F.appendChild(A);const N=document.createElement("button");N.className="tbw-filter-clear-btn",N.textContent="Clear Filter",N.addEventListener("click",()=>{t.clearFilter()}),F.appendChild(N),e.appendChild(F)}function v(e,t){if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t}class w extends f{static manifest={events:[{type:"filter-applied",description:"Emitted when filter criteria change. Subscribers can react to row visibility changes."}],queries:[{type:"getContextMenuItems",description:"Contributes filter-related items to the header context menu"}]};name="filtering";styles='@layer tbw-plugins{tbw-grid .tbw-quick-filter-input{flex:1;max-width:300px;height:var(--tbw-input-height, 1.75rem);padding:var(--tbw-input-padding, 0 .5rem);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);background:var(--tbw-color-bg);color:var(--tbw-color-fg);font-size:var(--tbw-font-size-sm, .8125rem)}tbw-grid .tbw-quick-filter-input:focus{outline:none;border-color:var(--tbw-color-accent)}tbw-grid .header-cell.filtered:before{content:"";position:absolute;top:var(--tbw-spacing-xs, .25rem);right:var(--tbw-spacing-xs, .25rem);width:var(--tbw-indicator-size, .375rem);height:var(--tbw-indicator-size, .375rem);background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:50%}tbw-grid .tbw-filter-btn{display:var(--tbw-filter-btn-display, inline-flex);visibility:var(--tbw-filter-btn-visibility, visible);align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:2px;margin-left:var(--tbw-spacing-xs, .25rem);opacity:.4;transition:opacity .15s,visibility 0s,display 0s allow-discrete;color:inherit;vertical-align:middle;transition-behavior:allow-discrete}tbw-grid .tbw-filter-btn:hover,tbw-grid .tbw-filter-btn.active{opacity:1;visibility:visible;display:inline-flex}tbw-grid .tbw-filter-btn.active{color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}tbw-grid .header-row .cell:hover .tbw-filter-btn,tbw-grid .header-row .cell.filtered .tbw-filter-btn{display:inline-flex;visibility:visible}}';get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return!1!==this.grid.effectiveConfig?.filterable}isColumnFilterable(e){return!!this.isFilteringEnabled()&&!1!==e.filterable}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const r of e)r.field&&r.filterValue&&(t||(t=/* @__PURE__ */new Map),t.set(r.field,r.filterValue));return t}filters=/* @__PURE__ */new Map;cachedResult=null;cacheKey=null;cachedInputSpot=null;openPanelField=null;panelElement=null;panelAnchorElement=null;searchText=/* @__PURE__ */new Map;excludedValues=/* @__PURE__ */new Map;panelAbortController=null;globalStylesInjected=!1;computeSelected(){const t={},r=[];for(const[e,n]of this.filters)if("set"===n.type)if("in"===n.operator&&Array.isArray(n.value))t[e]=n.value;else if("notIn"===n.operator){const t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e);r.push({field:e,filterValue:t?.filterValue})}if(r.length>0){const n=function(t,r){const n=/* @__PURE__ */new Map;for(const{field:e,filterValue:l}of r)n.set(e,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!l});for(const e of t)for(const{field:t,filterValue:i}of r){const r=n.get(t),l=e[t];if(i){const t=i(l,e);if(Array.isArray(t)){0===t.length&&(r.hasBlank=!0);for(const e of t)null!=e&&r.values.add(e)}else null!=t?r.values.add(t):r.hasBlank=!0}else null!=l&&""!==l?r.values.add(l):r.hasBlank=!0}const i=/* @__PURE__ */new Map;for(const[l,{values:a,hasBlank:s}]of n)s&&a.add(e),i.set(l,[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return i}(this.sourceRows,r);for(const{field:e}of r){const r=this.excludedValues.get(e),i=n.get(e)??[];t[e]=r?i.filter(e=>!r.has(e)):i}}return t}syncExcludedValues(t,r){if(r)if("set"===r.type&&"notIn"===r.operator&&Array.isArray(r.value))this.excludedValues.set(t,new Set(r.value));else if("set"===r.type&&"in"===r.operator&&Array.isArray(r.value)){const n=this.sourceRows;if(!n||0===n.length)return void this.excludedValues.delete(t);const i=r.value,l=new Set(i.map(t=>null==t?e:t)),a=this.getUniqueValues(t),s=new Set(a.filter(e=>!l.has(e)));this.excludedValues.set(t,s)}else"set"===r.type&&this.excludedValues.delete(t);else this.excludedValues.delete(t)}attach(e){super.attach(e),this.injectGlobalStyles()}detach(){this.filters.clear(),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.openPanelField=null,this.panelElement&&(this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}handleQuery(e){if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const r=t.column;if(!r?.field)return;if(!this.isFilteringEnabled())return;if(!this.isColumnFilterable(r))return;const n=[],i=this.isFieldFiltered(r.field),l=this.filters.size>0;return i&&n.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),l&&n.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!l,action:()=>this.clearAllFilters()}),n.length>0?n:void 0}}processRows(e){if(!this.filters.size)return e;const t=[...this.filters.values()];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:e;const n=(i=t,JSON.stringify(i.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var i;const l={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},a=null!=this.cachedInputSpot&&l.len===this.cachedInputSpot.len&&l.first===this.cachedInputSpot.first&&l.mid===this.cachedInputSpot.mid&&l.last===this.cachedInputSpot.last;if(this.cacheKey===n&&this.cachedResult&&a)return this.cachedResult;if(!a)for(const[r,o]of this.filters)"set"===o.type&&"in"===o.operator&&this.syncExcludedValues(r,o);const s=r(e,t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=s,this.cacheKey=n,this.cachedInputSpot=l,s}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(e=>{const t=e.getAttribute("data-col");if(null===t)return;const r=this.visibleColumns[parseInt(t,10)];if(!r||!this.isColumnFilterable(r))return;if(n=r,!0===n.meta?.utility)return;var n;const i=r.field;if(!i)return;const l=this.filters.has(i);let a=e.querySelector(".tbw-filter-btn");if(a){const t=a.classList.contains("active");if(a.classList.toggle("active",l),e.classList.toggle("filtered",l),l?e.setAttribute("aria-description","Filtered"):e.removeAttribute("aria-description"),t!==l){const e=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(e))}return}a=document.createElement("button"),a.className="tbw-filter-btn",a.setAttribute("aria-label",`Filter ${r.header??i}`);const s=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(s)),l&&(a.classList.add("active"),e.classList.add("filtered"),e.setAttribute("aria-description","Filtered")),a.addEventListener("click",e=>{e.stopPropagation(),this.toggleFilterPanel(i,r,a)});const o=e.querySelector(".resize-handle");o?e.insertBefore(a,o):e.appendChild(a)})}setFilter(e,t,r){if(null===t)this.filters.delete(e),this.syncExcludedValues(e,null);else{const r={...t,field:e};this.filters.set(e,r),this.syncExcludedValues(e,r)}if(this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,!r?.silent){this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.();const r=this.grid.effectiveConfig?.columns?.find(t=>t.field===e)?.header??e;i(this.gridElement,null===t?`Filter cleared from ${r}`:`Filter applied on ${r}`)}this.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}getFilter(e){return this.filters.get(e)}getFilters(){return[...this.filters.values()]}getFilterModel(){return this.getFilters()}setFilterModel(e,t){this.filters.clear(),this.excludedValues.clear();for(const r of e)this.filters.set(r.field,r),this.syncExcludedValues(r.field,r);this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,t?.silent||(this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent),e?.silent||i(this.gridElement,"All filters cleared")}clearFieldFilter(e,t){if(this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent),!t?.silent){const t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e)?.header??e;i(this.gridElement,`Filter cleared from ${t}`)}}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e),r=t?.filterValue;return n(this.sourceRows,e,r)}getStaleFilters(){const e=[];for(const[t,r]of this.filters){if("set"!==r.type)continue;const n=this.getUniqueValues(t);if("notIn"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===n.filter(e=>!t.has(e)).length&&e.push(r)}else if("in"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===n.filter(e=>t.has(e)).length&&e.push(r)}}return e}getBlankMode(e){const t=this.filters.get(e);return"blank"===t?.operator?"blanksOnly":"notBlank"===t?.operator?"nonBlanksOnly":"all"}toggleBlankFilter(e,t){if("all"===t){const t=this.filters.get(e);if(t?.valueTo&&"object"==typeof t.valueTo){const r=t.valueTo;this.setFilter(e,r)}else this.setFilter(e,null);return}const r=this.filters.get(e),n=r&&"blank"!==r.operator&&"notBlank"!==r.operator?{type:r.type,operator:r.operator,value:r.value,valueTo:r.valueTo}:r?.valueTo;this.setFilter(e,{type:r?.type??"text",operator:"blanksOnly"===t?"blank":"notBlank",value:"",valueTo:n})}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const n of t.classList)n.startsWith("tbw-")||"selecting"===n||e.classList.add(n);const r=t.dataset.theme;r&&(e.dataset.theme=r)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles"))return void(this.globalStylesInjected=!0);const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent="@layer tbw-plugins{.tbw-filter-panel{position:fixed;background:var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));color:var(--tbw-filter-panel-fg, var(--tbw-color-fg, light-dark(#222222, #eeeeee)));border:1px solid var(--tbw-filter-panel-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-panel-radius, var(--tbw-border-radius, .25rem));box-shadow:0 4px 16px var(--tbw-filter-panel-shadow, var(--tbw-color-shadow, light-dark(rgba(0, 0, 0, .1), rgba(0, 0, 0, .3))));padding:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));z-index:10000;min-width:200px;max-width:280px;max-height:350px;display:flex;flex-direction:column;font-family:var(--tbw-font-family, system-ui, sans-serif);font-size:var(--tbw-font-size, .8125rem);transform-origin:top center}.tbw-filter-panel.tbw-filter-panel-above{transform-origin:bottom center}.tbw-filter-panel.tbw-filter-panel-animated{animation:tbw-filter-panel-enter var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}.tbw-filter-panel.tbw-filter-panel-above.tbw-filter-panel-animated{animation:tbw-filter-panel-enter-above var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}@keyframes tbw-filter-panel-enter{0%{opacity:0;transform:scaleY(.3) translateY(-10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@keyframes tbw-filter-panel-enter-above{0%{opacity:0;transform:scaleY(.3) translateY(10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@supports (anchor-name: --test){.tbw-filter-panel{position-anchor:--tbw-filter-anchor;top:anchor(bottom);left:anchor(left);margin-top:4px;position-try-fallbacks:flip-inline,flip-block,flip-block flip-inline}}.tbw-filter-search{margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-search-input{height:var(--tbw-filter-item-height, 28px);width:100%;padding:var(--tbw-filter-search-padding, var(--tbw-spacing-sm, .375rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-search-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-actions{display:flex;padding:var(--tbw-button-padding-sm, .25rem .125rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-bottom:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-actions .tbw-filter-value-item{flex:1}.tbw-filter-values{flex:1;overflow-y:auto;margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));max-height:180px;position:relative}.tbw-filter-values-spacer{width:1px}.tbw-filter-values-content{position:absolute;top:0;left:0;right:0}.tbw-filter-value-item{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding:var(--tbw-button-padding-sm, .25rem .125rem);cursor:pointer;border-radius:3px;height:var(--tbw-filter-item-height, 28px)}.tbw-filter-value-item:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-checkbox{margin:0;cursor:pointer;accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}.tbw-filter-no-match{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem)) 0;text-align:center;font-style:italic}.tbw-filter-buttons{display:flex;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding-top:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-top:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)))}.tbw-filter-apply-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));color:var(--tbw-filter-accent-fg, var(--tbw-color-accent-fg, light-dark(#ffffff, #000000)));border:none;border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-apply-btn:hover{filter:brightness(.9)}.tbw-filter-clear-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:transparent;color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-clear-btn:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-range-inputs,.tbw-filter-date-range{display:flex;align-items:flex-end;gap:var(--tbw-spacing-sm, .375rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-group,.tbw-filter-date-group{display:flex;flex-direction:column;gap:var(--tbw-spacing-xs, .25rem);flex:1}.tbw-filter-range-label{font-size:var(--tbw-font-size-xs, .75rem);color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)))}.tbw-filter-range-input,.tbw-filter-date-input{width:100%;height:var(--tbw-filter-item-height, 28px);padding:var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-sm, .375rem);background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-range-input:focus,.tbw-filter-date-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-range-separator{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding-bottom:var(--tbw-spacing-xs, .25rem)}.tbw-filter-blank-option{display:flex;align-items:center;gap:var(--tbw-spacing-sm, .375rem);padding:var(--tbw-spacing-xs, .25rem) 0;margin-bottom:var(--tbw-spacing-xs, .25rem);font-size:var(--tbw-font-size-sm, .8125rem);cursor:pointer;-webkit-user-select:none;user-select:none}.tbw-filter-blank-checkbox{accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));margin:0;cursor:pointer}.tbw-filter-date-range.tbw-filter-disabled,.tbw-filter-range-inputs.tbw-filter-disabled,.tbw-filter-range-slider.tbw-filter-disabled{opacity:.4;pointer-events:none}.tbw-filter-range-slider{position:relative;height:24px;margin:var(--tbw-spacing-md, .5rem) 0 var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-track{position:absolute;top:50%;left:0;right:0;height:4px;background:var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-fill{position:absolute;top:50%;height:4px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-thumb{position:absolute;top:0;width:100%;height:100%;background:none;pointer-events:none;-webkit-appearance:none;appearance:none}.tbw-filter-range-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-moz-range-thumb{width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-webkit-slider-thumb:hover{transform:scale(1.1)}.tbw-filter-range-thumb::-moz-range-thumb:hover{transform:scale(1.1)}}",document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,r){if(this.openPanelField===e)return void this.closeFilterPanel();this.closeFilterPanel();const i=document.createElement("div");if(i.className="tbw-filter-panel",this.copyGridThemeContext(i),this.isAnimationEnabled&&i.classList.add("tbw-filter-panel-animated"),this.panelElement=i,this.openPanelField=e,this.config.valuesHandler)return i.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(i),this.positionPanel(i,r),this.setupPanelCloseHandler(i,r),void this.config.valuesHandler(e,t).then(r=>{this.openPanelField===e&&this.panelElement&&(i.innerHTML="",this.renderPanelContent(e,t,i,r))});const l=n(this.sourceRows,e,t.filterValue);document.body.appendChild(i),this.positionPanel(i,r),this.renderPanelContent(e,t,i,l),this.setupPanelCloseHandler(i,r)}renderPanelContent(t,r,n,i){const l=this.filters.get(t);if("in"===l?.operator&&"set"===l.type&&Array.isArray(l.value)&&!this.excludedValues.has(t)){const r=l.value,n=new Set(r.map(t=>null==t?e:t)),a=new Set(i.filter(e=>!n.has(e)));this.excludedValues.set(t,a)}let a=this.excludedValues.get(t);a||(a=/* @__PURE__ */new Set,this.excludedValues.set(t,a));const s=this.searchText.get(t)??"",o={field:t,column:r,uniqueValues:i,excludedValues:a,searchText:s,currentFilter:this.filters.get(t),applySetFilter:(e,r)=>{this.applySetFilter(t,e,r),this.closeFilterPanel()},applyTextFilter:(e,r,n)=>{this.applyTextFilter(t,e,r,n),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(t),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let c=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(n,o),c=n.children.length>0),!c&&r.type){const e=this.grid.effectiveConfig.typeDefaults?.[r.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(n,o),c=n.children.length>0)}if(!c){const e=r.type;"number"===e?function(e,t,r,n){const{field:i,column:l}=t,a=l.filterParams,s=l.editorParams,o=r.filter(e=>"number"==typeof e&&!isNaN(e)),c=o.length>0?Math.min(...o):0,d=o.length>0?Math.max(...o):100,u=v(a?.min??s?.min,c),p=v(a?.max??s?.max,d),h=a?.step??s?.step??1,f=n.get(i);let b=u,g=p;const m="blank"===f?.operator;"between"===f?.operator?(b=v(f.value,u),g=v(f.valueTo,p)):"greaterThanOrEqual"===f?.operator?b=v(f.value,u):"lessThanOrEqual"===f?.operator&&(g=v(f.value,p));const w=document.createElement("div");w.className="tbw-filter-range-inputs";const y=document.createElement("div");y.className="tbw-filter-range-group";const x=document.createElement("label");x.textContent="Min",x.className="tbw-filter-range-label";const C=document.createElement("input");C.type="number",C.className="tbw-filter-range-input",C.min=String(u),C.max=String(p),C.step=String(h),C.value=String(b),y.appendChild(x),y.appendChild(C),w.appendChild(y);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",w.appendChild(E);const S=document.createElement("div");S.className="tbw-filter-range-group";const k=document.createElement("label");k.textContent="Max",k.className="tbw-filter-range-label";const F=document.createElement("input");F.type="number",F.className="tbw-filter-range-input",F.min=String(u),F.max=String(p),F.step=String(h),F.value=String(g),S.appendChild(k),S.appendChild(F),w.appendChild(S),e.appendChild(w);const A=document.createElement("div");A.className="tbw-filter-range-slider";const N=document.createElement("div");N.className="tbw-filter-range-track";const T=document.createElement("div");T.className="tbw-filter-range-fill";const R=document.createElement("input");R.type="range",R.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",R.min=String(u),R.max=String(p),R.step=String(h),R.value=String(b);const L=document.createElement("input");L.type="range",L.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",L.min=String(u),L.max=String(p),L.step=String(h),L.value=String(g),A.appendChild(N),A.appendChild(T),A.appendChild(R),A.appendChild(L),e.appendChild(A);const P=document.createElement("label");P.className="tbw-filter-blank-option";const I=document.createElement("input");I.type="checkbox",I.className="tbw-filter-blank-checkbox",I.checked=m;const M=document.createTextNode("Blank");P.appendChild(I),P.appendChild(M);const V=e=>{C.disabled=e,F.disabled=e,R.disabled=e,L.disabled=e,w.classList.toggle("tbw-filter-disabled",e),A.classList.toggle("tbw-filter-disabled",e)};V(m),I.addEventListener("change",()=>{V(I.checked)}),e.appendChild(P);const q=()=>{const e=parseFloat(R.value),t=parseFloat(L.value),r=p-u,n=(e-u)/r*100,i=(t-u)/r*100;T.style.left=`${n}%`,T.style.width=i-n+"%"};R.addEventListener("input",()=>{const e=Math.min(parseFloat(R.value),parseFloat(L.value));R.value=String(e),C.value=String(e),q()}),L.addEventListener("input",()=>{const e=Math.max(parseFloat(L.value),parseFloat(R.value));L.value=String(e),F.value=String(e),q()}),C.addEventListener("input",()=>{let e=parseFloat(C.value)||u;e=Math.max(u,Math.min(e,parseFloat(F.value))),R.value=String(e),q()}),F.addEventListener("input",()=>{let e=parseFloat(F.value)||p;e=Math.min(p,Math.max(e,parseFloat(C.value))),L.value=String(e),q()}),q();const _=document.createElement("div");_.className="tbw-filter-buttons";const z=document.createElement("button");z.className="tbw-filter-apply-btn",z.textContent="Apply",z.addEventListener("click",()=>{if(I.checked)return void t.applyTextFilter("blank","");const e=parseFloat(C.value),r=parseFloat(F.value);t.applyTextFilter("between",e,r)}),_.appendChild(z);const H=document.createElement("button");H.className="tbw-filter-clear-btn",H.textContent="Clear Filter",H.addEventListener("click",()=>{t.clearFilter()}),_.appendChild(H),e.appendChild(_)}(n,o,i,this.filters):"date"===e?function(e,t,r,n){const{field:i,column:l}=t,a=l.filterParams,s=l.editorParams,o=r.filter(e=>e instanceof Date||"string"==typeof e&&!isNaN(Date.parse(e))).map(e=>e instanceof Date?e:new Date(e)).filter(e=>!isNaN(e.getTime())),c=o.length>0?new Date(Math.min(...o.map(e=>e.getTime()))):null,d=o.length>0?new Date(Math.max(...o.map(e=>e.getTime()))):null,u=g(a?.min)||g(s?.min)||b(c),p=g(a?.max)||g(s?.max)||b(d),h=n.get(i);let f="",m="";const v="blank"===h?.operator;"between"===h?.operator?(f=g(h.value)||"",m=g(h.valueTo)||""):"greaterThanOrEqual"===h?.operator?f=g(h.value)||"":"lessThanOrEqual"===h?.operator&&(m=g(h.value)||"");const w=document.createElement("div");w.className="tbw-filter-date-range";const y=document.createElement("div");y.className="tbw-filter-date-group";const x=document.createElement("label");x.textContent="From",x.className="tbw-filter-range-label";const C=document.createElement("input");C.type="date",C.className="tbw-filter-date-input",u&&(C.min=u),p&&(C.max=p),C.value=f,y.appendChild(x),y.appendChild(C),w.appendChild(y);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",w.appendChild(E);const S=document.createElement("div");S.className="tbw-filter-date-group";const k=document.createElement("label");k.textContent="To",k.className="tbw-filter-range-label";const F=document.createElement("input");F.type="date",F.className="tbw-filter-date-input",u&&(F.min=u),p&&(F.max=p),F.value=m,S.appendChild(k),S.appendChild(F),w.appendChild(S),e.appendChild(w);const A=document.createElement("label");A.className="tbw-filter-blank-option";const N=document.createElement("input");N.type="checkbox",N.className="tbw-filter-blank-checkbox",N.checked=v;const T=document.createTextNode("Show only blank");A.appendChild(N),A.appendChild(T);const R=e=>{C.disabled=e,F.disabled=e,w.classList.toggle("tbw-filter-disabled",e)};R(v),N.addEventListener("change",()=>{R(N.checked)}),e.appendChild(A);const L=document.createElement("div");L.className="tbw-filter-buttons";const P=document.createElement("button");P.className="tbw-filter-apply-btn",P.textContent="Apply",P.addEventListener("click",()=>{if(N.checked)return void t.applyTextFilter("blank","");const e=C.value,r=F.value;e&&r?t.applyTextFilter("between",e,r):e?t.applyTextFilter("greaterThanOrEqual",e):r?t.applyTextFilter("lessThanOrEqual",r):t.clearFilter()}),L.appendChild(P);const I=document.createElement("button");I.className="tbw-filter-clear-btn",I.textContent="Clear Filter",I.addEventListener("click",()=>{t.clearFilter()}),L.appendChild(I),e.appendChild(L)}(n,o,i,this.filters):m(n,o,i,a,{caseSensitive:this.config.caseSensitive,debounceMs:this.config.debounceMs},this.searchText)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController,setTimeout(()=>{document.addEventListener("click",r=>{e.contains(r.target)||r.target===t||this.closeFilterPanel()},{signal:this.panelAbortController?.signal})},0)}closeFilterPanel(){const e=this.panelElement;e&&(e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return null===w.supportsAnchorPositioning&&(w.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),w.supportsAnchorPositioning}positionPanel(e,t){const r=t.closest(".cell")??t;if(r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r,w.checkAnchorPositioningSupport())return void requestAnimationFrame(()=>{const t=e.getBoundingClientRect(),n=r.getBoundingClientRect();t.top<n.top&&e.classList.add("tbw-filter-panel-above")});const n=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${n.bottom+4}px`,e.style.left=`${n.left}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();t.right>window.innerWidth-8&&(e.style.left=n.right-t.width+"px"),t.bottom>window.innerHeight-8&&(e.style.top=n.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}applySetFilter(e,t,r){if(this.excludedValues.set(e,new Set(t)),0===t.length)this.filters.delete(e);else{const n=this.filters.get(e);if("in"===n?.operator){const n=this.getUniqueValues(e),i=new Set(t),l=n.filter(e=>!i.has(e));this.filters.set(e,{field:e,type:"set",operator:"in",value:l,...void 0!==r&&{valueTo:r}})}else this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==r&&{valueTo:r}})}this.applyFiltersInternal()}applyTextFilter(e,t,r,n){this.filters.set(e,{field:e,type:"text",operator:t,value:r,valueTo:n}),this.applyFiltersInternal()}applyFiltersInternal(e){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const t=[...this.filters.values()];if(this.config.filterHandler){this.gridElement.setAttribute("aria-busy","true");const r=this.config.filterHandler(t,this.sourceRows),n=r=>{this.gridElement.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,e||(this.emit("filter-change",{filters:t,filteredRowCount:r.length,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.emitPluginEvent("filter-applied",{filters:t}),this.requestRender()};return void(r&&"function"==typeof r.then?r.then(n):n(r))}e||(this.emit("filter-change",{filters:t,filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.emitPluginEvent("filter-applied",{filters:t}),this.requestRender()}getColumnState(e){if(!this.config.trackColumnState)return;const t=this.filters.get(e);return t?{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}:void 0}applyColumnState(e,t){if(!this.config.trackColumnState)return;if(!t.filter)return void this.filters.delete(e);const r={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,r),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null}}export{e as BLANK_FILTER_VALUE,w as FilteringPlugin};
2
2
  //# sourceMappingURL=index.js.map