@toolbox-web/grid 1.16.1 → 1.18.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 (65) hide show
  1. package/README.md +126 -41
  2. package/all.js +1046 -936
  3. package/all.js.map +1 -1
  4. package/index.js +394 -369
  5. package/index.js.map +1 -1
  6. package/lib/core/grid.d.ts +13 -3
  7. package/lib/core/grid.d.ts.map +1 -1
  8. package/lib/core/internal/header.d.ts.map +1 -1
  9. package/lib/core/internal/keyboard.d.ts.map +1 -1
  10. package/lib/core/internal/shell.d.ts +11 -0
  11. package/lib/core/internal/shell.d.ts.map +1 -1
  12. package/lib/core/plugin/types.d.ts +1 -0
  13. package/lib/core/plugin/types.d.ts.map +1 -1
  14. package/lib/core/types.d.ts +42 -2
  15. package/lib/core/types.d.ts.map +1 -1
  16. package/lib/plugins/clipboard/index.js.map +1 -1
  17. package/lib/plugins/column-virtualization/index.js.map +1 -1
  18. package/lib/plugins/context-menu/index.js.map +1 -1
  19. package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
  20. package/lib/plugins/editing/index.js +155 -145
  21. package/lib/plugins/editing/index.js.map +1 -1
  22. package/lib/plugins/export/index.js.map +1 -1
  23. package/lib/plugins/filtering/FilteringPlugin.d.ts +31 -0
  24. package/lib/plugins/filtering/FilteringPlugin.d.ts.map +1 -1
  25. package/lib/plugins/filtering/filter-model.d.ts +30 -3
  26. package/lib/plugins/filtering/filter-model.d.ts.map +1 -1
  27. package/lib/plugins/filtering/index.d.ts +1 -0
  28. package/lib/plugins/filtering/index.d.ts.map +1 -1
  29. package/lib/plugins/filtering/index.js +471 -361
  30. package/lib/plugins/filtering/index.js.map +1 -1
  31. package/lib/plugins/filtering/types.d.ts +32 -0
  32. package/lib/plugins/filtering/types.d.ts.map +1 -1
  33. package/lib/plugins/grouping-columns/index.js.map +1 -1
  34. package/lib/plugins/grouping-rows/index.js.map +1 -1
  35. package/lib/plugins/master-detail/index.js.map +1 -1
  36. package/lib/plugins/multi-sort/MultiSortPlugin.d.ts +4 -0
  37. package/lib/plugins/multi-sort/MultiSortPlugin.d.ts.map +1 -1
  38. package/lib/plugins/multi-sort/index.js +57 -47
  39. package/lib/plugins/multi-sort/index.js.map +1 -1
  40. package/lib/plugins/pinned-columns/index.js.map +1 -1
  41. package/lib/plugins/pinned-rows/index.js.map +1 -1
  42. package/lib/plugins/pivot/index.js.map +1 -1
  43. package/lib/plugins/print/index.js.map +1 -1
  44. package/lib/plugins/reorder/index.js +81 -78
  45. package/lib/plugins/reorder/index.js.map +1 -1
  46. package/lib/plugins/responsive/index.js +58 -55
  47. package/lib/plugins/responsive/index.js.map +1 -1
  48. package/lib/plugins/row-reorder/index.js +5 -2
  49. package/lib/plugins/row-reorder/index.js.map +1 -1
  50. package/lib/plugins/selection/index.js.map +1 -1
  51. package/lib/plugins/server-side/index.js.map +1 -1
  52. package/lib/plugins/tree/index.js.map +1 -1
  53. package/lib/plugins/undo-redo/index.js.map +1 -1
  54. package/lib/plugins/visibility/index.js.map +1 -1
  55. package/package.json +1 -1
  56. package/umd/grid.all.umd.js +29 -29
  57. package/umd/grid.all.umd.js.map +1 -1
  58. package/umd/grid.umd.js +10 -10
  59. package/umd/grid.umd.js.map +1 -1
  60. package/umd/plugins/editing.umd.js +1 -1
  61. package/umd/plugins/editing.umd.js.map +1 -1
  62. package/umd/plugins/filtering.umd.js +1 -1
  63. package/umd/plugins/filtering.umd.js.map +1 -1
  64. package/umd/plugins/multi-sort.umd.js +1 -1
  65. package/umd/plugins/multi-sort.umd.js.map +1 -1
