@toolbox-web/grid 3.9.2 → 3.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/all.js +1 -1
- package/all.js.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/types.d.ts +6 -3
- package/lib/features/clipboard.js.map +1 -1
- package/lib/features/column-virtualization.js.map +1 -1
- package/lib/features/context-menu.js.map +1 -1
- package/lib/features/editing.js.map +1 -1
- package/lib/features/export.js.map +1 -1
- package/lib/features/filtering.js.map +1 -1
- package/lib/features/grouping-columns.js.map +1 -1
- package/lib/features/grouping-rows.js.map +1 -1
- package/lib/features/master-detail.js.map +1 -1
- package/lib/features/multi-sort.js.map +1 -1
- package/lib/features/pinned-columns.js.map +1 -1
- package/lib/features/pinned-rows.js.map +1 -1
- package/lib/features/pivot.js.map +1 -1
- package/lib/features/print.js.map +1 -1
- package/lib/features/registry.js +1 -1
- package/lib/features/registry.js.map +1 -1
- package/lib/features/reorder-columns.js.map +1 -1
- package/lib/features/responsive.js.map +1 -1
- package/lib/features/row-drag-drop.js.map +1 -1
- package/lib/features/selection.js.map +1 -1
- package/lib/features/server-side.js.map +1 -1
- package/lib/features/shell.js.map +1 -1
- package/lib/features/sticky-rows.js.map +1 -1
- package/lib/features/tooltip.js.map +1 -1
- package/lib/features/tree.js.map +1 -1
- package/lib/features/undo-redo.js.map +1 -1
- package/lib/features/visibility.js.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/editors.d.ts +15 -0
- package/lib/plugins/editing/index.js +1 -1
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/editing/internal/helpers.d.ts +23 -0
- package/lib/plugins/editing/types.d.ts +16 -1
- package/lib/plugins/export/index.js +1 -1
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/filter-model.d.ts +20 -1
- package/lib/plugins/filtering/filter-panel-default.d.ts +15 -1
- package/lib/plugins/filtering/index.d.ts +1 -1
- package/lib/plugins/filtering/index.js +1 -1
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/filtering/types.d.ts +58 -3
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/index.js +1 -1
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/hierarchy/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/master-detail/master-detail-plugin.d.ts +6 -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 +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/pivot/pivot-plugin.d.ts +2 -0
- package/lib/plugins/pivot/types.d.ts +2 -0
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/reorder-columns/index.js.map +1 -1
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/row-drag-drop/index.js.map +1 -1
- package/lib/plugins/selection/index.js +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/shared/form-field-target.d.ts +10 -0
- package/lib/plugins/shared/format-value.d.ts +12 -0
- package/lib/plugins/shared/structural-toggle.d.ts +14 -0
- package/lib/plugins/shell/index.js.map +1 -1
- package/lib/plugins/sticky-rows/index.js.map +1 -1
- package/lib/plugins/tooltip/index.js.map +1 -1
- package/lib/plugins/tree/index.js +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/index.d.ts +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 -2
- package/lib/plugins/undo-redo/undo-redo-plugin.d.ts +8 -0
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/umd/grid.all.umd.js +1 -1
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +1 -1
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/clipboard.umd.js.map +1 -1
- package/umd/plugins/column-virtualization.umd.js.map +1 -1
- package/umd/plugins/context-menu.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/export.umd.js +1 -1
- package/umd/plugins/export.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/grouping-columns.umd.js.map +1 -1
- package/umd/plugins/grouping-rows.umd.js +1 -1
- package/umd/plugins/grouping-rows.umd.js.map +1 -1
- package/umd/plugins/hierarchy.umd.js.map +1 -1
- package/umd/plugins/master-detail.umd.js +1 -1
- package/umd/plugins/master-detail.umd.js.map +1 -1
- package/umd/plugins/multi-sort.umd.js.map +1 -1
- package/umd/plugins/pinned-columns.umd.js.map +1 -1
- package/umd/plugins/pinned-rows.umd.js.map +1 -1
- package/umd/plugins/pivot.umd.js +1 -1
- package/umd/plugins/pivot.umd.js.map +1 -1
- package/umd/plugins/print.umd.js.map +1 -1
- package/umd/plugins/reorder-columns.umd.js.map +1 -1
- package/umd/plugins/responsive.umd.js.map +1 -1
- package/umd/plugins/row-drag-drop.umd.js.map +1 -1
- package/umd/plugins/selection.umd.js +1 -1
- package/umd/plugins/selection.umd.js.map +1 -1
- package/umd/plugins/server-side.umd.js.map +1 -1
- package/umd/plugins/shell.umd.js.map +1 -1
- package/umd/plugins/sticky-rows.umd.js.map +1 -1
- package/umd/plugins/tooltip.umd.js.map +1 -1
- package/umd/plugins/tree.umd.js +1 -1
- package/umd/plugins/tree.umd.js.map +1 -1
- package/umd/plugins/undo-redo.umd.js +1 -1
- package/umd/plugins/undo-redo.umd.js.map +1 -1
- package/umd/plugins/visibility.umd.js.map +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{BaseGridPlugin as e,DEFAULT_A11Y_MESSAGES as t,createFieldReader as r,isPlainField as n,resolveCellValue as i}from"@toolbox-web/grid";var l="(Blank)";function a(e){return null==e||""===e||"number"==typeof e&&isNaN(e)}function o(e){if("number"==typeof e)return e;if(e instanceof Date)return e.getTime();const t=Number(e);return isNaN(t)?new Date(e).getTime():t}function s(e,t,i){const s=e.field,c=r(s),d=i?e=>i(c(e),e):c;return function(e,t){if("blank"===e.operator)return e=>{const r=t(e);return null==r||""===r||"number"==typeof r&&isNaN(r)};if("notBlank"===e.operator)return e=>{const r=t(e);return null!=r&&""!==r&&!("number"==typeof r&&isNaN(r))}}(e,d)??function(e,t,r){const n=e.operator;if("in"!==n&&"notIn"!==n)return;const i="notIn"===n;if(!Array.isArray(e.value))return i?()=>!0:()=>!1;const a=new Set(e.value);return r?e=>{const n=r(t(e),e),o=Array.isArray(n)?n:null!=n?[n]:[],s=0===o.length?a.has(l):o.some(e=>a.has(e));return i?!s:s}:e=>{const r=t(e),n=null==r||""===r?a.has(l):a.has(r);return i?!n:n}}(e,c,i)??function(e,t,r,i){const l=e.operator,s="number"===e.type&&i,c=s&&n(t)?t:null;if("greaterThan"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r>t}:s?e=>{const n=r(e);return!a(n)&&n>t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i>t}}if("greaterThanOrEqual"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r>=t}:s?e=>{const n=r(e);return!a(n)&&n>=t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i>=t}}if("lessThan"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r<t}:s?e=>{const n=r(e);return!a(n)&&n<t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i<t}}if("lessThanOrEqual"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r<=t}:s?e=>{const n=r(e);return!a(n)&&n<=t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i<=t}}if("between"===l){const t=o(e.value),n=o(e.valueTo);return c?e=>{const r=e[c];if(a(r))return!1;return r>=t&&r<=n}:s?e=>{const i=r(e);if(a(i))return!1;return i>=t&&i<=n}:e=>{const i=r(e);if(a(i))return!1;const l=o(i);return!isNaN(l)&&l>=t&&l<=n}}}(e,s,d,void 0===i)??function(e,t,r){const n=e.operator,i=t?String(e.value):String(e.value).toLowerCase();if("contains"===n)return t?e=>{const t=r(e);return null!=t&&String(t).includes(i)}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase().includes(i)};if("notContains"===n)return t?e=>{const t=r(e);return null!=t&&!String(t).includes(i)}:e=>{const t=r(e);return null!=t&&!String(t).toLowerCase().includes(i)};if("equals"===n)return t?e=>{const t=r(e);return null!=t&&String(t)===i}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase()===i};if("notEquals"===n)return t?e=>{const t=r(e);return null!=t&&String(t)!==i}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase()!==i};if("startsWith"===n)return t?e=>{const t=r(e);return null!=t&&String(t).startsWith(i)}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase().startsWith(i)};if("endsWith"===n)return t?e=>{const t=r(e);return null!=t&&String(t).endsWith(i)}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase().endsWith(i)}}(e,t,d)??(()=>!0)}function c(e,t,n){const i=/* @__PURE__ */new Set;let a=!1;const o=r(t);for(const r of e){const e=o(r);if(n){const t=n(e,r);if(Array.isArray(t)){0===t.length&&(a=!0);for(const e of t)null!=e&&i.add(e)}else null!=t?i.add(t):a=!0}else null!=e&&""!==e?i.add(e):a=!0}return a&&i.add(l),[...i].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}function d(e,t){if(!e)return;if(!1===("effectiveConfig"in e?e.effectiveConfig:void 0)?.a11y?.announcements)return;const r=e.querySelector?.(".tbw-sr-only");r&&(r.textContent="","function"==typeof requestAnimationFrame?requestAnimationFrame(()=>{r.textContent=t}):r.textContent=t)}function u(e,r,...n){const i=(e&&"effectiveConfig"in e?e.effectiveConfig:void 0)?.a11y?.messages?.[r];return i?i(...n):t[r](...n)}function p(e){return e?e.toISOString().split("T")[0]:""}function f(e){return e?"string"==typeof e?e:"number"==typeof e?p(new Date(e)):"":""}var h=335e5;function b(e){const{totalRows:t,viewportHeight:r,scrollTop:n,rowHeight:i,overscan:l,maxSpacerHeight:a=h}=e,o=Math.ceil(r/i),s=t*i,c=function(e,t,r=h){return{rawContentHeight:e,spacerHeight:Math.min(e,r),viewportHeight:t,capped:e>r}}(s,r,a),d=function(e,t){if(!t.capped)return e;const r=t.spacerHeight-t.viewportHeight,n=t.rawContentHeight-t.viewportHeight;if(r<=0||n<=0)return e;const i=e*n/r;return i<0?0:i>n?n:i}(n,c);let u=Math.floor(d/i)-l;u<0&&(u=0);let p=u+o+2*l;return p>t&&(p=t),p===t&&u>0&&(u=Math.max(0,p-o-2*l)),{start:u,end:p,offsetY:u*i,totalHeight:c.spacerHeight,rawContentHeight:s}}function m(e,t,r,n,i,l){const{field:a,column:o}=t,s=function(e){if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-filter-item-height");if(t&&t.trim()){const e=parseFloat(t);if(!isNaN(e)&&e>0)return e}}return 28}(e),c=e=>{if(null==e)return"(Blank)";if(o.format&&!o.filterValue){const t=o.format(e,void 0);if(t)return t}return String(e)};r=r.slice().sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:c(e).localeCompare(c(t)));const d=document.createElement("div");d.className="tbw-filter-search";const u=document.createElement("input");u.type="text",u.placeholder=t.t("filter.search","Search..."),u.className="tbw-filter-search-input",u.value=l.get(a)??"",d.appendChild(u),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-actions";const f=document.createElement("label");f.className="tbw-filter-value-item",f.style.padding="0",f.style.margin="0";const h=document.createElement("input");h.type="checkbox",h.className="tbw-filter-checkbox";const m=document.createElement("span");m.textContent=t.t("filter.selectAll","Select All"),f.appendChild(h),f.appendChild(m),p.appendChild(f);const g=/* @__PURE__ */new Map;r.forEach(e=>{const t=null==e?"__null__":String(e);g.set(t,!n.has(e))});const v=()=>{const e=[...g.values()],t=e.every(e=>e),r=e.every(e=>!e);h.checked=t,h.indeterminate=!t&&!r};h.addEventListener("change",()=>{const e=h.checked;for(const t of g.keys())g.set(t,e);v(),F()}),v(),e.appendChild(p);const w=document.createElement("div");w.className="tbw-filter-values";const y=document.createElement("div");y.className="tbw-filter-values-spacer",w.appendChild(y);const x=document.createElement("div");x.className="tbw-filter-values-content",w.appendChild(x);let C=[];const E=(e,t)=>{const r=c(e),n=null==e?"__null__":String(e),i=document.createElement("label");i.className="tbw-filter-value-item",i.style.position="absolute",i.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,i.style.left="0",i.style.right="0",i.style.boxSizing="border-box";const l=document.createElement("input");l.type="checkbox",l.className="tbw-filter-checkbox",l.checked=g.get(n)??!0,l.dataset.value=n,l.addEventListener("change",()=>{g.set(n,l.checked),v()});const a=document.createElement("span");return a.textContent=r,i.appendChild(l),i.appendChild(a),i},F=()=>{const e=C.length,t=w.clientHeight,r=w.scrollTop;if(y.style.height=e*s+"px",e<=50/3)return x.innerHTML="",x.style.transform="translateY(0px)",void C.forEach((e,t)=>{x.appendChild(E(e,t))});const n=b({totalRows:e,viewportHeight:t,scrollTop:r,rowHeight:s,overscan:3});x.style.transform=`translateY(${n.offsetY}px)`,x.innerHTML="";for(let i=n.start;i<n.end;i++)x.appendChild(E(C[i],i-n.start))},k=e=>{const n=i.caseSensitive??!1,l=n?e:e.toLowerCase();if(C=r.filter(t=>{const r=c(t),i=n?r:r.toLowerCase();return!e||i.includes(l)}),C.sort((e,t)=>{const r=null==e?"__null__":String(e),n=null==t?"__null__":String(t),i=g.get(r)??!0;return i!==(g.get(n)??!0)?i?-1:1:"number"==typeof e&&"number"==typeof t?e-t:c(e).localeCompare(c(t))}),0===C.length){y.style.height="0px",x.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent=t.t("filter.noMatches","No matching values"),void x.appendChild(e)}F()};let S;w.addEventListener("scroll",()=>{C.length>0&&F()},{passive:!0}),k(u.value),e.appendChild(w),u.addEventListener("input",()=>{clearTimeout(S),S=setTimeout(()=>{l.set(a,u.value),k(u.value)},i.debounceMs??150)});const N=document.createElement("div");N.className="tbw-filter-buttons";const T=document.createElement("button");T.type="button",T.className="tbw-filter-apply-btn",T.textContent=t.t("filter.apply","Apply"),T.addEventListener("click",()=>{const e=[];for(const[t,n]of g)if(!n)if("__null__"===t)e.push(null);else{const n=r.find(e=>String(e)===t);e.push(void 0!==n?n:t)}t.applySetFilter(e)}),N.appendChild(T);const A=document.createElement("button");A.type="button",A.className="tbw-filter-clear-btn",A.textContent=t.t("filter.clear","Clear Filter"),A.addEventListener("click",()=>{t.clearFilter()}),N.appendChild(A),e.appendChild(N)}function g(e,t){if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t}var v=e=>!0===e.__loading,w=class t extends e{static manifest={events:[{type:"filter-change",description:"Emitted when filter criteria change. Broadcast to both DOM consumers and plugin bus."}],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{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);flex:1}tbw-grid .tbw-quick-filter-input:focus{border-color:var(--tbw-color-accent);outline:none}tbw-grid .header-cell.filtered:before{content:"";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%;position:absolute}tbw-grid .tbw-filter-btn{display:var(--tbw-filter-btn-display,inline-flex);visibility:var(--tbw-filter-btn-visibility,visible);cursor:pointer;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;background:0 0;border:none;justify-content:center;align-items:center;padding:2px}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{visibility:visible;display:inline-flex}@media (hover:none){tbw-grid .header-row .cell .tbw-filter-btn{visibility:visible;display:inline-flex}}tbw-grid .tbw-filter-btn{min-width:var(--tbw-touch-target-min,24px);min-height:var(--tbw-touch-target-min,24px)}}';get defaultConfig(){return{debounceMs:300,caseSensitive:!1}}isFilteringEnabled(){return!1!==this.grid.effectiveConfig?.filterable}isColumnFilterable(e){return!!this.isFilteringEnabled()&&!1!==e.filterable}getDataRows(){const e=this.sourceRows;if(e.length>0)return e;const t=this.rows;return 0===t.length?t:t.filter(e=>null!=e&&!0!==e.__loading)}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const r of e){if(!r.field)continue;const e=this.getFilterExtractor(r);e&&(t||(t=/* @__PURE__ */new Map),t.set(r.field,e))}return t}getFilterExtractor(e){const{filterValue:t}=e;return t?(e,r)=>!0===r.__loading?void 0:t(e,r):e.valueAccessor?(t,r)=>i(r,e):void 0}filters=/* @__PURE__ */new Map;cachedResult=null;cacheKey=null;cachedInputRows=null;openPanelField=null;panelElement=null;panelAnchorElement=null;panelButtonElement=null;searchText=/* @__PURE__ */new Map;excludedValues=/* @__PURE__ */new Map;panelAbortController=null;globalStylesInjected=!1;columnLookup=null;columnLookupRef=null;getColumnByField(e){const t=this.grid.effectiveConfig?.columns;if(!t)return;let r=this.columnLookup;if(t!==this.columnLookupRef||!r){r=/* @__PURE__ */new Map;for(const e of t)e.field&&r.set(e.field,e);this.columnLookup=r,this.columnLookupRef=t}return r.get(e)}computeSelected(){const e={},t=[];for(const[r,n]of this.filters)if("set"===n.type)if("in"===n.operator&&Array.isArray(n.value))e[r]=n.value;else if("notIn"===n.operator){const e=this.getColumnByField(r);t.push({field:r,filterValue:e?this.getFilterExtractor(e):void 0})}if(t.length>0){const n=function(e,t){const n=/* @__PURE__ */new Map,i=/* @__PURE__ */new Map;for(const{field:l,filterValue:o}of t)n.set(l,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!o}),i.set(l,r(l));for(const r of e)for(const{field:e,filterValue:l}of t){const t=n.get(e),a=i.get(e)(r);if(l){const e=l(a,r);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!=a&&""!==a?t.values.add(a):t.hasBlank=!0}const a=/* @__PURE__ */new Map;for(const[r,{values:o,hasBlank:s}]of n)s&&o.add(l),a.set(r,[...o].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return a}(this.getDataRows(),t);for(const{field:r}of t){const t=this.excludedValues.get(r),i=n.get(r)??[];e[r]=t?i.filter(e=>!t.has(e)):i}}return e}invalidateCache(){this.cachedResult=null,this.cacheKey=null,this.cachedInputRows=null}notifyFilterChange(e,t,r){r?this.emitPluginEvent("filter-change",{filters:e}):(this.broadcast("filter-change",{filters:e,filteredRowCount:t,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.())}syncExcludedValues(e,t){if(t)if("set"===t.type&&"notIn"===t.operator&&Array.isArray(t.value))this.excludedValues.set(e,new Set(t.value));else if("set"===t.type&&"in"===t.operator&&Array.isArray(t.value)){const r=this.getDataRows();if(!r||0===r.length)return void this.excludedValues.delete(e);const n=t.value,i=new Set(n.map(e=>null==e?l:e)),a=this.getUniqueValues(e),o=new Set(a.filter(e=>!i.has(e)));this.excludedValues.set(e,o)}else"set"===t.type&&this.excludedValues.delete(e);else this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles();const t=()=>{this.cachedInputRows=null};this.on("cell-edit-committed",t),this.on("cell-edit-reverted",t),this.gridElement?.addEventListener("cell-change",t,{signal:this.disconnectSignal})}detach(){super.detach(),this.filters.clear(),this.invalidateCache(),this.columnLookup=null,this.columnLookupRef=null,this.openPanelField=null,this.panelElement&&(this.dismissTopLayer(this.panelElement),this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}handleQuery(e){if("filter:get-model"===e.type){if(!this.filters.size)return;return Object.fromEntries(this.filters)}if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const r=t.column;if(!r?.field)return;if(!this.isFilteringEnabled())return;if(!this.isColumnFilterable(r))return;const n=[],i=this.isFieldFiltered(r.field),l=this.filters.size>0;return i&&n.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),l&&n.push({id:"filtering/clear-all-filters",label:this.t("filter.clearAll","Clear All Filters"),icon:"✕",order:21,disabled:!l,action:()=>this.clearAllFilters()}),n.length>0?n:void 0}}processRows(e){if(!this.filters.size)return e;const t=[...this.filters.values()];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:e;const r=this.grid.query?.("datasource:filter-mode",null)?.[0];if("server"===r)return e;const n="local"===r?v:void 0,i=(l=t,JSON.stringify(l.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var l;const a=e===this.cachedInputRows;if(this.cacheKey===i&&this.cachedResult&&a)return this.cachedResult;if(!a)for(const[s,c]of this.filters)"set"===c.type&&"in"===c.operator&&this.syncExcludedValues(s,c);const o=function(e,t,r=!1,n,i){if(!t.length)return e;const l=t.map(e=>s(e,r,n?.get(e.field))),a=1===l.length?l[0]:e=>{for(let t=0;t<l.length;t++)if(!l[t](e))return!1;return!0};return i?e.filter(e=>i(e)||a(e)):e.filter(a)}(e,t,this.config.caseSensitive,this.getFilterValues(),n);return this.cachedResult=o,this.cacheKey=i,this.cachedInputRows=e,o}afterRender(){const e=this.gridElement;e&&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(!0===r.utility)return;const n=r.field;if(!n)return;const i=this.filters.has(n);let l=e.querySelector(".tbw-filter-btn");if(l){const t=l.classList.contains("active");return l.classList.toggle("active",i),e.classList.toggle("filtered",i),i?e.setAttribute("aria-description","Filtered"):e.removeAttribute("aria-description"),void(t!==i&&this.setIcon(l,i?"filterActive":"filter"))}l=document.createElement("button"),l.type="button",l.className="tbw-filter-btn",l.setAttribute("aria-label",`Filter ${r.header??n}`),this.setIcon(l,i?"filterActive":"filter"),i&&(l.classList.add("active"),e.classList.add("filtered"),e.setAttribute("aria-description","Filtered")),l.addEventListener("click",e=>{e.stopPropagation(),this.toggleFilterPanel(n,r,l)});const a=e.querySelector(".resize-handle");a?e.insertBefore(l,a):e.appendChild(l)})}setFilter(e,t,r){if(null===t)this.filters.delete(e),this.syncExcludedValues(e,null);else{const r={...t,field:e};this.filters.set(e,r),this.syncExcludedValues(e,r)}if(this.invalidateCache(),this.notifyFilterChange([...this.filters.values()],0,r?.silent),!r?.silent){const r=this.getColumnByField(e)?.header??e;d(this.gridElement,u(this.gridElement,null===t?"filterCleared":"filterApplied",r))}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.invalidateCache(),this.notifyFilterChange([...this.filters.values()],0,t?.silent),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent),e?.silent||d(this.gridElement,u(this.gridElement,"allFiltersCleared"))}clearFieldFilter(e,t){if(this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent),!t?.silent){const t=this.getColumnByField(e)?.header??e;d(this.gridElement,u(this.gridElement,"filterCleared",t))}}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const t=this.getColumnByField(e)?.filterValue;return c(this.getDataRows(),e,t)}getStaleFilters(){const e=[];for(const[t,r]of this.filters){if("set"!==r.type)continue;const n=this.getUniqueValues(t);if("notIn"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===n.filter(e=>!t.has(e)).length&&e.push(r)}else if("in"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===n.filter(e=>t.has(e)).length&&e.push(r)}}return e}getBlankMode(e){const t=this.filters.get(e);return"blank"===t?.operator?"blanksOnly":"notBlank"===t?.operator?"nonBlanksOnly":"all"}toggleBlankFilter(e,t){if("all"===t){const t=this.filters.get(e);if(t?.valueTo&&"object"==typeof t.valueTo){const r=t.valueTo;this.setFilter(e,r)}else this.setFilter(e,null);return}const r=this.filters.get(e),n=r&&"blank"!==r.operator&&"notBlank"!==r.operator?{type:r.type,operator:r.operator,value:r.value,valueTo:r.valueTo}:r?.valueTo;this.setFilter(e,{type:r?.type??"text",operator:"blanksOnly"===t?"blank":"notBlank",value:"",valueTo:n})}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const n of t.classList)n.startsWith("tbw-")||"selecting"===n||e.classList.add(n);const r=t.dataset.theme;r&&(e.dataset.theme=r)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles"))return void(this.globalStylesInjected=!0);const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent="@layer tbw-plugins{.tbw-filter-panel{background:var(--tbw-filter-panel-bg,var(--tbw-color-panel-bg,light-dark(#eee,#222)));color:var(--tbw-filter-panel-fg,var(--tbw-color-fg,light-dark(#222,#eee)));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(#0000001a,#0000004d)));padding:var(--tbw-panel-padding,var(--tbw-spacing-lg,.75rem));z-index:10000;min-width:200px;max-width:280px;max-height:350px;font-family:var(--tbw-font-family,system-ui, sans-serif);font-size:var(--tbw-font-size,.8125rem);transform-origin:top;flex-direction:column;display:flex;position:fixed}.tbw-filter-panel.tbw-filter-panel-above{transform-origin:bottom}.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);right:anchor(right);position-try-fallbacks:flip-inline, flip-block, flip-block flip-inline;margin-inline:0;margin-top:4px;bottom:auto;left:auto}}.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{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%);outline:none}.tbw-filter-actions{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);display:flex}.tbw-filter-actions .tbw-filter-value-item{flex:1}.tbw-filter-values{margin-bottom:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));flex:1;max-height:180px;position:relative;overflow-y:auto}.tbw-filter-values-spacer{width:1px}.tbw-filter-values-content{position:absolute;top:0;left:0;right:0}.tbw-filter-value-item{align-items:center;gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));padding:var(--tbw-button-padding-sm,.25rem .125rem);cursor:pointer;height:var(--tbw-filter-item-height,28px);border-radius:3px;display:flex}.tbw-filter-value-item:hover{background:var(--tbw-filter-hover,var(--tbw-color-row-hover,light-dark(#f0f6ff,#1c1c1c)))}.tbw-filter-checkbox{cursor:pointer;accent-color:var(--tbw-filter-accent,var(--tbw-color-accent,#3b82f6));margin:0}.tbw-filter-no-match{color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)));padding:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem)) 0;text-align:center;font-style:italic}.tbw-filter-buttons{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)));display:flex}.tbw-filter-apply-btn{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(#fff,#000)));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);border:none;flex:1}.tbw-filter-apply-btn:hover{filter:brightness(.9)}.tbw-filter-clear-btn{padding:var(--tbw-filter-btn-padding,var(--tbw-button-padding,.375rem .75rem));color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)));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);background:0 0;flex:1}.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{align-items:flex-end;gap:var(--tbw-spacing-sm,.375rem);margin-bottom:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));display:flex}.tbw-filter-range-group,.tbw-filter-date-group{gap:var(--tbw-spacing-xs,.25rem);flex-direction:column;flex:1;display:flex}.tbw-filter-range-label{font-size:var(--tbw-font-size-xs,.75rem);color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)))}.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{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%);outline:none}.tbw-filter-range-separator{color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)));padding-bottom:var(--tbw-spacing-xs,.25rem)}.tbw-filter-blank-option{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;display:flex}.tbw-filter-blank-checkbox{accent-color:var(--tbw-filter-accent,var(--tbw-color-accent,#3b82f6));cursor:pointer;margin:0}.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{height:24px;margin:var(--tbw-spacing-md,.5rem) 0 var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));position:relative}.tbw-filter-range-track{background:var(--tbw-filter-input-border,var(--tbw-color-border,light-dark(#d0d0d4,#454545)));border-radius:2px;height:4px;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.tbw-filter-range-fill{background:var(--tbw-filter-accent,var(--tbw-color-accent,#3b82f6));border-radius:2px;height:4px;position:absolute;top:50%;transform:translateY(-50%)}.tbw-filter-range-thumb{pointer-events:none;appearance:none;background:0 0;width:100%;height:100%;position:absolute;top:0}.tbw-filter-range-thumb::-webkit-slider-thumb{appearance:none;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(#eee,#222)));cursor:pointer;pointer-events:all;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-moz-range-thumb{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(#eee,#222)));cursor:pointer;pointer-events:all;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-webkit-slider-thumb:hover{transform:scale(1.1)}.tbw-filter-range-thumb::-moz-range-thumb:hover{transform:scale(1.1)}}",document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,r){if(this.openPanelField===e)return void this.closeFilterPanel();this.closeFilterPanel();const n=document.createElement("div");if(n.className="tbw-filter-panel",this.copyGridThemeContext(n),this.isAnimationEnabled&&n.classList.add("tbw-filter-panel-animated"),this.panelElement=n,this.openPanelField=e,r.classList.add("active"),this.panelButtonElement=r,this.config.valuesHandler)return n.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(n),this.promoteToTopLayer(n),this.positionPanel(n,r),this.setupPanelCloseHandler(n,r),void this.config.valuesHandler(e,t).then(r=>{this.openPanelField===e&&this.panelElement&&(n.innerHTML="",this.renderPanelContent(e,t,n,r))});const i=c(this.getDataRows(),e,this.getFilterExtractor(t));document.body.appendChild(n),this.promoteToTopLayer(n),this.positionPanel(n,r),this.renderPanelContent(e,t,n,i),this.setupPanelCloseHandler(n,r)}renderPanelContent(e,t,r,n){const i=this.filters.get(e);if("in"===i?.operator&&"set"===i.type&&Array.isArray(i.value)&&!this.excludedValues.has(e)){const t=i.value,r=new Set(t.map(e=>null==e?l:e)),a=new Set(n.filter(e=>!r.has(e)));this.excludedValues.set(e,a)}let a=this.excludedValues.get(e);a||(a=/* @__PURE__ */new Set,this.excludedValues.set(e,a));const o=this.searchText.get(e)??"",s={field:e,column:t,uniqueValues:n,excludedValues:a,searchText:o,currentFilter:this.filters.get(e),applySetFilter:(t,r)=>{this.applySetFilter(e,t,r),this.closeFilterPanel()},applyTextFilter:(t,r,n)=>{this.applyTextFilter(e,t,r,n),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel(),t:this.translate};let c=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(r,s),c=r.children.length>0),!c&&t.type){const e=this.grid.effectiveConfig.typeDefaults?.[t.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(r,s),c=r.children.length>0)}if(!c){const e=t.filterType??t.type;"number"===e?function(e,t,r,n){const{field:i,column:l}=t,a=l.filterParams,o=l.editorParams,s=r.filter(e=>"number"==typeof e&&!isNaN(e)),c=s.length>0?Math.min(...s):0,d=s.length>0?Math.max(...s):100,u=g(a?.min??o?.min,c),p=g(a?.max??o?.max,d),f=a?.step??o?.step??1,h=s.length>0?Math.max(u,c):u,b=s.length>0?Math.min(p,d):p,m=n.get(i);let v=h,w=b;const y="blank"===m?.operator;"between"===m?.operator?(v=g(m.value,h),w=g(m.valueTo,b)):"greaterThanOrEqual"===m?.operator?v=g(m.value,h):"lessThanOrEqual"===m?.operator&&(w=g(m.value,b));const x=document.createElement("div");x.className="tbw-filter-range-inputs";const C=document.createElement("div");C.className="tbw-filter-range-group";const E=document.createElement("label");E.textContent=t.t("filter.min","Min"),E.className="tbw-filter-range-label";const F=document.createElement("input");F.type="number",F.className="tbw-filter-range-input",F.min=String(u),F.max=String(p),F.step=String(f),F.value=String(v),C.appendChild(E),C.appendChild(F),x.appendChild(C);const k=document.createElement("span");k.className="tbw-filter-range-separator",k.textContent="–",x.appendChild(k);const S=document.createElement("div");S.className="tbw-filter-range-group";const N=document.createElement("label");N.textContent=t.t("filter.max","Max"),N.className="tbw-filter-range-label";const T=document.createElement("input");T.type="number",T.className="tbw-filter-range-input",T.min=String(u),T.max=String(p),T.step=String(f),T.value=String(w),S.appendChild(N),S.appendChild(T),x.appendChild(S),e.appendChild(x);const A=document.createElement("div");A.className="tbw-filter-range-slider";const L=document.createElement("div");L.className="tbw-filter-range-track";const P=document.createElement("div");P.className="tbw-filter-range-fill";const R=document.createElement("input");R.type="range",R.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",R.min=String(u),R.max=String(p),R.step=String(f),R.value=String(v);const M=document.createElement("input");M.type="range",M.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",M.min=String(u),M.max=String(p),M.step=String(f),M.value=String(w),A.appendChild(L),A.appendChild(P),A.appendChild(R),A.appendChild(M),e.appendChild(A);const B=document.createElement("label");B.className="tbw-filter-blank-option";const V=document.createElement("input");V.type="checkbox",V.className="tbw-filter-blank-checkbox",V.checked=y;const q=document.createTextNode("Blank");B.appendChild(V),B.appendChild(q);const H=e=>{F.disabled=e,T.disabled=e,R.disabled=e,M.disabled=e,x.classList.toggle("tbw-filter-disabled",e),A.classList.toggle("tbw-filter-disabled",e)};H(y),V.addEventListener("change",()=>{H(V.checked)}),e.appendChild(B);const I=()=>{const e=parseFloat(R.value),t=parseFloat(M.value),r=p-u,n=(e-u)/r*100,i=(t-u)/r*100;P.style.left=`${n}%`,P.style.width=i-n+"%"};R.addEventListener("input",()=>{const e=Math.min(parseFloat(R.value),parseFloat(M.value));R.value=String(e),F.value=String(e),I()}),M.addEventListener("input",()=>{const e=Math.max(parseFloat(M.value),parseFloat(R.value));M.value=String(e),T.value=String(e),I()}),F.addEventListener("input",()=>{const e=parseFloat(F.value);let t=Number.isFinite(e)?e:u;t=Math.max(u,Math.min(t,parseFloat(T.value))),R.value=String(t),I()}),T.addEventListener("input",()=>{const e=parseFloat(T.value);let t=Number.isFinite(e)?e:p;t=Math.min(p,Math.max(t,parseFloat(F.value))),M.value=String(t),I()}),I();const z=document.createElement("div");z.className="tbw-filter-buttons";const _=document.createElement("button");_.type="button",_.className="tbw-filter-apply-btn",_.textContent=t.t("filter.apply","Apply"),_.addEventListener("click",()=>{if(V.checked)return void t.applyTextFilter("blank","");const e=parseFloat(F.value),r=parseFloat(T.value),n=Number.isFinite(e)?e:h,i=Number.isFinite(r)?r:b;n!==h||i!==b?t.applyTextFilter("between",n,i):t.clearFilter()}),z.appendChild(_);const D=document.createElement("button");D.type="button",D.className="tbw-filter-clear-btn",D.textContent=t.t("filter.clear","Clear Filter"),D.addEventListener("click",()=>{t.clearFilter()}),z.appendChild(D),e.appendChild(z)}(r,s,n,this.filters):"date"===e?function(e,t,r,n){const{field:i,column:l}=t,a=l.filterParams,o=l.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())),c=s.length>0?new Date(Math.min(...s.map(e=>e.getTime()))):null,d=s.length>0?new Date(Math.max(...s.map(e=>e.getTime()))):null,u=f(a?.min)||f(o?.min)||p(c),h=f(a?.max)||f(o?.max)||p(d),b=p(c)||f(a?.min)||f(o?.min),m=p(d)||f(a?.max)||f(o?.max),g=n.get(i);let v=b,w=m;const y="blank"===g?.operator;"between"===g?.operator?(v=f(g.value)||b,w=f(g.valueTo)||m):"greaterThanOrEqual"===g?.operator?v=f(g.value)||b:"lessThanOrEqual"===g?.operator&&(w=f(g.value)||m);const x=document.createElement("div");x.className="tbw-filter-date-range";const C=document.createElement("div");C.className="tbw-filter-date-group";const E=document.createElement("label");E.textContent=t.t("filter.from","From"),E.className="tbw-filter-range-label";const F=document.createElement("input");F.type="date",F.className="tbw-filter-date-input",u&&(F.min=u),h&&(F.max=h),F.value=v,C.appendChild(E),C.appendChild(F),x.appendChild(C);const k=document.createElement("span");k.className="tbw-filter-range-separator",k.textContent="–",x.appendChild(k);const S=document.createElement("div");S.className="tbw-filter-date-group";const N=document.createElement("label");N.textContent="To",N.className="tbw-filter-range-label";const T=document.createElement("input");T.type="date",T.className="tbw-filter-date-input",u&&(T.min=u),h&&(T.max=h),T.value=w,S.appendChild(N),S.appendChild(T),x.appendChild(S),e.appendChild(x);const A=document.createElement("label");A.className="tbw-filter-blank-option";const L=document.createElement("input");L.type="checkbox",L.className="tbw-filter-blank-checkbox",L.checked=y;const P=document.createTextNode("Show only blank");A.appendChild(L),A.appendChild(P);const R=e=>{F.disabled=e,T.disabled=e,x.classList.toggle("tbw-filter-disabled",e)};R(y),L.addEventListener("change",()=>{R(L.checked)}),e.appendChild(A);const M=document.createElement("div");M.className="tbw-filter-buttons";const B=document.createElement("button");B.type="button",B.className="tbw-filter-apply-btn",B.textContent=t.t("filter.apply","Apply"),B.addEventListener("click",()=>{if(L.checked)return void t.applyTextFilter("blank","");const e=F.value,r=T.value,n=e&&e!==b?e:"",i=r&&r!==m?r:"";n&&i?t.applyTextFilter("between",n,i):n?t.applyTextFilter("greaterThanOrEqual",n):i?t.applyTextFilter("lessThanOrEqual",i):t.clearFilter()}),M.appendChild(B);const V=document.createElement("button");V.type="button",V.className="tbw-filter-clear-btn",V.textContent=t.t("filter.clear","Clear Filter"),V.addEventListener("click",()=>{t.clearFilter()}),M.appendChild(V),e.appendChild(M)}(r,s,n,this.filters):m(r,s,n,a,{caseSensitive:this.config.caseSensitive,debounceMs:this.config.debounceMs},this.searchText)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController;const{signal:r}=this.panelAbortController;setTimeout(()=>{r.aborted||document.addEventListener("click",r=>{e.contains(r.target)||r.target===t||this.closeFilterPanel()},{signal:r})},0)}promoteToTopLayer(e){if("function"==typeof e.showPopover){e.setAttribute("popover","manual");try{e.showPopover()}catch{}}}dismissTopLayer(e){if(e.hasAttribute("popover")&&"function"==typeof e.hidePopover)try{e.hidePopover()}catch{}}closeFilterPanel(){const e=this.panelElement;if(e&&(this.dismissTopLayer(e),e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.panelButtonElement){const e=this.openPanelField;e&&this.filters.has(e)||this.panelButtonElement.classList.remove("active"),this.panelButtonElement=null}this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return null===t.supportsAnchorPositioning&&(t.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),t.supportsAnchorPositioning}positionPanel(e,r){const n=r.closest(".header-row")??r;if(n.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=n,t.checkAnchorPositioningSupport()){n.style.anchorName="",r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r;const t=n.getBoundingClientRect().bottom-r.getBoundingClientRect().bottom;return e.style.marginTop=`${t+4}px`,void requestAnimationFrame(()=>{const t=e.getBoundingClientRect(),n=r.getBoundingClientRect();t.top<n.top&&e.classList.add("tbw-filter-panel-above")})}const i=n.getBoundingClientRect(),l=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${i.bottom+4}px`,e.style.left=`${l.right}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();e.style.left=l.right-t.width+"px",l.right-t.width<8&&(e.style.left=`${l.left}px`),t.bottom>window.innerHeight-8&&(e.style.top=i.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}applySetFilter(e,t,r){if(this.excludedValues.set(e,new Set(t)),0===t.length)this.filters.delete(e);else if("in"===this.filters.get(e)?.operator){const n=this.getUniqueValues(e),i=new Set(t),l=n.filter(e=>!i.has(e));this.filters.set(e,{field:e,type:"set",operator:"in",value:l,...void 0!==r&&{valueTo:r}})}else this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==r&&{valueTo:r}});this.applyFiltersInternal()}applyTextFilter(e,t,r,n){const i=this.getColumnByField(e),l=i?.filterType??i?.type??"text";this.filters.set(e,{field:e,type:l,operator:t,value:r,valueTo:n}),this.applyFiltersInternal()}applyFiltersInternal(e){this.invalidateCache();const t=[...this.filters.values()];if(this.config.filterHandler){this.gridElement.setAttribute("aria-busy","true");const r=this.config.filterHandler(t,this.sourceRows),n=r=>{this.gridElement.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,this.notifyFilterChange(t,r.length,e),this.requestRender()};return void(r&&"function"==typeof r.then?r.then(n):n(r))}this.notifyFilterChange(t,0,e),this.requestRender()}getColumnState(e){if(!this.config.trackColumnState)return;const t=this.filters.get(e);return t?{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}:void 0}applyColumnState(e,t){if(!this.config.trackColumnState)return;if(!t.filter)return void this.filters.delete(e);const r={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,r),this.invalidateCache()}};export{l as BLANK_FILTER_VALUE,w as FilteringPlugin};
|
|
1
|
+
import{BaseGridPlugin as e,DEFAULT_A11Y_MESSAGES as t,createFieldReader as r,isPlainField as n,resolveCellValue as i}from"@toolbox-web/grid";var l="(Blank)";function a(e){return null==e||""===e||"number"==typeof e&&isNaN(e)}function o(e){if("number"==typeof e)return e;if(e instanceof Date)return e.getTime();const t=Number(e);return isNaN(t)?new Date(e).getTime():t}function s(e,t,i){const s=e.field,c=r(s),d=i?e=>i(c(e),e):c;return function(e,t){if("blank"===e.operator)return e=>{const r=t(e);return null==r||""===r||"number"==typeof r&&isNaN(r)};if("notBlank"===e.operator)return e=>{const r=t(e);return null!=r&&""!==r&&!("number"==typeof r&&isNaN(r))}}(e,d)??function(e,t,r){const n=e.operator;if("in"!==n&&"notIn"!==n)return;const i="notIn"===n;if(!Array.isArray(e.value))return i?()=>!0:()=>!1;const a=new Set(e.value);return r?e=>{const n=r(t(e),e),o=Array.isArray(n)?n:null!=n?[n]:[],s=0===o.length?a.has(l):o.some(e=>a.has(e));return i?!s:s}:e=>{const r=t(e),n=null==r||""===r?a.has(l):a.has(r);return i?!n:n}}(e,c,i)??function(e,t,r,i){const l=e.operator,s="number"===e.type&&i,c=s&&n(t)?t:null;if("greaterThan"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r>t}:s?e=>{const n=r(e);return!a(n)&&n>t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i>t}}if("greaterThanOrEqual"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r>=t}:s?e=>{const n=r(e);return!a(n)&&n>=t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i>=t}}if("lessThan"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r<t}:s?e=>{const n=r(e);return!a(n)&&n<t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i<t}}if("lessThanOrEqual"===l){const t=o(e.value);return c?e=>{const r=e[c];return!a(r)&&r<=t}:s?e=>{const n=r(e);return!a(n)&&n<=t}:e=>{const n=r(e);if(a(n))return!1;const i=o(n);return!isNaN(i)&&i<=t}}if("between"===l){const t=o(e.value),n=o(e.valueTo);return c?e=>{const r=e[c];if(a(r))return!1;return r>=t&&r<=n}:s?e=>{const i=r(e);if(a(i))return!1;return i>=t&&i<=n}:e=>{const i=r(e);if(a(i))return!1;const l=o(i);return!isNaN(l)&&l>=t&&l<=n}}}(e,s,d,void 0===i)??function(e,t,r){const n=e.operator,i=t?String(e.value):String(e.value).toLowerCase();if("contains"===n)return t?e=>{const t=r(e);return null!=t&&String(t).includes(i)}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase().includes(i)};if("notContains"===n)return t?e=>{const t=r(e);return null!=t&&!String(t).includes(i)}:e=>{const t=r(e);return null!=t&&!String(t).toLowerCase().includes(i)};if("equals"===n)return t?e=>{const t=r(e);return null!=t&&String(t)===i}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase()===i};if("notEquals"===n)return t?e=>{const t=r(e);return null!=t&&String(t)!==i}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase()!==i};if("startsWith"===n)return t?e=>{const t=r(e);return null!=t&&String(t).startsWith(i)}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase().startsWith(i)};if("endsWith"===n)return t?e=>{const t=r(e);return null!=t&&String(t).endsWith(i)}:e=>{const t=r(e);return null!=t&&String(t).toLowerCase().endsWith(i)}}(e,t,d)??(()=>!0)}function c(e,t,n,i){const a=/* @__PURE__ */new Set;let o=!1;const s=r(t);for(const r of e){const e=s(r);if(n){const t=n(e,r);if(Array.isArray(t)){0===t.length&&(o=!0);for(const e of t)null!=e&&(a.add(e),i&&!i.has(e)&&i.set(e,r))}else null!=t?(a.add(t),i&&!i.has(t)&&i.set(t,r)):o=!0}else null!=e&&""!==e?(a.add(e),i&&!i.has(e)&&i.set(e,r)):o=!0}return o&&a.add(l),[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}function d(e){return"object"==typeof e&&null!==e&&"value"in e&&"label"in e&&"string"==typeof e.label}function u(e,t){if(!e)return;if(!1===("effectiveConfig"in e?e.effectiveConfig:void 0)?.a11y?.announcements)return;const r=e.querySelector?.(".tbw-sr-only");r&&(r.textContent="","function"==typeof requestAnimationFrame?requestAnimationFrame(()=>{r.textContent=t}):r.textContent=t)}function p(e,r,...n){const i=(e&&"effectiveConfig"in e?e.effectiveConfig:void 0)?.a11y?.messages?.[r];return i?i(...n):t[r](...n)}function f(e){return e?e.toISOString().split("T")[0]:""}function h(e){return e?"string"==typeof e?e:"number"==typeof e?f(new Date(e)):"":""}var b=335e5;function m(e){const{totalRows:t,viewportHeight:r,scrollTop:n,rowHeight:i,overscan:l,maxSpacerHeight:a=b}=e,o=Math.ceil(r/i),s=t*i,c=function(e,t,r=b){return{rawContentHeight:e,spacerHeight:Math.min(e,r),viewportHeight:t,capped:e>r}}(s,r,a),d=function(e,t){if(!t.capped)return e;const r=t.spacerHeight-t.viewportHeight,n=t.rawContentHeight-t.viewportHeight;if(r<=0||n<=0)return e;const i=e*n/r;return i<0?0:i>n?n:i}(n,c);let u=Math.floor(d/i)-l;u<0&&(u=0);let p=u+o+2*l;return p>t&&(p=t),p===t&&u>0&&(u=Math.max(0,p-o-2*l)),{start:u,end:p,offsetY:u*i,totalHeight:c.spacerHeight,rawContentHeight:s}}function g(e,t,r,n,i,a,o={}){const{field:s,column:c}=t,d=function(e){if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-filter-item-height");if(t&&t.trim()){const e=parseFloat(t);if(!isNaN(e)&&e>0)return e}}return 28}(e),{rows:u,labels:p,onFormatError:f}=o,h=c.filterValue?void 0:c.format;let b=!1;const g=e=>{b||(b=!0,f?.(e))},v=e=>{const t=p?.get(e);if(null!=t)return t;if(null==e||"(Blank)"===e)return l;if(h){const t=function(e,t,r,n){try{const n=e(t,r);return null==n?"":String(n)}catch(i){return void n(i)}}(h,e,u?.get(e),g);if(t)return t}return String(e)},w=/* @__PURE__ */new Map,y=e=>{let t=w.get(e);return void 0===t&&(t=v(e),w.set(e,t)),t};r=r.slice().sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:y(e).localeCompare(y(t)));const x=document.createElement("div");x.className="tbw-filter-search";const C=document.createElement("input");C.type="text",C.placeholder=t.t("filter.search","Search..."),C.className="tbw-filter-search-input",C.value=a.get(s)??"",x.appendChild(C),e.appendChild(x);const E=document.createElement("div");E.className="tbw-filter-actions";const F=document.createElement("label");F.className="tbw-filter-value-item",F.style.padding="0",F.style.margin="0";const k=document.createElement("input");k.type="checkbox",k.className="tbw-filter-checkbox";const S=document.createElement("span");S.textContent=t.t("filter.selectAll","Select All"),F.appendChild(k),F.appendChild(S),E.appendChild(F);const N=/* @__PURE__ */new Map;r.forEach(e=>{const t=null==e?"__null__":String(e);N.set(t,!n.has(e))});const T=()=>{const e=[...N.values()],t=e.every(e=>e),r=e.every(e=>!e);k.checked=t,k.indeterminate=!t&&!r};k.addEventListener("change",()=>{const e=k.checked;for(const t of N.keys())N.set(t,e);T(),B()}),T(),e.appendChild(E);const A=document.createElement("div");A.className="tbw-filter-values";const L=document.createElement("div");L.className="tbw-filter-values-spacer",A.appendChild(L);const P=document.createElement("div");P.className="tbw-filter-values-content",A.appendChild(P);let M=[];const R=(e,t)=>{const r=y(e),n=null==e?"__null__":String(e),i=document.createElement("label");i.className="tbw-filter-value-item",i.style.position="absolute",i.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,i.style.left="0",i.style.right="0",i.style.boxSizing="border-box";const l=document.createElement("input");l.type="checkbox",l.className="tbw-filter-checkbox",l.checked=N.get(n)??!0,l.dataset.value=n,l.addEventListener("change",()=>{N.set(n,l.checked),T()});const a=document.createElement("span");return a.textContent=r,i.appendChild(l),i.appendChild(a),i},B=()=>{const e=M.length,t=A.clientHeight,r=A.scrollTop;if(L.style.height=e*d+"px",e<=50/3)return P.innerHTML="",P.style.transform="translateY(0px)",void M.forEach((e,t)=>{P.appendChild(R(e,t))});const n=m({totalRows:e,viewportHeight:t,scrollTop:r,rowHeight:d,overscan:3});P.style.transform=`translateY(${n.offsetY}px)`,P.innerHTML="";for(let i=n.start;i<n.end;i++)P.appendChild(R(M[i],i-n.start))},V=e=>{const n=i.caseSensitive??!1,l=n?e:e.toLowerCase();if(M=r.filter(t=>{const r=y(t),i=n?r:r.toLowerCase();return!e||i.includes(l)}),M.sort((e,t)=>{const r=null==e?"__null__":String(e),n=null==t?"__null__":String(t),i=N.get(r)??!0;return i!==(N.get(n)??!0)?i?-1:1:"number"==typeof e&&"number"==typeof t?e-t:y(e).localeCompare(y(t))}),0===M.length){L.style.height="0px",P.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent=t.t("filter.noMatches","No matching values"),void P.appendChild(e)}B()};let q;A.addEventListener("scroll",()=>{M.length>0&&B()},{passive:!0}),V(C.value),e.appendChild(A),C.addEventListener("input",()=>{clearTimeout(q),q=setTimeout(()=>{a.set(s,C.value),V(C.value)},i.debounceMs??150)});const H=document.createElement("div");H.className="tbw-filter-buttons";const I=document.createElement("button");I.type="button",I.className="tbw-filter-apply-btn",I.textContent=t.t("filter.apply","Apply"),I.addEventListener("click",()=>{const e=[];for(const[t,n]of N)if(!n)if("__null__"===t)e.push(null);else{const n=r.find(e=>String(e)===t);e.push(void 0!==n?n:t)}t.applySetFilter(e)}),H.appendChild(I);const z=document.createElement("button");z.type="button",z.className="tbw-filter-clear-btn",z.textContent=t.t("filter.clear","Clear Filter"),z.addEventListener("click",()=>{t.clearFilter()}),H.appendChild(z),e.appendChild(H)}function v(e,t){if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t}var w=e=>!0===e.__loading,y=class t extends e{static manifest={events:[{type:"filter-change",description:"Emitted when filter criteria change. Broadcast to both DOM consumers and plugin bus."}],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{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);flex:1}tbw-grid .tbw-quick-filter-input:focus{border-color:var(--tbw-color-accent);outline:none}tbw-grid .header-cell.filtered:before{content:"";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%;position:absolute}tbw-grid .tbw-filter-btn{display:var(--tbw-filter-btn-display,inline-flex);visibility:var(--tbw-filter-btn-visibility,visible);cursor:pointer;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;background:0 0;border:none;justify-content:center;align-items:center;padding:2px}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{visibility:visible;display:inline-flex}@media (hover:none){tbw-grid .header-row .cell .tbw-filter-btn{visibility:visible;display:inline-flex}}tbw-grid .tbw-filter-btn{min-width:var(--tbw-touch-target-min,24px);min-height:var(--tbw-touch-target-min,24px)}}';get defaultConfig(){return{debounceMs:300,caseSensitive:!1}}isFilteringEnabled(){return!1!==this.grid.effectiveConfig?.filterable}isColumnFilterable(e){return!!this.isFilteringEnabled()&&!1!==e.filterable}getDataRows(){const e=this.sourceRows;if(e.length>0)return e;const t=this.rows;return 0===t.length?t:t.filter(e=>null!=e&&!0!==e.__loading)}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const r of e){if(!r.field)continue;const e=this.getFilterExtractor(r);e&&(t||(t=/* @__PURE__ */new Map),t.set(r.field,e))}return t}getFilterExtractor(e){const{filterValue:t}=e;return t?(e,r)=>!0===r.__loading?void 0:t(e,r):e.valueAccessor?(t,r)=>i(r,e):void 0}filters=/* @__PURE__ */new Map;cachedResult=null;cacheKey=null;cachedInputRows=null;openPanelField=null;panelElement=null;panelAnchorElement=null;panelButtonElement=null;searchText=/* @__PURE__ */new Map;excludedValues=/* @__PURE__ */new Map;panelAbortController=null;globalStylesInjected=!1;columnLookup=null;columnLookupRef=null;getColumnByField(e){const t=this.grid.effectiveConfig?.columns;if(!t)return;let r=this.columnLookup;if(t!==this.columnLookupRef||!r){r=/* @__PURE__ */new Map;for(const e of t)e.field&&r.set(e.field,e);this.columnLookup=r,this.columnLookupRef=t}return r.get(e)}computeSelected(){const e={},t=[];for(const[r,n]of this.filters)if("set"===n.type)if("in"===n.operator&&Array.isArray(n.value))e[r]=n.value;else if("notIn"===n.operator){const e=this.getColumnByField(r);t.push({field:r,filterValue:e?this.getFilterExtractor(e):void 0})}if(t.length>0){const n=function(e,t){const n=/* @__PURE__ */new Map,i=/* @__PURE__ */new Map;for(const{field:l,filterValue:o}of t)n.set(l,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!o}),i.set(l,r(l));for(const r of e)for(const{field:e,filterValue:l}of t){const t=n.get(e),a=i.get(e)(r);if(l){const e=l(a,r);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!=a&&""!==a?t.values.add(a):t.hasBlank=!0}const a=/* @__PURE__ */new Map;for(const[r,{values:o,hasBlank:s}]of n)s&&o.add(l),a.set(r,[...o].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return a}(this.getDataRows(),t);for(const{field:r}of t){const t=this.excludedValues.get(r),i=n.get(r)??[];e[r]=t?i.filter(e=>!t.has(e)):i}}return e}invalidateCache(){this.cachedResult=null,this.cacheKey=null,this.cachedInputRows=null}notifyFilterChange(e,t,r){r?this.emitPluginEvent("filter-change",{filters:e}):(this.broadcast("filter-change",{filters:e,filteredRowCount:t,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.())}syncExcludedValues(e,t){if(t)if("set"===t.type&&"notIn"===t.operator&&Array.isArray(t.value))this.excludedValues.set(e,new Set(t.value));else if("set"===t.type&&"in"===t.operator&&Array.isArray(t.value)){const r=this.getDataRows();if(!r||0===r.length)return void this.excludedValues.delete(e);const n=t.value,i=new Set(n.map(e=>null==e?l:e)),a=this.getUniqueValues(e),o=new Set(a.filter(e=>!i.has(e)));this.excludedValues.set(e,o)}else"set"===t.type&&this.excludedValues.delete(e);else this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles();const t=()=>{this.cachedInputRows=null};this.on("cell-edit-committed",t),this.on("cell-edit-reverted",t),this.gridElement?.addEventListener("cell-change",t,{signal:this.disconnectSignal})}detach(){super.detach(),this.filters.clear(),this.invalidateCache(),this.columnLookup=null,this.columnLookupRef=null,this.openPanelField=null,this.panelElement&&(this.dismissTopLayer(this.panelElement),this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}handleQuery(e){if("filter:get-model"===e.type){if(!this.filters.size)return;return Object.fromEntries(this.filters)}if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const r=t.column;if(!r?.field)return;if(!this.isFilteringEnabled())return;if(!this.isColumnFilterable(r))return;const n=[],i=this.isFieldFiltered(r.field),l=this.filters.size>0;return i&&n.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(r.field)}),l&&n.push({id:"filtering/clear-all-filters",label:this.t("filter.clearAll","Clear All Filters"),icon:"✕",order:21,disabled:!l,action:()=>this.clearAllFilters()}),n.length>0?n:void 0}}processRows(e){if(!this.filters.size)return e;const t=[...this.filters.values()];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:e;const r=this.grid.query?.("datasource:filter-mode",null)?.[0];if("server"===r)return e;const n="local"===r?w:void 0,i=(l=t,JSON.stringify(l.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var l;const a=e===this.cachedInputRows;if(this.cacheKey===i&&this.cachedResult&&a)return this.cachedResult;if(!a)for(const[s,c]of this.filters)"set"===c.type&&"in"===c.operator&&this.syncExcludedValues(s,c);const o=function(e,t,r=!1,n,i){if(!t.length)return e;const l=t.map(e=>s(e,r,n?.get(e.field))),a=1===l.length?l[0]:e=>{for(let t=0;t<l.length;t++)if(!l[t](e))return!1;return!0};return i?e.filter(e=>i(e)||a(e)):e.filter(a)}(e,t,this.config.caseSensitive,this.getFilterValues(),n);return this.cachedResult=o,this.cacheKey=i,this.cachedInputRows=e,o}afterRender(){const e=this.gridElement;e&&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(!0===r.utility)return;const n=r.field;if(!n)return;const i=this.filters.has(n);let l=e.querySelector(".tbw-filter-btn");if(l){const t=l.classList.contains("active");return l.classList.toggle("active",i),e.classList.toggle("filtered",i),i?e.setAttribute("aria-description","Filtered"):e.removeAttribute("aria-description"),void(t!==i&&this.setIcon(l,i?"filterActive":"filter"))}l=document.createElement("button"),l.type="button",l.className="tbw-filter-btn",l.setAttribute("aria-label",`Filter ${r.header??n}`),this.setIcon(l,i?"filterActive":"filter"),i&&(l.classList.add("active"),e.classList.add("filtered"),e.setAttribute("aria-description","Filtered")),l.addEventListener("click",e=>{e.stopPropagation(),this.toggleFilterPanel(n,r,l)});const a=e.querySelector(".resize-handle");a?e.insertBefore(l,a):e.appendChild(l)})}setFilter(e,t,r){if(null===t)this.filters.delete(e),this.syncExcludedValues(e,null);else{const r={...t,field:e};this.filters.set(e,r),this.syncExcludedValues(e,r)}if(this.invalidateCache(),this.notifyFilterChange([...this.filters.values()],0,r?.silent),!r?.silent){const r=this.getColumnByField(e)?.header??e;u(this.gridElement,p(this.gridElement,null===t?"filterCleared":"filterApplied",r))}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.invalidateCache(),this.notifyFilterChange([...this.filters.values()],0,t?.silent),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent),e?.silent||u(this.gridElement,p(this.gridElement,"allFiltersCleared"))}clearFieldFilter(e,t){if(this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent),!t?.silent){const t=this.getColumnByField(e)?.header??e;u(this.gridElement,p(this.gridElement,"filterCleared",t))}}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const t=this.getColumnByField(e)?.filterValue;return c(this.getDataRows(),e,t)}getStaleFilters(){const e=[];for(const[t,r]of this.filters){if("set"!==r.type)continue;const n=this.getUniqueValues(t);if("notIn"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===n.filter(e=>!t.has(e)).length&&e.push(r)}else if("in"===r.operator&&Array.isArray(r.value)){const t=new Set(r.value);0===n.filter(e=>t.has(e)).length&&e.push(r)}}return e}getBlankMode(e){const t=this.filters.get(e);return"blank"===t?.operator?"blanksOnly":"notBlank"===t?.operator?"nonBlanksOnly":"all"}toggleBlankFilter(e,t){if("all"===t){const t=this.filters.get(e);if(t?.valueTo&&"object"==typeof t.valueTo){const r=t.valueTo;this.setFilter(e,r)}else this.setFilter(e,null);return}const r=this.filters.get(e),n=r&&"blank"!==r.operator&&"notBlank"!==r.operator?{type:r.type,operator:r.operator,value:r.value,valueTo:r.valueTo}:r?.valueTo;this.setFilter(e,{type:r?.type??"text",operator:"blanksOnly"===t?"blank":"notBlank",value:"",valueTo:n})}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const n of t.classList)n.startsWith("tbw-")||"selecting"===n||e.classList.add(n);const r=t.dataset.theme;r&&(e.dataset.theme=r)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles"))return void(this.globalStylesInjected=!0);const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent="@layer tbw-plugins{.tbw-filter-panel{background:var(--tbw-filter-panel-bg,var(--tbw-color-panel-bg,light-dark(#eee,#222)));color:var(--tbw-filter-panel-fg,var(--tbw-color-fg,light-dark(#222,#eee)));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(#0000001a,#0000004d)));padding:var(--tbw-panel-padding,var(--tbw-spacing-lg,.75rem));z-index:10000;min-width:200px;max-width:280px;max-height:350px;font-family:var(--tbw-font-family,system-ui, sans-serif);font-size:var(--tbw-font-size,.8125rem);transform-origin:top;flex-direction:column;display:flex;position:fixed}.tbw-filter-panel.tbw-filter-panel-above{transform-origin:bottom}.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);right:anchor(right);position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;margin-inline:0;margin-top:4px;bottom:auto;left:auto}}.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{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%);outline:none}.tbw-filter-actions{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);display:flex}.tbw-filter-actions .tbw-filter-value-item{flex:1}.tbw-filter-values{margin-bottom:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));flex:1;max-height:180px;position:relative;overflow-y:auto}.tbw-filter-values-spacer{width:1px}.tbw-filter-values-content{position:absolute;top:0;left:0;right:0}.tbw-filter-value-item{align-items:center;gap:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));padding:var(--tbw-button-padding-sm,.25rem .125rem);cursor:pointer;height:var(--tbw-filter-item-height,28px);border-radius:3px;display:flex}.tbw-filter-value-item:hover{background:var(--tbw-filter-hover,var(--tbw-color-row-hover,light-dark(#f0f6ff,#1c1c1c)))}.tbw-filter-checkbox{cursor:pointer;accent-color:var(--tbw-filter-accent,var(--tbw-color-accent,#3b82f6));margin:0}.tbw-filter-no-match{color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)));padding:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem)) 0;text-align:center;font-style:italic}.tbw-filter-buttons{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)));display:flex}.tbw-filter-apply-btn{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(#fff,#000)));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);border:none;flex:1}.tbw-filter-apply-btn:hover{filter:brightness(.9)}.tbw-filter-clear-btn{padding:var(--tbw-filter-btn-padding,var(--tbw-button-padding,.375rem .75rem));color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)));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);background:0 0;flex:1}.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{align-items:flex-end;gap:var(--tbw-spacing-sm,.375rem);margin-bottom:var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));display:flex}.tbw-filter-range-group,.tbw-filter-date-group{gap:var(--tbw-spacing-xs,.25rem);flex-direction:column;flex:1;display:flex}.tbw-filter-range-label{font-size:var(--tbw-font-size-xs,.75rem);color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)))}.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{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%);outline:none}.tbw-filter-range-separator{color:var(--tbw-filter-muted,var(--tbw-color-fg-muted,light-dark(#555,#aaa)));padding-bottom:var(--tbw-spacing-xs,.25rem)}.tbw-filter-blank-option{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;display:flex}.tbw-filter-blank-checkbox{accent-color:var(--tbw-filter-accent,var(--tbw-color-accent,#3b82f6));cursor:pointer;margin:0}.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{height:24px;margin:var(--tbw-spacing-md,.5rem) 0 var(--tbw-panel-gap,var(--tbw-spacing-md,.5rem));position:relative}.tbw-filter-range-track{background:var(--tbw-filter-input-border,var(--tbw-color-border,light-dark(#d0d0d4,#454545)));border-radius:2px;height:4px;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.tbw-filter-range-fill{background:var(--tbw-filter-accent,var(--tbw-color-accent,#3b82f6));border-radius:2px;height:4px;position:absolute;top:50%;transform:translateY(-50%)}.tbw-filter-range-thumb{pointer-events:none;appearance:none;background:0 0;width:100%;height:100%;position:absolute;top:0}.tbw-filter-range-thumb::-webkit-slider-thumb{appearance:none;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(#eee,#222)));cursor:pointer;pointer-events:all;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-moz-range-thumb{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(#eee,#222)));cursor:pointer;pointer-events:all;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-webkit-slider-thumb:hover{transform:scale(1.1)}.tbw-filter-range-thumb::-moz-range-thumb:hover{transform:scale(1.1)}}",document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,r){if(this.openPanelField===e)return void this.closeFilterPanel();this.closeFilterPanel();const n=document.createElement("div");if(n.className="tbw-filter-panel",this.copyGridThemeContext(n),this.isAnimationEnabled&&n.classList.add("tbw-filter-panel-animated"),this.panelElement=n,this.openPanelField=e,r.classList.add("active"),this.panelButtonElement=r,this.config.valuesHandler)return n.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(n),this.promoteToTopLayer(n),this.positionPanel(n,r),this.setupPanelCloseHandler(n,r),void this.config.valuesHandler(e,t).then(r=>{if(this.openPanelField!==e||!this.panelElement)return;n.innerHTML="";const{values:i,labels:a}=function(e,t){let r;const n=/* @__PURE__ */new Set,i=[];for(const a of e){const e=d(a)?a:void 0,o=e?e.value:a,s=null==o||t&&""===o?l:o;n.has(s)||(n.add(s),i.push(s),e&&(r??=/* @__PURE__ */new Map).set(s,e.label))}return{values:i,labels:r}}(r,!this.getFilterExtractor(t));this.renderPanelContent(e,t,n,i,{labels:a})});const i=/* @__PURE__ */new Map,a=c(this.getDataRows(),e,this.getFilterExtractor(t),i);document.body.appendChild(n),this.promoteToTopLayer(n),this.positionPanel(n,r),this.renderPanelContent(e,t,n,a,{rows:i}),this.setupPanelCloseHandler(n,r)}renderPanelContent(e,t,r,n,i){const a=this.filters.get(e);if("in"===a?.operator&&"set"===a.type&&Array.isArray(a.value)&&!this.excludedValues.has(e)){const t=a.value,r=new Set(t.map(e=>null==e?l:e)),i=new Set(n.filter(e=>!r.has(e)));this.excludedValues.set(e,i)}let o=this.excludedValues.get(e);o||(o=/* @__PURE__ */new Set,this.excludedValues.set(e,o));const s=this.searchText.get(e)??"",c={field:e,column:t,uniqueValues:n,excludedValues:o,searchText:s,currentFilter:this.filters.get(e),applySetFilter:(t,r)=>{this.applySetFilter(e,t,r),this.closeFilterPanel()},applyTextFilter:(t,r,n)=>{this.applyTextFilter(e,t,r,n),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel(),t:this.translate};let d=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(r,c),d=r.children.length>0),!d&&t.type){const e=this.grid.effectiveConfig.typeDefaults?.[t.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(r,c),d=r.children.length>0)}if(!d){const l=t.filterType??t.type;"number"===l?function(e,t,r,n){const{field:i,column:l}=t,a=l.filterParams,o=l.editorParams,s=r.filter(e=>"number"==typeof e&&!isNaN(e)),c=s.length>0?Math.min(...s):0,d=s.length>0?Math.max(...s):100,u=v(a?.min??o?.min,c),p=v(a?.max??o?.max,d),f=a?.step??o?.step??1,h=s.length>0?Math.max(u,c):u,b=s.length>0?Math.min(p,d):p,m=n.get(i);let g=h,w=b;const y="blank"===m?.operator;"between"===m?.operator?(g=v(m.value,h),w=v(m.valueTo,b)):"greaterThanOrEqual"===m?.operator?g=v(m.value,h):"lessThanOrEqual"===m?.operator&&(w=v(m.value,b));const x=document.createElement("div");x.className="tbw-filter-range-inputs";const C=document.createElement("div");C.className="tbw-filter-range-group";const E=document.createElement("label");E.textContent=t.t("filter.min","Min"),E.className="tbw-filter-range-label";const F=document.createElement("input");F.type="number",F.className="tbw-filter-range-input",F.min=String(u),F.max=String(p),F.step=String(f),F.value=String(g),C.appendChild(E),C.appendChild(F),x.appendChild(C);const k=document.createElement("span");k.className="tbw-filter-range-separator",k.textContent="–",x.appendChild(k);const S=document.createElement("div");S.className="tbw-filter-range-group";const N=document.createElement("label");N.textContent=t.t("filter.max","Max"),N.className="tbw-filter-range-label";const T=document.createElement("input");T.type="number",T.className="tbw-filter-range-input",T.min=String(u),T.max=String(p),T.step=String(f),T.value=String(w),S.appendChild(N),S.appendChild(T),x.appendChild(S),e.appendChild(x);const A=document.createElement("div");A.className="tbw-filter-range-slider";const L=document.createElement("div");L.className="tbw-filter-range-track";const P=document.createElement("div");P.className="tbw-filter-range-fill";const M=document.createElement("input");M.type="range",M.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",M.min=String(u),M.max=String(p),M.step=String(f),M.value=String(g);const R=document.createElement("input");R.type="range",R.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",R.min=String(u),R.max=String(p),R.step=String(f),R.value=String(w),A.appendChild(L),A.appendChild(P),A.appendChild(M),A.appendChild(R),e.appendChild(A);const B=document.createElement("label");B.className="tbw-filter-blank-option";const V=document.createElement("input");V.type="checkbox",V.className="tbw-filter-blank-checkbox",V.checked=y;const q=document.createTextNode("Blank");B.appendChild(V),B.appendChild(q);const H=e=>{F.disabled=e,T.disabled=e,M.disabled=e,R.disabled=e,x.classList.toggle("tbw-filter-disabled",e),A.classList.toggle("tbw-filter-disabled",e)};H(y),V.addEventListener("change",()=>{H(V.checked)}),e.appendChild(B);const I=()=>{const e=parseFloat(M.value),t=parseFloat(R.value),r=p-u,n=(e-u)/r*100,i=(t-u)/r*100;P.style.left=`${n}%`,P.style.width=i-n+"%"};M.addEventListener("input",()=>{const e=Math.min(parseFloat(M.value),parseFloat(R.value));M.value=String(e),F.value=String(e),I()}),R.addEventListener("input",()=>{const e=Math.max(parseFloat(R.value),parseFloat(M.value));R.value=String(e),T.value=String(e),I()}),F.addEventListener("input",()=>{const e=parseFloat(F.value);let t=Number.isFinite(e)?e:u;t=Math.max(u,Math.min(t,parseFloat(T.value))),M.value=String(t),I()}),T.addEventListener("input",()=>{const e=parseFloat(T.value);let t=Number.isFinite(e)?e:p;t=Math.min(p,Math.max(t,parseFloat(F.value))),R.value=String(t),I()}),I();const z=document.createElement("div");z.className="tbw-filter-buttons";const _=document.createElement("button");_.type="button",_.className="tbw-filter-apply-btn",_.textContent=t.t("filter.apply","Apply"),_.addEventListener("click",()=>{if(V.checked)return void t.applyTextFilter("blank","");const e=parseFloat(F.value),r=parseFloat(T.value),n=Number.isFinite(e)?e:h,i=Number.isFinite(r)?r:b;n!==h||i!==b?t.applyTextFilter("between",n,i):t.clearFilter()}),z.appendChild(_);const D=document.createElement("button");D.type="button",D.className="tbw-filter-clear-btn",D.textContent=t.t("filter.clear","Clear Filter"),D.addEventListener("click",()=>{t.clearFilter()}),z.appendChild(D),e.appendChild(z)}(r,c,n,this.filters):"date"===l?function(e,t,r,n){const{field:i,column:l}=t,a=l.filterParams,o=l.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())),c=s.length>0?new Date(Math.min(...s.map(e=>e.getTime()))):null,d=s.length>0?new Date(Math.max(...s.map(e=>e.getTime()))):null,u=h(a?.min)||h(o?.min)||f(c),p=h(a?.max)||h(o?.max)||f(d),b=f(c)||h(a?.min)||h(o?.min),m=f(d)||h(a?.max)||h(o?.max),g=n.get(i);let v=b,w=m;const y="blank"===g?.operator;"between"===g?.operator?(v=h(g.value)||b,w=h(g.valueTo)||m):"greaterThanOrEqual"===g?.operator?v=h(g.value)||b:"lessThanOrEqual"===g?.operator&&(w=h(g.value)||m);const x=document.createElement("div");x.className="tbw-filter-date-range";const C=document.createElement("div");C.className="tbw-filter-date-group";const E=document.createElement("label");E.textContent=t.t("filter.from","From"),E.className="tbw-filter-range-label";const F=document.createElement("input");F.type="date",F.className="tbw-filter-date-input",u&&(F.min=u),p&&(F.max=p),F.value=v,C.appendChild(E),C.appendChild(F),x.appendChild(C);const k=document.createElement("span");k.className="tbw-filter-range-separator",k.textContent="–",x.appendChild(k);const S=document.createElement("div");S.className="tbw-filter-date-group";const N=document.createElement("label");N.textContent="To",N.className="tbw-filter-range-label";const T=document.createElement("input");T.type="date",T.className="tbw-filter-date-input",u&&(T.min=u),p&&(T.max=p),T.value=w,S.appendChild(N),S.appendChild(T),x.appendChild(S),e.appendChild(x);const A=document.createElement("label");A.className="tbw-filter-blank-option";const L=document.createElement("input");L.type="checkbox",L.className="tbw-filter-blank-checkbox",L.checked=y;const P=document.createTextNode("Show only blank");A.appendChild(L),A.appendChild(P);const M=e=>{F.disabled=e,T.disabled=e,x.classList.toggle("tbw-filter-disabled",e)};M(y),L.addEventListener("change",()=>{M(L.checked)}),e.appendChild(A);const R=document.createElement("div");R.className="tbw-filter-buttons";const B=document.createElement("button");B.type="button",B.className="tbw-filter-apply-btn",B.textContent=t.t("filter.apply","Apply"),B.addEventListener("click",()=>{if(L.checked)return void t.applyTextFilter("blank","");const e=F.value,r=T.value,n=e&&e!==b?e:"",i=r&&r!==m?r:"";n&&i?t.applyTextFilter("between",n,i):n?t.applyTextFilter("greaterThanOrEqual",n):i?t.applyTextFilter("lessThanOrEqual",i):t.clearFilter()}),R.appendChild(B);const V=document.createElement("button");V.type="button",V.className="tbw-filter-clear-btn",V.textContent=t.t("filter.clear","Clear Filter"),V.addEventListener("click",()=>{t.clearFilter()}),R.appendChild(V),e.appendChild(R)}(r,c,n,this.filters):g(r,c,n,o,{caseSensitive:this.config.caseSensitive,debounceMs:this.config.debounceMs},this.searchText,{...i,onFormatError:t=>this.warn("TBW062",`Format error in column '${e}' while labelling filter values: ${t}`)})}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController;const{signal:r}=this.panelAbortController;setTimeout(()=>{r.aborted||document.addEventListener("click",r=>{e.contains(r.target)||r.target===t||this.closeFilterPanel()},{signal:r})},0)}promoteToTopLayer(e){if("function"==typeof e.showPopover){e.setAttribute("popover","manual");try{e.showPopover()}catch{}}}dismissTopLayer(e){if(e.hasAttribute("popover")&&"function"==typeof e.hidePopover)try{e.hidePopover()}catch{}}closeFilterPanel(){const e=this.panelElement;if(e&&(this.dismissTopLayer(e),e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.panelButtonElement){const e=this.openPanelField;e&&this.filters.has(e)||this.panelButtonElement.classList.remove("active"),this.panelButtonElement=null}this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return null===t.supportsAnchorPositioning&&(t.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),t.supportsAnchorPositioning}positionPanel(e,r){const n=r.closest(".header-row")??r;if(n.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=n,t.checkAnchorPositioningSupport()){n.style.anchorName="",r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r;const t=n.getBoundingClientRect().bottom-r.getBoundingClientRect().bottom;return e.style.marginTop=`${t+4}px`,void requestAnimationFrame(()=>{const t=e.getBoundingClientRect(),n=r.getBoundingClientRect();t.top<n.top&&e.classList.add("tbw-filter-panel-above")})}const i=n.getBoundingClientRect(),l=r.getBoundingClientRect();e.style.position="fixed",e.style.top=`${i.bottom+4}px`,e.style.left=`${l.right}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();e.style.left=l.right-t.width+"px",l.right-t.width<8&&(e.style.left=`${l.left}px`),t.bottom>window.innerHeight-8&&(e.style.top=i.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}applySetFilter(e,t,r){if(this.excludedValues.set(e,new Set(t)),0===t.length)this.filters.delete(e);else if("in"===this.filters.get(e)?.operator){const n=this.getUniqueValues(e),i=new Set(t),l=n.filter(e=>!i.has(e));this.filters.set(e,{field:e,type:"set",operator:"in",value:l,...void 0!==r&&{valueTo:r}})}else this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==r&&{valueTo:r}});this.applyFiltersInternal()}applyTextFilter(e,t,r,n){const i=this.getColumnByField(e),l=i?.filterType??i?.type??"text";this.filters.set(e,{field:e,type:l,operator:t,value:r,valueTo:n}),this.applyFiltersInternal()}applyFiltersInternal(e){this.invalidateCache();const t=[...this.filters.values()];if(this.config.filterHandler){this.gridElement.setAttribute("aria-busy","true");const r=this.config.filterHandler(t,this.sourceRows),n=r=>{this.gridElement.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,this.notifyFilterChange(t,r.length,e),this.requestRender()};return void(r&&"function"==typeof r.then?r.then(n):n(r))}this.notifyFilterChange(t,0,e),this.requestRender()}getColumnState(e){if(!this.config.trackColumnState)return;const t=this.filters.get(e);return t?{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}:void 0}applyColumnState(e,t){if(!this.config.trackColumnState)return;if(!t.filter)return void this.filters.delete(e);const r={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,r),this.invalidateCache()}};export{l as BLANK_FILTER_VALUE,y as FilteringPlugin};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|