@toolbox-web/grid 1.22.1 → 1.23.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.
- package/README.md +20 -10
- package/all.js +2 -2
- package/all.js.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/grid.d.ts +88 -1
- package/lib/core/grid.d.ts.map +1 -1
- package/lib/core/types.d.ts +61 -0
- package/lib/core/types.d.ts.map +1 -1
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/editing/EditingPlugin.d.ts +132 -1
- package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
- package/lib/plugins/editing/editors.d.ts.map +1 -1
- package/lib/plugins/editing/index.d.ts +1 -0
- package/lib/plugins/editing/index.d.ts.map +1 -1
- package/lib/plugins/editing/index.js +1 -1
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/editing/internal/dirty-tracking.d.ts +90 -0
- package/lib/plugins/editing/internal/dirty-tracking.d.ts.map +1 -0
- package/lib/plugins/editing/types.d.ts +82 -0
- package/lib/plugins/editing/types.d.ts.map +1 -1
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/FilteringPlugin.d.ts +17 -4
- package/lib/plugins/filtering/FilteringPlugin.d.ts.map +1 -1
- package/lib/plugins/filtering/index.js +1 -1
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/reorder/index.js.map +1 -1
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/row-reorder/index.js.map +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts +52 -7
- package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts.map +1 -1
- package/lib/plugins/undo-redo/history.d.ts +11 -4
- package/lib/plugins/undo-redo/history.d.ts.map +1 -1
- package/lib/plugins/undo-redo/index.d.ts +1 -1
- package/lib/plugins/undo-redo/index.d.ts.map +1 -1
- package/lib/plugins/undo-redo/index.js +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/undo-redo/types.d.ts +20 -3
- package/lib/plugins/undo-redo/types.d.ts.map +1 -1
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/public.d.ts +1 -1
- package/public.d.ts.map +1 -1
- package/umd/grid.all.umd.js +1 -1
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +1 -1
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/editing.umd.js +1 -1
- package/umd/plugins/editing.umd.js.map +1 -1
- package/umd/plugins/filtering.umd.js +1 -1
- package/umd/plugins/filtering.umd.js.map +1 -1
- package/umd/plugins/undo-redo.umd.js +1 -1
- package/umd/plugins/undo-redo.umd.js.map +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("../../core/internal/virtualization"),require("../../core/plugin/base-plugin"),require("../../core/plugin/expander-column")):"function"==typeof define&&define.amd?define(["exports","../../core/internal/virtualization","../../core/plugin/base-plugin","../../core/plugin/expander-column"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TbwGridPlugin_filtering={},e.TbwGrid,e.TbwGrid,e.TbwGrid)}(this,function(e,t,r,l){"use strict";const i="(Blank)";function n(e){if(e instanceof Date)return e.getTime();const t=Number(e);if(!isNaN(t))return t;return new Date(e).getTime()}function a(e,t,r=!1,l){return t.length?e.filter(e=>t.every(t=>function(e,t,r=!1,l){const a=e[t.field];if("blank"===t.operator)return null==a||""===a;if("notBlank"===t.operator)return null!=a&&""!==a;if(l&&("notIn"===t.operator||"in"===t.operator)){const r=l(a,e),n=Array.isArray(r)?r:null!=r?[r]:[];if("notIn"===t.operator){const e=t.value;return!Array.isArray(e)||(0===n.length?!e.includes(i):!n.some(t=>e.includes(t)))}if("in"===t.operator){const e=t.value;return!!Array.isArray(e)&&(0===n.length?e.includes(i):n.some(t=>e.includes(t)))}}if("notIn"===t.operator)return null==a||""===a?!Array.isArray(t.value)||!t.value.includes(i):Array.isArray(t.value)&&!t.value.includes(a);if("in"===t.operator)return null==a||""===a?Array.isArray(t.value)&&t.value.includes(i):Array.isArray(t.value)&&t.value.includes(a);if(null==a)return!1;const s=String(a),o=r?s:s.toLowerCase(),c=r?String(t.value):String(t.value).toLowerCase();switch(t.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 n(a)<n(t.value);case"lessThanOrEqual":return n(a)<=n(t.value);case"greaterThan":return n(a)>n(t.value);case"greaterThanOrEqual":return n(a)>=n(t.value);case"between":return n(a)>=n(t.value)&&n(a)<=n(t.valueTo);default:return!0}}(e,t,r,l?.get(t.field)))):e}function s(e,t,r){const l=new Set;let n=!1;for(const i of e){const e=i[t];if(r){const t=r(e,i);if(Array.isArray(t)){0===t.length&&(n=!0);for(const e of t)null!=e&&l.add(e)}else null!=t?l.add(t):n=!0}else null!=e&&""!==e?l.add(e):n=!0}return n&&l.add(i),[...l].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}function o(e,t){const r=new Map;for(const{field:i,filterValue:n}of t)r.set(i,{values:new Set,hasBlank:!1,hasExtractor:!!n});for(const i of e)for(const{field:e,filterValue:l}of t){const t=r.get(e),n=i[e];if(l){const e=l(n,i);if(Array.isArray(e)){0===e.length&&(t.hasBlank=!0);for(const r of e)null!=r&&t.values.add(r)}else null!=e?t.values.add(e):t.hasBlank=!0}else null!=n&&""!==n?t.values.add(n):t.hasBlank=!0}const l=new Map;for(const[n,{values:a,hasBlank:s}]of r)s&&a.add(i),l.set(n,[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return l}class c extends r.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='@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=new Map),t.set(r.field,r.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 c.DEFAULT_LIST_ITEM_HEIGHT}computeSelected(){const e=[];for(const[l,i]of this.filters){if("set"!==i.type||"notIn"!==i.operator)continue;const t=this.grid.effectiveConfig?.columns?.find(e=>e.field===l);e.push({field:l,filterValue:t?.filterValue})}if(0===e.length)return{};const t=o(this.sourceRows,e),r={};for(const{field:l}of e){const e=this.excludedValues.get(l),i=t.get(l)??[];r[l]=e?i.filter(t=>!e.has(t)):i}return r}syncExcludedValues(e,t){t?"set"===t.type&&"notIn"===t.operator&&Array.isArray(t.value)?this.excludedValues.set(e,new Set(t.value)):"set"===t.type&&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("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 l=[],i=this.isFieldFiltered(r.field),n=this.filters.size>0;return i&&l.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),n&&l.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!n,action:()=>this.clearAllFilters()}),l.length>0?l: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=(l=t,JSON.stringify(l.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var l;const i={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},n=null!=this.cachedInputSpot&&i.len===this.cachedInputSpot.len&&i.first===this.cachedInputSpot.first&&i.mid===this.cachedInputSpot.mid&&i.last===this.cachedInputSpot.last;if(this.cacheKey===r&&this.cachedResult&&n)return this.cachedResult;const s=a([...e],t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=s,this.cacheKey=r,this.cachedInputSpot=i,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(l.isUtilityColumn(r))return;const i=r.field;if(!i)return;const n=this.filters.has(i);let a=e.querySelector(".tbw-filter-btn");if(a){const t=a.classList.contains("active");if(a.classList.toggle("active",n),e.classList.toggle("filtered",n),t!==n){const e=n?"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=n?"filterActive":"filter";this.setIcon(a,this.resolveIcon(s)),n&&(a.classList.add("active"),e.classList.add("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){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)}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 t=this.grid.effectiveConfig?.columns?.find(t=>t.field===e),r=t?.filterValue;return s(this.sourceRows,e,r)}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const l of t.classList)l.startsWith("tbw-")||"selecting"===l||e.classList.add(l);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 l=document.createElement("div");if(l.className="tbw-filter-panel",this.copyGridThemeContext(l),this.isAnimationEnabled&&l.classList.add("tbw-filter-panel-animated"),this.panelElement=l,this.openPanelField=e,this.config.valuesHandler)return l.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(l),this.positionPanel(l,r),this.setupPanelCloseHandler(l,r),void this.config.valuesHandler(e,t).then(r=>{this.openPanelField===e&&this.panelElement&&(l.innerHTML="",this.renderPanelContent(e,t,l,r))});const i=s(this.sourceRows,e,t.filterValue);document.body.appendChild(l),this.positionPanel(l,r),this.renderPanelContent(e,t,l,i),this.setupPanelCloseHandler(l,r)}renderPanelContent(e,t,r,l){let i=this.excludedValues.get(e);i||(i=new Set,this.excludedValues.set(e,i));const n=this.searchText.get(e)??"",a={field:e,column:t,uniqueValues:l,excludedValues:i,searchText:n,currentFilter:this.filters.get(e),applySetFilter:(t,r)=>{this.applySetFilter(e,t,r),this.closeFilterPanel()},applyTextFilter:(t,r,l)=>{this.applyTextFilter(e,t,r,l),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let s=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(r,a),s=r.children.length>0),!s&&t.type){const e=this.grid.effectiveConfig.typeDefaults?.[t.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(r,a),s=r.children.length>0)}if(!s){const e=t.type;"number"===e?this.renderNumberFilterPanel(r,a,l):"date"===e?this.renderDateFilterPanel(r,a,l):this.renderDefaultFilterPanel(r,a,l,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 null===c.supportsAnchorPositioning&&(c.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),c.supportsAnchorPositioning}positionPanel(e,t){const r=t.closest(".cell")??t;if(r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r,c.checkAnchorPositioningSupport())return void requestAnimationFrame(()=>{const t=e.getBoundingClientRect(),l=r.getBoundingClientRect();t.top<l.top&&e.classList.add("tbw-filter-panel-above")});const l=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${l.bottom+4}px`,e.style.left=`${l.left}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();t.right>window.innerWidth-8&&(e.style.left=l.right-t.width+"px"),t.bottom>window.innerHeight-8&&(e.style.top=l.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}renderDefaultFilterPanel(e,r,l,i){const{field:n,column:a}=r,s=this.getListItemHeight(),o=e=>{if(null==e)return"(Blank)";if(a.format&&!a.filterValue){const t=a.format(e,void 0);if(t)return t}return String(e)};l=l.slice().sort((e,t)=>o(e).localeCompare(o(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=this.searchText.get(n)??"",d.appendChild(u),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-actions";const b=document.createElement("label");b.className="tbw-filter-value-item",b.style.padding="0",b.style.margin="0";const f=document.createElement("input");f.type="checkbox",f.className="tbw-filter-checkbox";const h=document.createElement("span");h.textContent="Select All",b.appendChild(f),b.appendChild(h),p.appendChild(b);const m=()=>{const e=[...x.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 x.keys())x.set(t,e);m(),E()}),e.appendChild(p);const g=document.createElement("div");g.className="tbw-filter-values";const v=document.createElement("div");v.className="tbw-filter-values-spacer",g.appendChild(v);const w=document.createElement("div");w.className="tbw-filter-values-content",g.appendChild(w);const x=new Map;l.forEach(e=>{const t=null==e?"__null__":String(e);x.set(t,!i.has(e))}),m();let y=[];const C=(e,t)=>{const r=o(e),l=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 n=document.createElement("input");n.type="checkbox",n.className="tbw-filter-checkbox",n.checked=x.get(l)??!0,n.dataset.value=l,n.addEventListener("change",()=>{x.set(l,n.checked),m()});const a=document.createElement("span");return a.textContent=r,i.appendChild(n),i.appendChild(a),i},E=()=>{const e=y.length,r=g.clientHeight,l=g.scrollTop;if(v.style.height=e*s+"px",t.shouldBypassVirtualization(e,c.LIST_BYPASS_THRESHOLD/3))return w.innerHTML="",w.style.transform="translateY(0px)",void y.forEach((e,t)=>{w.appendChild(C(e,t))});const i=t.computeVirtualWindow({totalRows:e,viewportHeight:r,scrollTop:l,rowHeight:s,overscan:c.LIST_OVERSCAN});w.style.transform=`translateY(${i.offsetY}px)`,w.innerHTML="";for(let t=i.start;t<i.end;t++)w.appendChild(C(y[t],t-i.start))},F=e=>{const t=this.config.caseSensitive??!1,r=t?e:e.toLowerCase();if(y=l.filter(l=>{const i=o(l),n=t?i:i.toLowerCase();return!e||n.includes(r)}),0===y.length){v.style.height="0px",w.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent="No matching values",void w.appendChild(e)}E()};let S;g.addEventListener("scroll",()=>{y.length>0&&E()},{passive:!0}),F(u.value),e.appendChild(g),u.addEventListener("input",()=>{clearTimeout(S),S=setTimeout(()=>{this.searchText.set(n,u.value),F(u.value)},this.config.debounceMs??150)});const k=document.createElement("div");k.className="tbw-filter-buttons";const T=document.createElement("button");T.className="tbw-filter-apply-btn",T.textContent="Apply",T.addEventListener("click",()=>{const e=[];for(const[t,r]of x)if(!r)if("__null__"===t)e.push(null);else{const r=l.find(e=>String(e)===t);e.push(void 0!==r?r:t)}r.applySetFilter(e)}),k.appendChild(T);const N=document.createElement("button");N.className="tbw-filter-clear-btn",N.textContent="Clear Filter",N.addEventListener("click",()=>{r.clearFilter()}),k.appendChild(N),e.appendChild(k)}renderNumberFilterPanel(e,t,r){const{field:l,column:i}=t,n=i.filterParams,a=i.editorParams,s=(e,t)=>{if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t},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=s(n?.min??a?.min,c),p=s(n?.max??a?.max,d),b=n?.step??a?.step??1,f=this.filters.get(l);let h=u,m=p;const g="blank"===f?.operator;"between"===f?.operator?(h=s(f.value,u),m=s(f.valueTo,p)):"greaterThanOrEqual"===f?.operator?h=s(f.value,u):"lessThanOrEqual"===f?.operator&&(m=s(f.value,p));const v=document.createElement("div");v.className="tbw-filter-range-inputs";const w=document.createElement("div");w.className="tbw-filter-range-group";const x=document.createElement("label");x.textContent="Min",x.className="tbw-filter-range-label";const y=document.createElement("input");y.type="number",y.className="tbw-filter-range-input",y.min=String(u),y.max=String(p),y.step=String(b),y.value=String(h),w.appendChild(x),w.appendChild(y),v.appendChild(w);const C=document.createElement("span");C.className="tbw-filter-range-separator",C.textContent="–",v.appendChild(C);const E=document.createElement("div");E.className="tbw-filter-range-group";const F=document.createElement("label");F.textContent="Max",F.className="tbw-filter-range-label";const S=document.createElement("input");S.type="number",S.className="tbw-filter-range-input",S.min=String(u),S.max=String(p),S.step=String(b),S.value=String(m),E.appendChild(F),E.appendChild(S),v.appendChild(E),e.appendChild(v);const k=document.createElement("div");k.className="tbw-filter-range-slider";const T=document.createElement("div");T.className="tbw-filter-range-track";const N=document.createElement("div");N.className="tbw-filter-range-fill";const A=document.createElement("input");A.type="range",A.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",A.min=String(u),A.max=String(p),A.step=String(b),A.value=String(h);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(b),P.value=String(m),k.appendChild(T),k.appendChild(N),k.appendChild(A),k.appendChild(P),e.appendChild(k);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=g;const R=document.createTextNode("Blank");L.appendChild(I),L.appendChild(R);const V=e=>{y.disabled=e,S.disabled=e,A.disabled=e,P.disabled=e,v.classList.toggle("tbw-filter-disabled",e),k.classList.toggle("tbw-filter-disabled",e)};V(g),I.addEventListener("change",()=>{V(I.checked)}),e.appendChild(L);const M=()=>{const e=parseFloat(A.value),t=parseFloat(P.value),r=p-u,l=(e-u)/r*100,i=(t-u)/r*100;N.style.left=`${l}%`,N.style.width=i-l+"%"};A.addEventListener("input",()=>{const e=Math.min(parseFloat(A.value),parseFloat(P.value));A.value=String(e),y.value=String(e),M()}),P.addEventListener("input",()=>{const e=Math.max(parseFloat(P.value),parseFloat(A.value));P.value=String(e),S.value=String(e),M()}),y.addEventListener("input",()=>{let e=parseFloat(y.value)||u;e=Math.max(u,Math.min(e,parseFloat(S.value))),A.value=String(e),M()}),S.addEventListener("input",()=>{let e=parseFloat(S.value)||p;e=Math.min(p,Math.max(e,parseFloat(y.value))),P.value=String(e),M()}),M();const q=document.createElement("div");q.className="tbw-filter-buttons";const H=document.createElement("button");H.className="tbw-filter-apply-btn",H.textContent="Apply",H.addEventListener("click",()=>{if(I.checked)return void t.applyTextFilter("blank","");const e=parseFloat(y.value),r=parseFloat(S.value);t.applyTextFilter("between",e,r)}),q.appendChild(H);const z=document.createElement("button");z.className="tbw-filter-clear-btn",z.textContent="Clear Filter",z.addEventListener("click",()=>{t.clearFilter()}),q.appendChild(z),e.appendChild(q)}renderDateFilterPanel(e,t,r){const{field:l,column:i}=t,n=i.filterParams,a=i.editorParams,s=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())),o=s.length>0?new Date(Math.min(...s.map(e=>e.getTime()))):null,c=s.length>0?new Date(Math.max(...s.map(e=>e.getTime()))):null,d=e=>e?e.toISOString().split("T")[0]:"",u=e=>e?"string"==typeof e?e:"number"==typeof e?d(new Date(e)):"":"",p=u(n?.min)||u(a?.min)||d(o),b=u(n?.max)||u(a?.max)||d(c),f=this.filters.get(l);let h="",m="";const g="blank"===f?.operator;"between"===f?.operator?(h=u(f.value)||"",m=u(f.valueTo)||""):"greaterThanOrEqual"===f?.operator?h=u(f.value)||"":"lessThanOrEqual"===f?.operator&&(m=u(f.value)||"");const v=document.createElement("div");v.className="tbw-filter-date-range";const w=document.createElement("div");w.className="tbw-filter-date-group";const x=document.createElement("label");x.textContent="From",x.className="tbw-filter-range-label";const y=document.createElement("input");y.type="date",y.className="tbw-filter-date-input",p&&(y.min=p),b&&(y.max=b),y.value=h,w.appendChild(x),w.appendChild(y),v.appendChild(w);const C=document.createElement("span");C.className="tbw-filter-range-separator",C.textContent="–",v.appendChild(C);const E=document.createElement("div");E.className="tbw-filter-date-group";const F=document.createElement("label");F.textContent="To",F.className="tbw-filter-range-label";const S=document.createElement("input");S.type="date",S.className="tbw-filter-date-input",p&&(S.min=p),b&&(S.max=b),S.value=m,E.appendChild(F),E.appendChild(S),v.appendChild(E),e.appendChild(v);const k=document.createElement("label");k.className="tbw-filter-blank-option";const T=document.createElement("input");T.type="checkbox",T.className="tbw-filter-blank-checkbox",T.checked=g;const N=document.createTextNode("Show only blank");k.appendChild(T),k.appendChild(N);const A=e=>{y.disabled=e,S.disabled=e,v.classList.toggle("tbw-filter-disabled",e)};A(g),T.addEventListener("change",()=>{A(T.checked)}),e.appendChild(k);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(T.checked)return void t.applyTextFilter("blank","");const e=y.value,r=S.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)}applySetFilter(e,t,r){this.excludedValues.set(e,new Set(t)),0===t.length?this.filters.delete(e):this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==r&&{valueTo:r}}),this.applyFiltersInternal()}applyTextFilter(e,t,r,l){this.filters.set(e,{field:e,type:"text",operator:t,value:r,valueTo:l}),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),l=r=>{t.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,this.emit("filter-change",{filters:e,filteredRowCount:r.length,selected:this.computeSelected()}),this.emitPluginEvent("filter-applied",{filters:e}),this.requestRender()};return void(r&&"function"==typeof r.then?r.then(l):l(r))}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)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}}e.BLANK_FILTER_VALUE=i,e.FilteringPlugin=c,e.getUniqueValuesBatch=o,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("../../core/internal/virtualization"),require("../../core/plugin/base-plugin"),require("../../core/plugin/expander-column")):"function"==typeof define&&define.amd?define(["exports","../../core/internal/virtualization","../../core/plugin/base-plugin","../../core/plugin/expander-column"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TbwGridPlugin_filtering={},e.TbwGrid,e.TbwGrid,e.TbwGrid)}(this,function(e,t,r,l){"use strict";const i="(Blank)";function n(e){if(e instanceof Date)return e.getTime();const t=Number(e);if(!isNaN(t))return t;return new Date(e).getTime()}function a(e,t,r=!1,l){return t.length?e.filter(e=>t.every(t=>function(e,t,r=!1,l){const a=e[t.field];if("blank"===t.operator)return null==a||""===a;if("notBlank"===t.operator)return null!=a&&""!==a;if(l&&("notIn"===t.operator||"in"===t.operator)){const r=l(a,e),n=Array.isArray(r)?r:null!=r?[r]:[];if("notIn"===t.operator){const e=t.value;return!Array.isArray(e)||(0===n.length?!e.includes(i):!n.some(t=>e.includes(t)))}if("in"===t.operator){const e=t.value;return!!Array.isArray(e)&&(0===n.length?e.includes(i):n.some(t=>e.includes(t)))}}if("notIn"===t.operator)return null==a||""===a?!Array.isArray(t.value)||!t.value.includes(i):Array.isArray(t.value)&&!t.value.includes(a);if("in"===t.operator)return null==a||""===a?Array.isArray(t.value)&&t.value.includes(i):Array.isArray(t.value)&&t.value.includes(a);if(null==a)return!1;const s=String(a),o=r?s:s.toLowerCase(),c=r?String(t.value):String(t.value).toLowerCase();switch(t.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 n(a)<n(t.value);case"lessThanOrEqual":return n(a)<=n(t.value);case"greaterThan":return n(a)>n(t.value);case"greaterThanOrEqual":return n(a)>=n(t.value);case"between":return n(a)>=n(t.value)&&n(a)<=n(t.valueTo);default:return!0}}(e,t,r,l?.get(t.field)))):e}function s(e,t,r){const l=new Set;let n=!1;for(const i of e){const e=i[t];if(r){const t=r(e,i);if(Array.isArray(t)){0===t.length&&(n=!0);for(const e of t)null!=e&&l.add(e)}else null!=t?l.add(t):n=!0}else null!=e&&""!==e?l.add(e):n=!0}return n&&l.add(i),[...l].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}function o(e,t){const r=new Map;for(const{field:i,filterValue:n}of t)r.set(i,{values:new Set,hasBlank:!1,hasExtractor:!!n});for(const i of e)for(const{field:e,filterValue:l}of t){const t=r.get(e),n=i[e];if(l){const e=l(n,i);if(Array.isArray(e)){0===e.length&&(t.hasBlank=!0);for(const r of e)null!=r&&t.values.add(r)}else null!=e?t.values.add(e):t.hasBlank=!0}else null!=n&&""!==n?t.values.add(n):t.hasBlank=!0}const l=new Map;for(const[n,{values:a,hasBlank:s}]of r)s&&a.add(i),l.set(n,[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return l}class c extends r.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='@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=new Map),t.set(r.field,r.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 c.DEFAULT_LIST_ITEM_HEIGHT}computeSelected(){const e=[];for(const[l,i]of this.filters){if("set"!==i.type||"notIn"!==i.operator)continue;const t=this.grid.effectiveConfig?.columns?.find(e=>e.field===l);e.push({field:l,filterValue:t?.filterValue})}if(0===e.length)return{};const t=o(this.sourceRows,e),r={};for(const{field:l}of e){const e=this.excludedValues.get(l),i=t.get(l)??[];r[l]=e?i.filter(t=>!e.has(t)):i}return r}syncExcludedValues(e,t){t?"set"===t.type&&"notIn"===t.operator&&Array.isArray(t.value)?this.excludedValues.set(e,new Set(t.value)):"set"===t.type&&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("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 l=[],i=this.isFieldFiltered(r.field),n=this.filters.size>0;return i&&l.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),n&&l.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!n,action:()=>this.clearAllFilters()}),l.length>0?l: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=(l=t,JSON.stringify(l.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var l;const i={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},n=null!=this.cachedInputSpot&&i.len===this.cachedInputSpot.len&&i.first===this.cachedInputSpot.first&&i.mid===this.cachedInputSpot.mid&&i.last===this.cachedInputSpot.last;if(this.cacheKey===r&&this.cachedResult&&n)return this.cachedResult;const s=a([...e],t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=s,this.cacheKey=r,this.cachedInputSpot=i,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(l.isUtilityColumn(r))return;const i=r.field;if(!i)return;const n=this.filters.has(i);let a=e.querySelector(".tbw-filter-btn");if(a){const t=a.classList.contains("active");if(a.classList.toggle("active",n),e.classList.toggle("filtered",n),t!==n){const e=n?"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=n?"filterActive":"filter";this.setIcon(a,this.resolveIcon(s)),n&&(a.classList.add("active"),e.classList.add("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)}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.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.emitPluginEvent("filter-applied",{filters:[...this.filters.values()]}),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent)}clearFieldFilter(e,t){this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent)}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 s(this.sourceRows,e,r)}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const l of t.classList)l.startsWith("tbw-")||"selecting"===l||e.classList.add(l);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 l=document.createElement("div");if(l.className="tbw-filter-panel",this.copyGridThemeContext(l),this.isAnimationEnabled&&l.classList.add("tbw-filter-panel-animated"),this.panelElement=l,this.openPanelField=e,this.config.valuesHandler)return l.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(l),this.positionPanel(l,r),this.setupPanelCloseHandler(l,r),void this.config.valuesHandler(e,t).then(r=>{this.openPanelField===e&&this.panelElement&&(l.innerHTML="",this.renderPanelContent(e,t,l,r))});const i=s(this.sourceRows,e,t.filterValue);document.body.appendChild(l),this.positionPanel(l,r),this.renderPanelContent(e,t,l,i),this.setupPanelCloseHandler(l,r)}renderPanelContent(e,t,r,l){let i=this.excludedValues.get(e);i||(i=new Set,this.excludedValues.set(e,i));const n=this.searchText.get(e)??"",a={field:e,column:t,uniqueValues:l,excludedValues:i,searchText:n,currentFilter:this.filters.get(e),applySetFilter:(t,r)=>{this.applySetFilter(e,t,r),this.closeFilterPanel()},applyTextFilter:(t,r,l)=>{this.applyTextFilter(e,t,r,l),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let s=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(r,a),s=r.children.length>0),!s&&t.type){const e=this.grid.effectiveConfig.typeDefaults?.[t.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(r,a),s=r.children.length>0)}if(!s){const e=t.type;"number"===e?this.renderNumberFilterPanel(r,a,l):"date"===e?this.renderDateFilterPanel(r,a,l):this.renderDefaultFilterPanel(r,a,l,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 null===c.supportsAnchorPositioning&&(c.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),c.supportsAnchorPositioning}positionPanel(e,t){const r=t.closest(".cell")??t;if(r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r,c.checkAnchorPositioningSupport())return void requestAnimationFrame(()=>{const t=e.getBoundingClientRect(),l=r.getBoundingClientRect();t.top<l.top&&e.classList.add("tbw-filter-panel-above")});const l=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${l.bottom+4}px`,e.style.left=`${l.left}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();t.right>window.innerWidth-8&&(e.style.left=l.right-t.width+"px"),t.bottom>window.innerHeight-8&&(e.style.top=l.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}renderDefaultFilterPanel(e,r,l,i){const{field:n,column:a}=r,s=this.getListItemHeight(),o=e=>{if(null==e)return"(Blank)";if(a.format&&!a.filterValue){const t=a.format(e,void 0);if(t)return t}return String(e)};l=l.slice().sort((e,t)=>o(e).localeCompare(o(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=this.searchText.get(n)??"",d.appendChild(u),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-actions";const b=document.createElement("label");b.className="tbw-filter-value-item",b.style.padding="0",b.style.margin="0";const f=document.createElement("input");f.type="checkbox",f.className="tbw-filter-checkbox";const h=document.createElement("span");h.textContent="Select All",b.appendChild(f),b.appendChild(h),p.appendChild(b);const m=()=>{const e=[...x.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 x.keys())x.set(t,e);m(),E()}),e.appendChild(p);const g=document.createElement("div");g.className="tbw-filter-values";const v=document.createElement("div");v.className="tbw-filter-values-spacer",g.appendChild(v);const w=document.createElement("div");w.className="tbw-filter-values-content",g.appendChild(w);const x=new Map;l.forEach(e=>{const t=null==e?"__null__":String(e);x.set(t,!i.has(e))}),m();let y=[];const C=(e,t)=>{const r=o(e),l=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 n=document.createElement("input");n.type="checkbox",n.className="tbw-filter-checkbox",n.checked=x.get(l)??!0,n.dataset.value=l,n.addEventListener("change",()=>{x.set(l,n.checked),m()});const a=document.createElement("span");return a.textContent=r,i.appendChild(n),i.appendChild(a),i},E=()=>{const e=y.length,r=g.clientHeight,l=g.scrollTop;if(v.style.height=e*s+"px",t.shouldBypassVirtualization(e,c.LIST_BYPASS_THRESHOLD/3))return w.innerHTML="",w.style.transform="translateY(0px)",void y.forEach((e,t)=>{w.appendChild(C(e,t))});const i=t.computeVirtualWindow({totalRows:e,viewportHeight:r,scrollTop:l,rowHeight:s,overscan:c.LIST_OVERSCAN});w.style.transform=`translateY(${i.offsetY}px)`,w.innerHTML="";for(let t=i.start;t<i.end;t++)w.appendChild(C(y[t],t-i.start))},F=e=>{const t=this.config.caseSensitive??!1,r=t?e:e.toLowerCase();if(y=l.filter(l=>{const i=o(l),n=t?i:i.toLowerCase();return!e||n.includes(r)}),0===y.length){v.style.height="0px",w.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent="No matching values",void w.appendChild(e)}E()};let S;g.addEventListener("scroll",()=>{y.length>0&&E()},{passive:!0}),F(u.value),e.appendChild(g),u.addEventListener("input",()=>{clearTimeout(S),S=setTimeout(()=>{this.searchText.set(n,u.value),F(u.value)},this.config.debounceMs??150)});const k=document.createElement("div");k.className="tbw-filter-buttons";const T=document.createElement("button");T.className="tbw-filter-apply-btn",T.textContent="Apply",T.addEventListener("click",()=>{const e=[];for(const[t,r]of x)if(!r)if("__null__"===t)e.push(null);else{const r=l.find(e=>String(e)===t);e.push(void 0!==r?r:t)}r.applySetFilter(e)}),k.appendChild(T);const N=document.createElement("button");N.className="tbw-filter-clear-btn",N.textContent="Clear Filter",N.addEventListener("click",()=>{r.clearFilter()}),k.appendChild(N),e.appendChild(k)}renderNumberFilterPanel(e,t,r){const{field:l,column:i}=t,n=i.filterParams,a=i.editorParams,s=(e,t)=>{if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t},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=s(n?.min??a?.min,c),p=s(n?.max??a?.max,d),b=n?.step??a?.step??1,f=this.filters.get(l);let h=u,m=p;const g="blank"===f?.operator;"between"===f?.operator?(h=s(f.value,u),m=s(f.valueTo,p)):"greaterThanOrEqual"===f?.operator?h=s(f.value,u):"lessThanOrEqual"===f?.operator&&(m=s(f.value,p));const v=document.createElement("div");v.className="tbw-filter-range-inputs";const w=document.createElement("div");w.className="tbw-filter-range-group";const x=document.createElement("label");x.textContent="Min",x.className="tbw-filter-range-label";const y=document.createElement("input");y.type="number",y.className="tbw-filter-range-input",y.min=String(u),y.max=String(p),y.step=String(b),y.value=String(h),w.appendChild(x),w.appendChild(y),v.appendChild(w);const C=document.createElement("span");C.className="tbw-filter-range-separator",C.textContent="–",v.appendChild(C);const E=document.createElement("div");E.className="tbw-filter-range-group";const F=document.createElement("label");F.textContent="Max",F.className="tbw-filter-range-label";const S=document.createElement("input");S.type="number",S.className="tbw-filter-range-input",S.min=String(u),S.max=String(p),S.step=String(b),S.value=String(m),E.appendChild(F),E.appendChild(S),v.appendChild(E),e.appendChild(v);const k=document.createElement("div");k.className="tbw-filter-range-slider";const T=document.createElement("div");T.className="tbw-filter-range-track";const N=document.createElement("div");N.className="tbw-filter-range-fill";const A=document.createElement("input");A.type="range",A.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",A.min=String(u),A.max=String(p),A.step=String(b),A.value=String(h);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(b),P.value=String(m),k.appendChild(T),k.appendChild(N),k.appendChild(A),k.appendChild(P),e.appendChild(k);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=g;const R=document.createTextNode("Blank");L.appendChild(I),L.appendChild(R);const V=e=>{y.disabled=e,S.disabled=e,A.disabled=e,P.disabled=e,v.classList.toggle("tbw-filter-disabled",e),k.classList.toggle("tbw-filter-disabled",e)};V(g),I.addEventListener("change",()=>{V(I.checked)}),e.appendChild(L);const M=()=>{const e=parseFloat(A.value),t=parseFloat(P.value),r=p-u,l=(e-u)/r*100,i=(t-u)/r*100;N.style.left=`${l}%`,N.style.width=i-l+"%"};A.addEventListener("input",()=>{const e=Math.min(parseFloat(A.value),parseFloat(P.value));A.value=String(e),y.value=String(e),M()}),P.addEventListener("input",()=>{const e=Math.max(parseFloat(P.value),parseFloat(A.value));P.value=String(e),S.value=String(e),M()}),y.addEventListener("input",()=>{let e=parseFloat(y.value)||u;e=Math.max(u,Math.min(e,parseFloat(S.value))),A.value=String(e),M()}),S.addEventListener("input",()=>{let e=parseFloat(S.value)||p;e=Math.min(p,Math.max(e,parseFloat(y.value))),P.value=String(e),M()}),M();const q=document.createElement("div");q.className="tbw-filter-buttons";const H=document.createElement("button");H.className="tbw-filter-apply-btn",H.textContent="Apply",H.addEventListener("click",()=>{if(I.checked)return void t.applyTextFilter("blank","");const e=parseFloat(y.value),r=parseFloat(S.value);t.applyTextFilter("between",e,r)}),q.appendChild(H);const z=document.createElement("button");z.className="tbw-filter-clear-btn",z.textContent="Clear Filter",z.addEventListener("click",()=>{t.clearFilter()}),q.appendChild(z),e.appendChild(q)}renderDateFilterPanel(e,t,r){const{field:l,column:i}=t,n=i.filterParams,a=i.editorParams,s=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())),o=s.length>0?new Date(Math.min(...s.map(e=>e.getTime()))):null,c=s.length>0?new Date(Math.max(...s.map(e=>e.getTime()))):null,d=e=>e?e.toISOString().split("T")[0]:"",u=e=>e?"string"==typeof e?e:"number"==typeof e?d(new Date(e)):"":"",p=u(n?.min)||u(a?.min)||d(o),b=u(n?.max)||u(a?.max)||d(c),f=this.filters.get(l);let h="",m="";const g="blank"===f?.operator;"between"===f?.operator?(h=u(f.value)||"",m=u(f.valueTo)||""):"greaterThanOrEqual"===f?.operator?h=u(f.value)||"":"lessThanOrEqual"===f?.operator&&(m=u(f.value)||"");const v=document.createElement("div");v.className="tbw-filter-date-range";const w=document.createElement("div");w.className="tbw-filter-date-group";const x=document.createElement("label");x.textContent="From",x.className="tbw-filter-range-label";const y=document.createElement("input");y.type="date",y.className="tbw-filter-date-input",p&&(y.min=p),b&&(y.max=b),y.value=h,w.appendChild(x),w.appendChild(y),v.appendChild(w);const C=document.createElement("span");C.className="tbw-filter-range-separator",C.textContent="–",v.appendChild(C);const E=document.createElement("div");E.className="tbw-filter-date-group";const F=document.createElement("label");F.textContent="To",F.className="tbw-filter-range-label";const S=document.createElement("input");S.type="date",S.className="tbw-filter-date-input",p&&(S.min=p),b&&(S.max=b),S.value=m,E.appendChild(F),E.appendChild(S),v.appendChild(E),e.appendChild(v);const k=document.createElement("label");k.className="tbw-filter-blank-option";const T=document.createElement("input");T.type="checkbox",T.className="tbw-filter-blank-checkbox",T.checked=g;const N=document.createTextNode("Show only blank");k.appendChild(T),k.appendChild(N);const A=e=>{y.disabled=e,S.disabled=e,v.classList.toggle("tbw-filter-disabled",e)};A(g),T.addEventListener("change",()=>{A(T.checked)}),e.appendChild(k);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(T.checked)return void t.applyTextFilter("blank","");const e=y.value,r=S.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)}applySetFilter(e,t,r){this.excludedValues.set(e,new Set(t)),0===t.length?this.filters.delete(e):this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==r&&{valueTo:r}}),this.applyFiltersInternal()}applyTextFilter(e,t,r,l){this.filters.set(e,{field:e,type:"text",operator:t,value:r,valueTo:l}),this.applyFiltersInternal()}applyFiltersInternal(e){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const t=[...this.filters.values()];if(this.config.filterHandler){const r=this.grid;r.setAttribute("aria-busy","true");const l=this.config.filterHandler(t,this.sourceRows),i=l=>{r.removeAttribute("aria-busy"),this.cachedResult=l,this.grid.rows=l,e||this.emit("filter-change",{filters:t,filteredRowCount:l.length,selected:this.computeSelected()}),this.emitPluginEvent("filter-applied",{filters:t}),this.requestRender()};return void(l&&"function"==typeof l.then?l.then(i):i(l))}e||this.emit("filter-change",{filters:t,filteredRowCount:0,selected:this.computeSelected()}),this.emitPluginEvent("filter-applied",{filters:t}),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)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}}e.BLANK_FILTER_VALUE=i,e.FilteringPlugin=c,e.getUniqueValuesBatch=o,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=filtering.umd.js.map
|