@@ -1,2 +1,2 @@
1
- (function(H,q){typeof exports=="object"&&typeof module<"u"?q(exports,require("../../core/internal/virtualization"),require("../../core/plugin/base-plugin"),require("../../core/plugin/expander-column")):typeof define=="function"&&define.amd?define(["exports","../../core/internal/virtualization","../../core/plugin/base-plugin","../../core/plugin/expander-column"],q):(H=typeof globalThis<"u"?globalThis:H||self,q(H.TbwGridPlugin_filtering={},H.TbwGrid,H.TbwGrid,H.TbwGrid))})(this,(function(H,q,Y,K){"use strict";function R(L){if(L instanceof Date)return L.getTime();const e=Number(L);return isNaN(e)?new Date(L).getTime():e}function $(L,e,t=!1){const r=L[e.field];if(e.operator==="blank")return r==null||r==="";if(e.operator==="notBlank")return r!=null&&r!=="";if(e.operator==="notIn")return r==null?!0:Array.isArray(e.value)&&!e.value.includes(r);if(e.operator==="in")return Array.isArray(e.value)&&e.value.includes(r);if(r==null)return!1;const n=String(r),i=t?n:n.toLowerCase(),s=t?String(e.value):String(e.value).toLowerCase();switch(e.operator){case"contains":return i.includes(s);case"notContains":return!i.includes(s);case"equals":return i===s;case"notEquals":return i!==s;case"startsWith":return i.startsWith(s);case"endsWith":return i.endsWith(s);case"lessThan":return R(r)<R(e.value);case"lessThanOrEqual":return R(r)<=R(e.value);case"greaterThan":return R(r)>R(e.value);case"greaterThanOrEqual":return R(r)>=R(e.value);case"between":return R(r)>=R(e.value)&&R(r)<=R(e.valueTo);default:return!0}}function j(L,e,t=!1){return e.length?L.filter(r=>e.every(n=>$(r,n,t))):L}function W(L){return JSON.stringify(L.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo})))}function G(L,e){const t=new Set;for(const r of L){const n=r[e];n!=null&&t.add(n)}return[...t].sort((r,n)=>typeof r=="number"&&typeof n=="number"?r-n:String(r).localeCompare(String(n)))}const U='@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}}',J="@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{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)}}";class z extends Y.BaseGridPlugin{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=U;get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return this.grid.effectiveConfig?.filterable!==!1}isColumnFilterable(e){return this.isFilteringEnabled()?e.filterable!==!1:!1}filters=new Map;cachedResult=null;cacheKey=null;cachedInputSpot=null;openPanelField=null;panelElement=null;panelAnchorElement=null;searchText=new Map;excludedValues=new Map;panelAbortController=null;globalStylesInjected=!1;static DEFAULT_LIST_ITEM_HEIGHT=28;static LIST_OVERSCAN=3;static LIST_BYPASS_THRESHOLD=50;getListItemHeight(){if(this.panelElement){const e=getComputedStyle(this.panelElement).getPropertyValue("--tbw-filter-item-height");if(e&&e.trim()){const t=parseFloat(e);if(!isNaN(t)&&t>0)return t}}return z.DEFAULT_LIST_ITEM_HEIGHT}syncExcludedValues(e,t){t?t.type==="set"&&t.operator==="notIn"&&Array.isArray(t.value)?this.excludedValues.set(e,new Set(t.value)):t.type==="set"&&this.excludedValues.delete(e):this.excludedValues.delete(e)}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(e.type==="getContextMenuItems"){const t=e.context;if(!t.isHeader)return;const r=t.column;if(!r?.field||!this.isFilteringEnabled()||!this.isColumnFilterable(r))return;const n=[],i=this.isFieldFiltered(r.field),s=this.filters.size>0;return i&&n.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),s&&n.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!s,action:()=>this.clearAllFilters()}),n.length>0?n: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 r=W(t),n={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},i=this.cachedInputSpot!=null&&n.len===this.cachedInputSpot.len&&n.first===this.cachedInputSpot.first&&n.mid===this.cachedInputSpot.mid&&n.last===this.cachedInputSpot.last;if(this.cacheKey===r&&this.cachedResult&&i)return this.cachedResult;const s=j([...e],t,this.config.caseSensitive);return this.cachedResult=s,this.cacheKey=r,this.cachedInputSpot=n,s}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(r=>{const n=r.getAttribute("data-col");if(n===null)return;const i=this.visibleColumns[parseInt(n,10)];if(!i||!this.isColumnFilterable(i)||K.isUtilityColumn(i))return;const s=i.field;if(!s)return;const b=this.filters.has(s);let l=r.querySelector(".tbw-filter-btn");if(l){const x=l.classList.contains("active");if(l.classList.toggle("active",b),r.classList.toggle("filtered",b),x!==b){const u=b?"filterActive":"filter";this.setIcon(l,this.resolveIcon(u))}return}l=document.createElement("button"),l.className="tbw-filter-btn",l.setAttribute("aria-label",`Filter ${i.header??s}`);const f=b?"filterActive":"filter";this.setIcon(l,this.resolveIcon(f)),b&&(l.classList.add("active"),r.classList.add("filtered")),l.addEventListener("click",x=>{x.stopPropagation(),this.toggleFilterPanel(s,i,l)});const k=r.querySelector(".resize-handle");k?r.insertBefore(l,k):r.appendChild(l)})}setFilter(e,t){if(t===null)this.filters.delete(e),this.syncExcludedValues(e,null);else{const r={...t,field:e};this.filters.set(e,r),this.syncExcludedValues(e,r)}this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0}),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){this.filters.clear(),this.excludedValues.clear();for(const t of e)this.filters.set(t.field,t),this.syncExcludedValues(t.field,t);this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0}),this.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}clearAllFilters(){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal()}clearFieldFilter(e){this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal()}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){return G(this.sourceRows,e)}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const n of t.classList)n.startsWith("tbw-")||n==="selecting"||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")){this.globalStylesInjected=!0;return}const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent=J,document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,r){if(this.openPanelField===e){this.closeFilterPanel();return}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){n.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(n),this.positionPanel(n,r),this.setupPanelCloseHandler(n,r),this.config.valuesHandler(e,t).then(s=>{this.openPanelField!==e||!this.panelElement||(n.innerHTML="",this.renderPanelContent(e,t,n,s))});return}const i=G(this.sourceRows,e);document.body.appendChild(n),this.positionPanel(n,r),this.renderPanelContent(e,t,n,i),this.setupPanelCloseHandler(n,r)}renderPanelContent(e,t,r,n){let i=this.excludedValues.get(e);i||(i=new Set,this.excludedValues.set(e,i));const s=this.searchText.get(e)??"",b={field:e,column:t,uniqueValues:n,excludedValues:i,searchText:s,applySetFilter:f=>{this.applySetFilter(e,f),this.closeFilterPanel()},applyTextFilter:(f,k,x)=>{this.applyTextFilter(e,f,k,x),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let l=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(r,b),l=r.children.length>0),!l&&t.type){const f=this.grid.effectiveConfig.typeDefaults?.[t.type];f?.filterPanelRenderer&&(f.filterPanelRenderer(r,b),l=r.children.length>0)}if(!l){const f=t.type;f==="number"?this.renderNumberFilterPanel(r,b,n):f==="date"?this.renderDateFilterPanel(r,b,n):this.renderDefaultFilterPanel(r,b,n,i)}}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 z.supportsAnchorPositioning===null&&(z.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),z.supportsAnchorPositioning}positionPanel(e,t){const n=t.closest(".cell")??t;if(n.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=n,z.checkAnchorPositioningSupport()){requestAnimationFrame(()=>{const s=e.getBoundingClientRect(),b=n.getBoundingClientRect();s.top<b.top&&e.classList.add("tbw-filter-panel-above")});return}const i=n.getBoundingClientRect();e.style.position="fixed",e.style.top=`${i.bottom+4}px`,e.style.left=`${i.left}px`,requestAnimationFrame(()=>{const s=e.getBoundingClientRect();s.right>window.innerWidth-8&&(e.style.left=`${i.right-s.width}px`),s.bottom>window.innerHeight-8&&(e.style.top=`${i.top-s.height-4}px`,e.classList.add("tbw-filter-panel-above"))})}renderDefaultFilterPanel(e,t,r,n){const{field:i}=t,s=this.getListItemHeight(),b=document.createElement("div");b.className="tbw-filter-search";const l=document.createElement("input");l.type="text",l.placeholder="Search...",l.className="tbw-filter-search-input",l.value=this.searchText.get(i)??"",b.appendChild(l),e.appendChild(b);const f=document.createElement("div");f.className="tbw-filter-actions";const k=document.createElement("label");k.className="tbw-filter-value-item",k.style.padding="0",k.style.margin="0";const x=document.createElement("input");x.type="checkbox",x.className="tbw-filter-checkbox";const u=document.createElement("span");u.textContent="Select All",k.appendChild(x),k.appendChild(u),f.appendChild(k);const y=()=>{const a=[...S.values()],h=a.every(o=>o),m=a.every(o=>!o);x.checked=h,x.indeterminate=!h&&!m};x.addEventListener("change",()=>{const a=x.checked;for(const h of S.keys())S.set(h,a);y(),M()}),e.appendChild(f);const F=document.createElement("div");F.className="tbw-filter-values";const w=document.createElement("div");w.className="tbw-filter-values-spacer",F.appendChild(w);const C=document.createElement("div");C.className="tbw-filter-values-content",F.appendChild(C);const S=new Map;r.forEach(a=>{const h=a==null?"__null__":String(a);S.set(h,!n.has(a))}),y();let T=[];const P=(a,h)=>{const m=a==null?"(Blank)":String(a),o=a==null?"__null__":String(a),c=document.createElement("label");c.className="tbw-filter-value-item",c.style.position="absolute",c.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${h})`,c.style.left="0",c.style.right="0",c.style.boxSizing="border-box";const g=document.createElement("input");g.type="checkbox",g.className="tbw-filter-checkbox",g.checked=S.get(o)??!0,g.dataset.value=o,g.addEventListener("change",()=>{S.set(o,g.checked),y()});const V=document.createElement("span");return V.textContent=m,c.appendChild(g),c.appendChild(V),c},M=()=>{const a=T.length,h=F.clientHeight,m=F.scrollTop;if(w.style.height=`${a*s}px`,q.shouldBypassVirtualization(a,z.LIST_BYPASS_THRESHOLD/3)){C.innerHTML="",C.style.transform="translateY(0px)",T.forEach((c,g)=>{C.appendChild(P(c,g))});return}const o=q.computeVirtualWindow({totalRows:a,viewportHeight:h,scrollTop:m,rowHeight:s,overscan:z.LIST_OVERSCAN});C.style.transform=`translateY(${o.offsetY}px)`,C.innerHTML="";for(let c=o.start;c<o.end;c++)C.appendChild(P(T[c],c-o.start))},E=a=>{const h=this.config.caseSensitive??!1,m=h?a:a.toLowerCase();if(T=r.filter(o=>{const c=o==null?"(Blank)":String(o),g=h?c:c.toLowerCase();return!a||g.includes(m)}),T.length===0){w.style.height="0px",C.innerHTML="";const o=document.createElement("div");o.className="tbw-filter-no-match",o.textContent="No matching values",C.appendChild(o);return}M()};F.addEventListener("scroll",()=>{T.length>0&&M()},{passive:!0}),E(l.value),e.appendChild(F);let N;l.addEventListener("input",()=>{clearTimeout(N),N=setTimeout(()=>{this.searchText.set(i,l.value),E(l.value)},this.config.debounceMs??150)});const I=document.createElement("div");I.className="tbw-filter-buttons";const A=document.createElement("button");A.className="tbw-filter-apply-btn",A.textContent="Apply",A.addEventListener("click",()=>{const a=[];for(const[h,m]of S)if(!m)if(h==="__null__")a.push(null);else{const o=r.find(c=>String(c)===h);a.push(o!==void 0?o:h)}t.applySetFilter(a)}),I.appendChild(A);const v=document.createElement("button");v.className="tbw-filter-clear-btn",v.textContent="Clear Filter",v.addEventListener("click",()=>{t.clearFilter()}),I.appendChild(v),e.appendChild(I)}renderNumberFilterPanel(e,t,r){const{field:n,column:i}=t,s=i.filterParams,b=i.editorParams,l=(p,B)=>{if(typeof p=="number")return p;if(typeof p=="string"){const _=parseFloat(p);return isNaN(_)?B:_}return B},f=r.filter(p=>typeof p=="number"&&!isNaN(p)),k=f.length>0?Math.min(...f):0,x=f.length>0?Math.max(...f):100,u=l(s?.min??b?.min,k),y=l(s?.max??b?.max,x),F=s?.step??b?.step??1,w=this.filters.get(n);let C=u,S=y;w?.operator==="between"?(C=l(w.value,u),S=l(w.valueTo,y)):w?.operator==="greaterThanOrEqual"?C=l(w.value,u):w?.operator==="lessThanOrEqual"&&(S=l(w.value,y));const T=document.createElement("div");T.className="tbw-filter-range-inputs";const P=document.createElement("div");P.className="tbw-filter-range-group";const M=document.createElement("label");M.textContent="Min",M.className="tbw-filter-range-label";const E=document.createElement("input");E.type="number",E.className="tbw-filter-range-input",E.min=String(u),E.max=String(y),E.step=String(F),E.value=String(C),P.appendChild(M),P.appendChild(E),T.appendChild(P);const N=document.createElement("span");N.className="tbw-filter-range-separator",N.textContent="–",T.appendChild(N);const I=document.createElement("div");I.className="tbw-filter-range-group";const A=document.createElement("label");A.textContent="Max",A.className="tbw-filter-range-label";const v=document.createElement("input");v.type="number",v.className="tbw-filter-range-input",v.min=String(u),v.max=String(y),v.step=String(F),v.value=String(S),I.appendChild(A),I.appendChild(v),T.appendChild(I),e.appendChild(T);const a=document.createElement("div");a.className="tbw-filter-range-slider";const h=document.createElement("div");h.className="tbw-filter-range-track";const m=document.createElement("div");m.className="tbw-filter-range-fill";const o=document.createElement("input");o.type="range",o.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",o.min=String(u),o.max=String(y),o.step=String(F),o.value=String(C);const c=document.createElement("input");c.type="range",c.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",c.min=String(u),c.max=String(y),c.step=String(F),c.value=String(S),a.appendChild(h),a.appendChild(m),a.appendChild(o),a.appendChild(c),e.appendChild(a);const g=()=>{const p=parseFloat(o.value),B=parseFloat(c.value),_=y-u,O=(p-u)/_*100,Q=(B-u)/_*100;m.style.left=`${O}%`,m.style.width=`${Q-O}%`};o.addEventListener("input",()=>{const p=Math.min(parseFloat(o.value),parseFloat(c.value));o.value=String(p),E.value=String(p),g()}),c.addEventListener("input",()=>{const p=Math.max(parseFloat(c.value),parseFloat(o.value));c.value=String(p),v.value=String(p),g()}),E.addEventListener("input",()=>{let p=parseFloat(E.value)||u;p=Math.max(u,Math.min(p,parseFloat(v.value))),o.value=String(p),g()}),v.addEventListener("input",()=>{let p=parseFloat(v.value)||y;p=Math.min(y,Math.max(p,parseFloat(E.value))),c.value=String(p),g()}),g();const V=document.createElement("div");V.className="tbw-filter-buttons";const D=document.createElement("button");D.className="tbw-filter-apply-btn",D.textContent="Apply",D.addEventListener("click",()=>{const p=parseFloat(E.value),B=parseFloat(v.value);t.applyTextFilter("between",p,B)}),V.appendChild(D);const d=document.createElement("button");d.className="tbw-filter-clear-btn",d.textContent="Clear Filter",d.addEventListener("click",()=>{t.clearFilter()}),V.appendChild(d),e.appendChild(V)}renderDateFilterPanel(e,t,r){const{field:n,column:i}=t,s=i.filterParams,b=i.editorParams,l=r.filter(d=>d instanceof Date||typeof d=="string"&&!isNaN(Date.parse(d))).map(d=>d instanceof Date?d:new Date(d)).filter(d=>!isNaN(d.getTime())),f=l.length>0?new Date(Math.min(...l.map(d=>d.getTime()))):null,k=l.length>0?new Date(Math.max(...l.map(d=>d.getTime()))):null,x=d=>d?d.toISOString().split("T")[0]:"",u=d=>d?typeof d=="string"?d:typeof d=="number"?x(new Date(d)):"":"",y=u(s?.min)||u(b?.min)||x(f),F=u(s?.max)||u(b?.max)||x(k),w=this.filters.get(n);let C="",S="";const T=w?.operator==="blank";w?.operator==="between"?(C=u(w.value)||"",S=u(w.valueTo)||""):w?.operator==="greaterThanOrEqual"?C=u(w.value)||"":w?.operator==="lessThanOrEqual"&&(S=u(w.value)||"");const P=document.createElement("div");P.className="tbw-filter-date-range";const M=document.createElement("div");M.className="tbw-filter-date-group";const E=document.createElement("label");E.textContent="From",E.className="tbw-filter-range-label";const N=document.createElement("input");N.type="date",N.className="tbw-filter-date-input",y&&(N.min=y),F&&(N.max=F),N.value=C,M.appendChild(E),M.appendChild(N),P.appendChild(M);const I=document.createElement("span");I.className="tbw-filter-range-separator",I.textContent="–",P.appendChild(I);const A=document.createElement("div");A.className="tbw-filter-date-group";const v=document.createElement("label");v.textContent="To",v.className="tbw-filter-range-label";const a=document.createElement("input");a.type="date",a.className="tbw-filter-date-input",y&&(a.min=y),F&&(a.max=F),a.value=S,A.appendChild(v),A.appendChild(a),P.appendChild(A),e.appendChild(P);const h=document.createElement("label");h.className="tbw-filter-blank-option";const m=document.createElement("input");m.type="checkbox",m.className="tbw-filter-blank-checkbox",m.checked=T;const o=document.createTextNode("Show only blank");h.appendChild(m),h.appendChild(o);const c=d=>{N.disabled=d,a.disabled=d,P.classList.toggle("tbw-filter-disabled",d)};c(T),m.addEventListener("change",()=>{c(m.checked)}),e.appendChild(h);const g=document.createElement("div");g.className="tbw-filter-buttons";const V=document.createElement("button");V.className="tbw-filter-apply-btn",V.textContent="Apply",V.addEventListener("click",()=>{if(m.checked){t.applyTextFilter("blank","");return}const d=N.value,p=a.value;d&&p?t.applyTextFilter("between",d,p):d?t.applyTextFilter("greaterThanOrEqual",d):p?t.applyTextFilter("lessThanOrEqual",p):t.clearFilter()}),g.appendChild(V);const D=document.createElement("button");D.className="tbw-filter-clear-btn",D.textContent="Clear Filter",D.addEventListener("click",()=>{t.clearFilter()}),g.appendChild(D),e.appendChild(g)}applySetFilter(e,t){this.excludedValues.set(e,new Set(t)),t.length===0?this.filters.delete(e):this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t}),this.applyFiltersInternal()}applyTextFilter(e,t,r,n){this.filters.set(e,{field:e,type:"text",operator:t,value:r,valueTo:n}),this.applyFiltersInternal()}applyFiltersInternal(){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const e=[...this.filters.values()];if(this.config.filterHandler){const t=this.grid;t.setAttribute("aria-busy","true");const r=this.config.filterHandler(e,this.sourceRows),n=i=>{t.removeAttribute("aria-busy"),this.cachedResult=i,this.grid.rows=i,this.emit("filter-change",{filters:e,filteredRowCount:i.length}),this.emitPluginEvent("filter-applied",{filters:e}),this.requestRender()};r&&typeof r.then=="function"?r.then(n):n(r);return}this.emit("filter-change",{filters:e,filteredRowCount:0}),this.emitPluginEvent("filter-applied",{filters:e}),this.requestRender()}getColumnState(e){const t=this.filters.get(e);if(t)return{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}}applyColumnState(e,t){if(!t.filter){this.filters.delete(e);return}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}}H.FilteringPlugin=z,Object.defineProperty(H,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(M,q){typeof exports=="object"&&typeof module<"u"?q(exports,require("../../core/internal/virtualization"),require("../../core/plugin/base-plugin"),require("../../core/plugin/expander-column")):typeof define=="function"&&define.amd?define(["exports","../../core/internal/virtualization","../../core/plugin/base-plugin","../../core/plugin/expander-column"],q):(M=typeof globalThis<"u"?globalThis:M||self,q(M.TbwGridPlugin_filtering={},M.TbwGrid,M.TbwGrid,M.TbwGrid))})(this,(function(M,q,U,$){"use strict";const _="(Blank)";function P(T){if(T instanceof Date)return T.getTime();const e=Number(T);return isNaN(e)?new Date(T).getTime():e}function j(T,e,t=!1,n){const r=T[e.field];if(e.operator==="blank")return r==null||r==="";if(e.operator==="notBlank")return r!=null&&r!=="";if(n&&(e.operator==="notIn"||e.operator==="in")){const l=n(r,T),u=Array.isArray(l)?l:l!=null?[l]:[];if(e.operator==="notIn"){const m=e.value;return Array.isArray(m)?u.length===0?!m.includes(_):!u.some(E=>m.includes(E)):!0}if(e.operator==="in"){const m=e.value;return Array.isArray(m)?u.length===0?m.includes(_):u.some(E=>m.includes(E)):!1}}if(e.operator==="notIn")return r==null?!0:Array.isArray(e.value)&&!e.value.includes(r);if(e.operator==="in")return Array.isArray(e.value)&&e.value.includes(r);if(r==null)return!1;const i=String(r),a=t?i:i.toLowerCase(),s=t?String(e.value):String(e.value).toLowerCase();switch(e.operator){case"contains":return a.includes(s);case"notContains":return!a.includes(s);case"equals":return a===s;case"notEquals":return a!==s;case"startsWith":return a.startsWith(s);case"endsWith":return a.endsWith(s);case"lessThan":return P(r)<P(e.value);case"lessThanOrEqual":return P(r)<=P(e.value);case"greaterThan":return P(r)>P(e.value);case"greaterThanOrEqual":return P(r)>=P(e.value);case"between":return P(r)>=P(e.value)&&P(r)<=P(e.valueTo);default:return!0}}function W(T,e,t=!1,n){return e.length?T.filter(r=>e.every(i=>j(r,i,t,n?.get(i.field)))):T}function J(T){return JSON.stringify(T.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo})))}function O(T,e,t){const n=new Set;let r=!1;for(const i of T){const a=i[e];if(t){const s=t(a,i);if(Array.isArray(s)){s.length===0&&(r=!0);for(const l of s)l!=null&&n.add(l)}else s!=null?n.add(s):r=!0}else a!=null&&n.add(a)}return t&&r&&n.add(_),[...n].sort((i,a)=>typeof i=="number"&&typeof a=="number"?i-a:String(i).localeCompare(String(a)))}function Y(T,e){const t=new Map;for(const{field:r,filterValue:i}of e)t.set(r,{values:new Set,hasBlank:!1,hasExtractor:!!i});for(const r of T)for(const{field:i,filterValue:a}of e){const s=t.get(i),l=r[i];if(a){const u=a(l,r);if(Array.isArray(u)){u.length===0&&(s.hasBlank=!0);for(const m of u)m!=null&&s.values.add(m)}else u!=null?s.values.add(u):s.hasBlank=!0}else l!=null&&s.values.add(l)}const n=new Map;for(const[r,{values:i,hasBlank:a,hasExtractor:s}]of t)s&&a&&i.add(_),n.set(r,[...i].sort((l,u)=>typeof l=="number"&&typeof u=="number"?l-u:String(l).localeCompare(String(u))));return n}const Q='@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}}',X="@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{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)}}";class z extends U.BaseGridPlugin{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=Q;get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return this.grid.effectiveConfig?.filterable!==!1}isColumnFilterable(e){return this.isFilteringEnabled()?e.filterable!==!1:!1}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const n of e)n.field&&n.filterValue&&(t||(t=new Map),t.set(n.field,n.filterValue));return t}filters=new Map;cachedResult=null;cacheKey=null;cachedInputSpot=null;openPanelField=null;panelElement=null;panelAnchorElement=null;searchText=new Map;excludedValues=new Map;panelAbortController=null;globalStylesInjected=!1;static DEFAULT_LIST_ITEM_HEIGHT=28;static LIST_OVERSCAN=3;static LIST_BYPASS_THRESHOLD=50;getListItemHeight(){if(this.panelElement){const e=getComputedStyle(this.panelElement).getPropertyValue("--tbw-filter-item-height");if(e&&e.trim()){const t=parseFloat(e);if(!isNaN(t)&&t>0)return t}}return z.DEFAULT_LIST_ITEM_HEIGHT}computeSelected(){const e=[];for(const[r,i]of this.filters){if(i.type!=="set"||i.operator!=="notIn")continue;const a=this.grid.effectiveConfig?.columns?.find(s=>s.field===r);e.push({field:r,filterValue:a?.filterValue})}if(e.length===0)return{};const t=Y(this.sourceRows,e),n={};for(const{field:r}of e){const i=this.excludedValues.get(r),a=t.get(r)??[];n[r]=i?a.filter(s=>!i.has(s)):a}return n}syncExcludedValues(e,t){t?t.type==="set"&&t.operator==="notIn"&&Array.isArray(t.value)?this.excludedValues.set(e,new Set(t.value)):t.type==="set"&&this.excludedValues.delete(e):this.excludedValues.delete(e)}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(e.type==="getContextMenuItems"){const t=e.context;if(!t.isHeader)return;const n=t.column;if(!n?.field||!this.isFilteringEnabled()||!this.isColumnFilterable(n))return;const r=[],i=this.isFieldFiltered(n.field),a=this.filters.size>0;return i&&r.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(n.field)}),a&&r.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!a,action:()=>this.clearAllFilters()}),r.length>0?r: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 n=J(t),r={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},i=this.cachedInputSpot!=null&&r.len===this.cachedInputSpot.len&&r.first===this.cachedInputSpot.first&&r.mid===this.cachedInputSpot.mid&&r.last===this.cachedInputSpot.last;if(this.cacheKey===n&&this.cachedResult&&i)return this.cachedResult;const a=W([...e],t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=a,this.cacheKey=n,this.cachedInputSpot=r,a}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(n=>{const r=n.getAttribute("data-col");if(r===null)return;const i=this.visibleColumns[parseInt(r,10)];if(!i||!this.isColumnFilterable(i)||$.isUtilityColumn(i))return;const a=i.field;if(!a)return;const s=this.filters.has(a);let l=n.querySelector(".tbw-filter-btn");if(l){const E=l.classList.contains("active");if(l.classList.toggle("active",s),n.classList.toggle("filtered",s),E!==s){const h=s?"filterActive":"filter";this.setIcon(l,this.resolveIcon(h))}return}l=document.createElement("button"),l.className="tbw-filter-btn",l.setAttribute("aria-label",`Filter ${i.header??a}`);const u=s?"filterActive":"filter";this.setIcon(l,this.resolveIcon(u)),s&&(l.classList.add("active"),n.classList.add("filtered")),l.addEventListener("click",E=>{E.stopPropagation(),this.toggleFilterPanel(a,i,l)});const m=n.querySelector(".resize-handle");m?n.insertBefore(l,m):n.appendChild(l)})}setFilter(e,t){if(t===null)this.filters.delete(e),this.syncExcludedValues(e,null);else{const n={...t,field:e};this.filters.set(e,n),this.syncExcludedValues(e,n)}this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),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){this.filters.clear(),this.excludedValues.clear();for(const t of e)this.filters.set(t.field,t),this.syncExcludedValues(t.field,t);this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}clearAllFilters(){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal()}clearFieldFilter(e){this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal()}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const n=this.grid.effectiveConfig?.columns?.find(r=>r.field===e)?.filterValue;return O(this.sourceRows,e,n)}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const r of t.classList)r.startsWith("tbw-")||r==="selecting"||e.classList.add(r);const n=t.dataset.theme;n&&(e.dataset.theme=n)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles")){this.globalStylesInjected=!0;return}const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent=X,document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,n){if(this.openPanelField===e){this.closeFilterPanel();return}this.closeFilterPanel();const r=document.createElement("div");if(r.className="tbw-filter-panel",this.copyGridThemeContext(r),this.isAnimationEnabled&&r.classList.add("tbw-filter-panel-animated"),this.panelElement=r,this.openPanelField=e,this.config.valuesHandler){r.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(r),this.positionPanel(r,n),this.setupPanelCloseHandler(r,n),this.config.valuesHandler(e,t).then(a=>{this.openPanelField!==e||!this.panelElement||(r.innerHTML="",this.renderPanelContent(e,t,r,a))});return}const i=O(this.sourceRows,e,t.filterValue);document.body.appendChild(r),this.positionPanel(r,n),this.renderPanelContent(e,t,r,i),this.setupPanelCloseHandler(r,n)}renderPanelContent(e,t,n,r){let i=this.excludedValues.get(e);i||(i=new Set,this.excludedValues.set(e,i));const a=this.searchText.get(e)??"",s={field:e,column:t,uniqueValues:r,excludedValues:i,searchText:a,applySetFilter:u=>{this.applySetFilter(e,u),this.closeFilterPanel()},applyTextFilter:(u,m,E)=>{this.applyTextFilter(e,u,m,E),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let l=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(n,s),l=n.children.length>0),!l&&t.type){const u=this.grid.effectiveConfig.typeDefaults?.[t.type];u?.filterPanelRenderer&&(u.filterPanelRenderer(n,s),l=n.children.length>0)}if(!l){const u=t.type;u==="number"?this.renderNumberFilterPanel(n,s,r):u==="date"?this.renderDateFilterPanel(n,s,r):this.renderDefaultFilterPanel(n,s,r,i)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController,setTimeout(()=>{document.addEventListener("click",n=>{!e.contains(n.target)&&n.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 z.supportsAnchorPositioning===null&&(z.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),z.supportsAnchorPositioning}positionPanel(e,t){const r=t.closest(".cell")??t;if(r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r,z.checkAnchorPositioningSupport()){requestAnimationFrame(()=>{const a=e.getBoundingClientRect(),s=r.getBoundingClientRect();a.top<s.top&&e.classList.add("tbw-filter-panel-above")});return}const i=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${i.bottom+4}px`,e.style.left=`${i.left}px`,requestAnimationFrame(()=>{const a=e.getBoundingClientRect();a.right>window.innerWidth-8&&(e.style.left=`${i.right-a.width}px`),a.bottom>window.innerHeight-8&&(e.style.top=`${i.top-a.height-4}px`,e.classList.add("tbw-filter-panel-above"))})}renderDefaultFilterPanel(e,t,n,r){const{field:i,column:a}=t,s=this.getListItemHeight(),l=o=>{if(o==null)return"(Blank)";if(a.format&&!a.filterValue){const d=a.format(o,void 0);if(d)return d}return String(o)};n=n.slice().sort((o,d)=>l(o).localeCompare(l(d)));const u=document.createElement("div");u.className="tbw-filter-search";const m=document.createElement("input");m.type="text",m.placeholder="Search...",m.className="tbw-filter-search-input",m.value=this.searchText.get(i)??"",u.appendChild(m),e.appendChild(u);const E=document.createElement("div");E.className="tbw-filter-actions";const h=document.createElement("label");h.className="tbw-filter-value-item",h.style.padding="0",h.style.margin="0";const w=document.createElement("input");w.type="checkbox",w.className="tbw-filter-checkbox";const R=document.createElement("span");R.textContent="Select All",h.appendChild(w),h.appendChild(R),E.appendChild(h);const y=()=>{const o=[...F.values()],d=o.every(p=>p),g=o.every(p=>!p);w.checked=d,w.indeterminate=!d&&!g};w.addEventListener("change",()=>{const o=w.checked;for(const d of F.keys())F.set(d,o);y(),A()}),e.appendChild(E);const N=document.createElement("div");N.className="tbw-filter-values";const I=document.createElement("div");I.className="tbw-filter-values-spacer",N.appendChild(I);const S=document.createElement("div");S.className="tbw-filter-values-content",N.appendChild(S);const F=new Map;n.forEach(o=>{const d=o==null?"__null__":String(o);F.set(d,!r.has(o))}),y();let L=[];const k=(o,d)=>{const g=l(o),p=o==null?"__null__":String(o),f=document.createElement("label");f.className="tbw-filter-value-item",f.style.position="absolute",f.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${d})`,f.style.left="0",f.style.right="0",f.style.boxSizing="border-box";const x=document.createElement("input");x.type="checkbox",x.className="tbw-filter-checkbox",x.checked=F.get(p)??!0,x.dataset.value=p,x.addEventListener("change",()=>{F.set(p,x.checked),y()});const c=document.createElement("span");return c.textContent=g,f.appendChild(x),f.appendChild(c),f},A=()=>{const o=L.length,d=N.clientHeight,g=N.scrollTop;if(I.style.height=`${o*s}px`,q.shouldBypassVirtualization(o,z.LIST_BYPASS_THRESHOLD/3)){S.innerHTML="",S.style.transform="translateY(0px)",L.forEach((f,x)=>{S.appendChild(k(f,x))});return}const p=q.computeVirtualWindow({totalRows:o,viewportHeight:d,scrollTop:g,rowHeight:s,overscan:z.LIST_OVERSCAN});S.style.transform=`translateY(${p.offsetY}px)`,S.innerHTML="";for(let f=p.start;f<p.end;f++)S.appendChild(k(L[f],f-p.start))},B=o=>{const d=this.config.caseSensitive??!1,g=d?o:o.toLowerCase();if(L=n.filter(p=>{const f=l(p),x=d?f:f.toLowerCase();return!o||x.includes(g)}),L.length===0){I.style.height="0px",S.innerHTML="";const p=document.createElement("div");p.className="tbw-filter-no-match",p.textContent="No matching values",S.appendChild(p);return}A()};N.addEventListener("scroll",()=>{L.length>0&&A()},{passive:!0}),B(m.value),e.appendChild(N);let H;m.addEventListener("input",()=>{clearTimeout(H),H=setTimeout(()=>{this.searchText.set(i,m.value),B(m.value)},this.config.debounceMs??150)});const v=document.createElement("div");v.className="tbw-filter-buttons";const C=document.createElement("button");C.className="tbw-filter-apply-btn",C.textContent="Apply",C.addEventListener("click",()=>{const o=[];for(const[d,g]of F)if(!g)if(d==="__null__")o.push(null);else{const p=n.find(f=>String(f)===d);o.push(p!==void 0?p:d)}t.applySetFilter(o)}),v.appendChild(C);const V=document.createElement("button");V.className="tbw-filter-clear-btn",V.textContent="Clear Filter",V.addEventListener("click",()=>{t.clearFilter()}),v.appendChild(V),e.appendChild(v)}renderNumberFilterPanel(e,t,n){const{field:r,column:i}=t,a=i.filterParams,s=i.editorParams,l=(b,D)=>{if(typeof b=="number")return b;if(typeof b=="string"){const G=parseFloat(b);return isNaN(G)?D:G}return D},u=n.filter(b=>typeof b=="number"&&!isNaN(b)),m=u.length>0?Math.min(...u):0,E=u.length>0?Math.max(...u):100,h=l(a?.min??s?.min,m),w=l(a?.max??s?.max,E),R=a?.step??s?.step??1,y=this.filters.get(r);let N=h,I=w;y?.operator==="between"?(N=l(y.value,h),I=l(y.valueTo,w)):y?.operator==="greaterThanOrEqual"?N=l(y.value,h):y?.operator==="lessThanOrEqual"&&(I=l(y.value,w));const S=document.createElement("div");S.className="tbw-filter-range-inputs";const F=document.createElement("div");F.className="tbw-filter-range-group";const L=document.createElement("label");L.textContent="Min",L.className="tbw-filter-range-label";const k=document.createElement("input");k.type="number",k.className="tbw-filter-range-input",k.min=String(h),k.max=String(w),k.step=String(R),k.value=String(N),F.appendChild(L),F.appendChild(k),S.appendChild(F);const A=document.createElement("span");A.className="tbw-filter-range-separator",A.textContent="–",S.appendChild(A);const B=document.createElement("div");B.className="tbw-filter-range-group";const H=document.createElement("label");H.textContent="Max",H.className="tbw-filter-range-label";const v=document.createElement("input");v.type="number",v.className="tbw-filter-range-input",v.min=String(h),v.max=String(w),v.step=String(R),v.value=String(I),B.appendChild(H),B.appendChild(v),S.appendChild(B),e.appendChild(S);const C=document.createElement("div");C.className="tbw-filter-range-slider";const V=document.createElement("div");V.className="tbw-filter-range-track";const o=document.createElement("div");o.className="tbw-filter-range-fill";const d=document.createElement("input");d.type="range",d.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",d.min=String(h),d.max=String(w),d.step=String(R),d.value=String(N);const g=document.createElement("input");g.type="range",g.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",g.min=String(h),g.max=String(w),g.step=String(R),g.value=String(I),C.appendChild(V),C.appendChild(o),C.appendChild(d),C.appendChild(g),e.appendChild(C);const p=()=>{const b=parseFloat(d.value),D=parseFloat(g.value),G=w-h,K=(b-h)/G*100,Z=(D-h)/G*100;o.style.left=`${K}%`,o.style.width=`${Z-K}%`};d.addEventListener("input",()=>{const b=Math.min(parseFloat(d.value),parseFloat(g.value));d.value=String(b),k.value=String(b),p()}),g.addEventListener("input",()=>{const b=Math.max(parseFloat(g.value),parseFloat(d.value));g.value=String(b),v.value=String(b),p()}),k.addEventListener("input",()=>{let b=parseFloat(k.value)||h;b=Math.max(h,Math.min(b,parseFloat(v.value))),d.value=String(b),p()}),v.addEventListener("input",()=>{let b=parseFloat(v.value)||w;b=Math.min(w,Math.max(b,parseFloat(k.value))),g.value=String(b),p()}),p();const f=document.createElement("div");f.className="tbw-filter-buttons";const x=document.createElement("button");x.className="tbw-filter-apply-btn",x.textContent="Apply",x.addEventListener("click",()=>{const b=parseFloat(k.value),D=parseFloat(v.value);t.applyTextFilter("between",b,D)}),f.appendChild(x);const c=document.createElement("button");c.className="tbw-filter-clear-btn",c.textContent="Clear Filter",c.addEventListener("click",()=>{t.clearFilter()}),f.appendChild(c),e.appendChild(f)}renderDateFilterPanel(e,t,n){const{field:r,column:i}=t,a=i.filterParams,s=i.editorParams,l=n.filter(c=>c instanceof Date||typeof c=="string"&&!isNaN(Date.parse(c))).map(c=>c instanceof Date?c:new Date(c)).filter(c=>!isNaN(c.getTime())),u=l.length>0?new Date(Math.min(...l.map(c=>c.getTime()))):null,m=l.length>0?new Date(Math.max(...l.map(c=>c.getTime()))):null,E=c=>c?c.toISOString().split("T")[0]:"",h=c=>c?typeof c=="string"?c:typeof c=="number"?E(new Date(c)):"":"",w=h(a?.min)||h(s?.min)||E(u),R=h(a?.max)||h(s?.max)||E(m),y=this.filters.get(r);let N="",I="";const S=y?.operator==="blank";y?.operator==="between"?(N=h(y.value)||"",I=h(y.valueTo)||""):y?.operator==="greaterThanOrEqual"?N=h(y.value)||"":y?.operator==="lessThanOrEqual"&&(I=h(y.value)||"");const F=document.createElement("div");F.className="tbw-filter-date-range";const L=document.createElement("div");L.className="tbw-filter-date-group";const k=document.createElement("label");k.textContent="From",k.className="tbw-filter-range-label";const A=document.createElement("input");A.type="date",A.className="tbw-filter-date-input",w&&(A.min=w),R&&(A.max=R),A.value=N,L.appendChild(k),L.appendChild(A),F.appendChild(L);const B=document.createElement("span");B.className="tbw-filter-range-separator",B.textContent="–",F.appendChild(B);const H=document.createElement("div");H.className="tbw-filter-date-group";const v=document.createElement("label");v.textContent="To",v.className="tbw-filter-range-label";const C=document.createElement("input");C.type="date",C.className="tbw-filter-date-input",w&&(C.min=w),R&&(C.max=R),C.value=I,H.appendChild(v),H.appendChild(C),F.appendChild(H),e.appendChild(F);const V=document.createElement("label");V.className="tbw-filter-blank-option";const o=document.createElement("input");o.type="checkbox",o.className="tbw-filter-blank-checkbox",o.checked=S;const d=document.createTextNode("Show only blank");V.appendChild(o),V.appendChild(d);const g=c=>{A.disabled=c,C.disabled=c,F.classList.toggle("tbw-filter-disabled",c)};g(S),o.addEventListener("change",()=>{g(o.checked)}),e.appendChild(V);const p=document.createElement("div");p.className="tbw-filter-buttons";const f=document.createElement("button");f.className="tbw-filter-apply-btn",f.textContent="Apply",f.addEventListener("click",()=>{if(o.checked){t.applyTextFilter("blank","");return}const c=A.value,b=C.value;c&&b?t.applyTextFilter("between",c,b):c?t.applyTextFilter("greaterThanOrEqual",c):b?t.applyTextFilter("lessThanOrEqual",b):t.clearFilter()}),p.appendChild(f);const x=document.createElement("button");x.className="tbw-filter-clear-btn",x.textContent="Clear Filter",x.addEventListener("click",()=>{t.clearFilter()}),p.appendChild(x),e.appendChild(p)}applySetFilter(e,t){this.excludedValues.set(e,new Set(t)),t.length===0?this.filters.delete(e):this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t}),this.applyFiltersInternal()}applyTextFilter(e,t,n,r){this.filters.set(e,{field:e,type:"text",operator:t,value:n,valueTo:r}),this.applyFiltersInternal()}applyFiltersInternal(){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const e=[...this.filters.values()];if(this.config.filterHandler){const t=this.grid;t.setAttribute("aria-busy","true");const n=this.config.filterHandler(e,this.sourceRows),r=i=>{t.removeAttribute("aria-busy"),this.cachedResult=i,this.grid.rows=i,this.emit("filter-change",{filters:e,filteredRowCount:i.length,selected:this.computeSelected()}),this.emitPluginEvent("filter-applied",{filters:e}),this.requestRender()};n&&typeof n.then=="function"?n.then(r):r(n);return}this.emit("filter-change",{filters:e,filteredRowCount:0,selected:this.computeSelected()}),this.emitPluginEvent("filter-applied",{filters:e}),this.requestRender()}getColumnState(e){const t=this.filters.get(e);if(t)return{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}}applyColumnState(e,t){if(!t.filter){this.filters.delete(e);return}const n={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,n),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null}}M.BLANK_FILTER_VALUE=_,M.FilteringPlugin=z,M.getUniqueValuesBatch=Y,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=filtering.umd.js.map