@toolbox-web/grid 3.5.2 → 3.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +17 -17
  2. package/all.js +1 -1
  3. package/all.js.map +1 -1
  4. package/index.js +1 -1
  5. package/index.js.map +1 -1
  6. package/lib/features/registry.js +1 -1
  7. package/lib/plugins/clipboard/index.js +1 -1
  8. package/lib/plugins/column-virtualization/index.js +1 -1
  9. package/lib/plugins/context-menu/index.js +1 -1
  10. package/lib/plugins/editing/index.js +1 -1
  11. package/lib/plugins/export/index.js +1 -1
  12. package/lib/plugins/filtering/index.js +1 -1
  13. package/lib/plugins/grouping-columns/index.js +1 -1
  14. package/lib/plugins/grouping-rows/index.js +1 -1
  15. package/lib/plugins/master-detail/index.js +1 -1
  16. package/lib/plugins/multi-sort/index.js +1 -1
  17. package/lib/plugins/pinned-columns/index.js +1 -1
  18. package/lib/plugins/pinned-rows/index.js +1 -1
  19. package/lib/plugins/pivot/index.js +1 -1
  20. package/lib/plugins/print/index.js +1 -1
  21. package/lib/plugins/reorder-columns/index.js +1 -1
  22. package/lib/plugins/responsive/index.js +1 -1
  23. package/lib/plugins/row-drag-drop/index.js +1 -1
  24. package/lib/plugins/selection/index.js +1 -1
  25. package/lib/plugins/server-side/index.js +1 -1
  26. package/lib/plugins/shell/index.js +1 -1
  27. package/lib/plugins/sticky-rows/index.js +1 -1
  28. package/lib/plugins/tooltip/index.js +1 -1
  29. package/lib/plugins/tree/index.js +1 -1
  30. package/lib/plugins/undo-redo/index.js +1 -1
  31. package/lib/plugins/visibility/index.js +1 -1
  32. package/package.json +1 -1
  33. package/umd/grid.all.umd.js +1 -1
  34. package/umd/grid.all.umd.js.map +1 -1
  35. package/umd/grid.umd.js +1 -1
  36. package/umd/grid.umd.js.map +1 -1
@@ -1,2 +1,2 @@
1
- var e=/* @__PURE__ */new WeakMap;function t(e){return"__proto__"===e||"constructor"===e||"prototype"===e}var r=/* @__PURE__ */new Map;function n(e){if(-1===e.indexOf("."))return null;let t=r.get(e);return void 0===t&&(t=Object.freeze(e.split(".")),r.set(e,t)),t}function o(e,r){let n=e;for(let o=0;o<r.length;o++){if(null==n||"object"!=typeof n)return;const e=r[o];if(t(e))return;n=n[e]}return n}function s(r,s,i=-1){if(!s.valueAccessor)return function(e,r){if(null==e)return;const s=n(r),i=e;return null===s?t(r)?void 0:i[r]:Object.prototype.hasOwnProperty.call(i,r)?i[r]:o(i,s)}(r,s.field);if("object"!=typeof r||null===r)return s.valueAccessor({row:r,column:s,rowIndex:i});const l=r,a=s.field;let c=e.get(l);if(c){const e=c.get(a);if(void 0!==e)return e.v}else c=/* @__PURE__ */new Map,e.set(l,c);const u=s.valueAccessor({row:r,column:s,rowIndex:i});return c.set(a,{v:u}),u}function i(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function l(e,t,r,n){return`${i(r,n)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}var a="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),c=(new RegExp(`__(proto|defineGetter|defineSetter)|${a.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),u=/^on\w+$/i,f=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),d=/^\s*(javascript|vbscript|data|blob):/i;function p(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(c.has(e)){t.push(n);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI)&&Array.from(n.attributes).some(e=>u.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();u.test(e)?r.push(t.name):"is"!==e?(f.has(e)&&d.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}var h={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};var g=class{static dependencies;static manifest;aliases;version="3.5.2";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const t={...this.userConfig},r={};for(const n of Object.keys(t))r[n]=this;for(const n of e){const e=n.userConfig;for(const[o,s]of Object.entries(e)){if(void 0===s)continue;if(!(o in t)){t[o]=s,r[o]=n;continue}if(t[o]===s)continue;const e=r[o]?.constructor.name??this.constructor.name,i=n.constructor.name,a=l("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${o}" supplied by both ${e} and ${i}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(a)}}Object.assign(this.userConfig,t)}refreshUserConfigFrom(e){const t=this.userConfig,r={...e.userConfig};for(const n of Object.keys(t))delete t[n];Object.assign(t,r)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const r=this.grid?.query?.(e,t);return Array.isArray(r)?r.some(Boolean):!!r}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...h,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}setIcon(e,t,r){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const n=this.#t(t,r);var o,s;void 0!==n?"string"==typeof n?(o=e,(s=n)&&"string"==typeof s?-1!==s.indexOf("<")||-1!==s.indexOf("&")?o.replaceChildren(p(s)):o.textContent=s:o.replaceChildren()):n instanceof HTMLElement&&e.replaceChildren(n.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const r=document.createElement("span");r.setAttribute("part","sort-indicator"),r.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(r,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(r,"sortNone"));const n=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return n?e.insertBefore(r,n):e.appendChild(r),r}warn(e,t){void 0!==t?console.warn(l(e,t,this.gridElement.id,this.name)):console.warn(`${i(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(l(e,t,this.gridElement.id,this.name))}};function m(e,t,r=!0){let n=e;if(r&&(n=n.filter(e=>!e.hidden&&!e.field.startsWith("__")&&!0!==e.utility)),t?.length){const e=new Set(t);n=n.filter(t=>e.has(t.field))}return n}function y(e,t){return t?.length?[...t].sort((e,t)=>e-t).map(t=>e[t]).filter(e=>null!=e):e}var b=/^[=+\-@\t\r]/;function v(e,t){if("string"==typeof e){const r=!1!==t.escapeFormulas&&b.test(e)?`'${e}`:e,n=t.quoting??"auto";return"always"===n||"auto"===n&&(r.includes(t.delimiter)||r.includes(t.newline)||r.includes('"')||r.includes("\n")||r.includes("\r"))?`"${r.replace(/"/g,'""')}"`:r}return"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":null==e?"":e instanceof Date?e.toISOString():"object"==typeof e?JSON.stringify(e):String(e)}function w(e,t,r,n={}){const o=n.delimiter??",",i=n.newline??"\n",l={delimiter:o,newline:i,quoting:n.quoteStrings??1?"auto":"never",escapeFormulas:n.escapeFormulas},a=[],c=n.bom?"\ufeff":"";if(!1!==r.includeHeaders){const e=t.map(e=>{const t=e.header||e.field;return v(r.processHeader?r.processHeader(t,e.field):t,l)});a.push(e.join(o))}for(const u of e){const e=t.map(e=>{let t=s(u,e);return r.processCell&&(t=r.processCell(t,e.field,u)),v(t,l)});a.push(e.join(o))}return c+a.join(i)}function S(e,t){const r=URL.createObjectURL(e),n=document.createElement("a");n.href=r,n.download=t,n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(r)}function x(e){return JSON.stringify(C(e))}function C(e){if(null==e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(C);const t={};for(const r of Object.keys(e).sort())t[r]=C(e[r]);return t}var E=class{#r=/* @__PURE__ */new Map;#n=0;register(e){const t=x(e),r=this.#r.get(t);if(r)return r.id;this.#n++;const n=`s${this.#n}`;return this.#r.set(t,{id:n,style:e}),n}getStyleId(e){return this.#r.get(x(e))?.id}get size(){return this.#r.size}toXml(){if(0===this.#r.size)return"";let e="\n<Styles>";for(const{id:t,style:r}of this.#r.values())e+=$(t,r);return e+="\n</Styles>",e}};function $(e,t){let r=`\n<Style ss:ID="${e}">`;if(t.font&&(r+="<Font",t.font.name&&(r+=` ss:FontName="${t.font.name}"`),t.font.size&&(r+=` ss:Size="${t.font.size}"`),t.font.bold&&(r+=' ss:Bold="1"'),t.font.italic&&(r+=' ss:Italic="1"'),t.font.color&&(r+=` ss:Color="${t.font.color}"`),r+="/>"),t.fill){const e=t.fill.pattern??"Solid";r+=`<Interior ss:Color="${t.fill.color}" ss:Pattern="${e}"/>`}return t.numberFormat&&(r+=`<NumberFormat ss:Format="${t.numberFormat}"/>`),t.alignment&&(r+="<Alignment",t.alignment.horizontal&&(r+=` ss:Horizontal="${t.alignment.horizontal}"`),t.alignment.vertical&&(r+=` ss:Vertical="${t.alignment.vertical}"`),t.alignment.wrapText&&(r+=' ss:WrapText="1"'),r+="/>"),t.borders&&(r+="<Borders>",t.borders.top&&(r+=R("Top",t.borders.top)),t.borders.bottom&&(r+=R("Bottom",t.borders.bottom)),t.borders.left&&(r+=R("Left",t.borders.left)),t.borders.right&&(r+=R("Right",t.borders.right)),r+="</Borders>"),r+="</Style>",r}function R(e,t){let r=`<Border ss:Position="${e}" ss:LineStyle="Continuous" ss:Weight="${function(e){switch(e){case"Thin":return 1;case"Medium":return 2;case"Thick":return 3}}(t.style)}"`;return t.color&&(r+=` ss:Color="${t.color}"`),r+="/>",r}function A(e,t,r,n,o){if(t.cellStyle){const s=t.cellStyle(r,n,o);if(s)return e.register(s)}const s=t.columnStyles?.[n];return s?e.getStyleId(s):t.defaultStyle?e.getStyleId(t.defaultStyle):void 0}function D(e,r){const s=Math.min(r.length,50);let i=(e.header??e.field).length;const l=function(e){const r=n(e);return null===r?t(e)?()=>{}:t=>null==t?void 0:t[e]:t=>{if(null==t)return;const n=t;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:o(n,r)}}(e.field);for(let t=0;t<s;t++){const e=l(r[t]),n=null==e?0:String(e).length;n>i&&(i=n)}return i+2}function j(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function H(e){return null==e?{type:"String",displayValue:""}:"number"!=typeof e||isNaN(e)?e instanceof Date?{type:"DateTime",displayValue:e.toISOString()}:{type:"String",displayValue:j(String(e))}:{type:"Number",displayValue:String(e)}}function I(e,t,r){const n=r.excelStyles,o=n?function(e){const t=new E;if(e.headerStyle&&t.register(e.headerStyle),e.groupHeaderStyle&&t.register(e.groupHeaderStyle),e.defaultStyle&&t.register(e.defaultStyle),e.columnStyles)for(const r of Object.values(e.columnStyles))t.register(r);return t}(n):void 0;let i='<?xml version="1.0" encoding="UTF-8"?>\n<?mso-application progid="Excel.Sheet"?>\n<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"\n xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">';o&&n&&(i+=function(e,t,r,n){if(t.cellStyle)for(const o of r)for(const r of n){const n=t.cellStyle(s(o,r),r.field,o);n&&e.register(n)}return e.toXml()}(o,n,e,t)),i+='\n<Worksheet ss:Name="Sheet1">\n<Table>',n&&(i+=function(e,t,r){const n=r.columnWidths,o=r.autoFitColumns;if(!n&&!o)return"";let s="";for(const i of e){let e=n?.[i.field];null==e&&o&&(e=D(i,t)),s+=null!=e?`\n<Column ss:Width="${7*e}"/>`:"\n<Column/>"}return s}(t,e,n));const l=n?.headerStyle&&o?o.getStyleId(n.headerStyle):void 0,a=n?.groupHeaderStyle&&o?o.getStyleId(n.groupHeaderStyle):l;return!1!==r.includeHeaders&&(i+=function(e,t){if(!e.headerRows?.length)return"";const r=t?` ss:StyleID="${t}"`:"";let n="";for(const o of e.headerRows){n+="\n<Row>";for(const e of o.cells){const t=Math.max(1,0|e.span);n+=`<Cell${r}${t>1?` ss:MergeAcross="${t-1}"`:""}><Data ss:Type="String">${j(e.label??"")}</Data></Cell>`}n+="</Row>"}return n}(r,a),i+=function(e,t,r){const n=r?` ss:StyleID="${r}"`:"";let o="\n<Row>";for(const s of e){const e=s.header||s.field;o+=`<Cell${n}><Data ss:Type="String">${j(t.processHeader?t.processHeader(e,s.field):e)}</Data></Cell>`}return o+"</Row>"}(t,r,l)),i+=function(e,t,r,n,o){let i="";for(const l of e){i+="\n<Row>";for(const e of t){let t=s(l,e);r.processCell&&(t=r.processCell(t,e.field,l));const{type:a,displayValue:c}=H(t),u=n&&o?A(n,o,t,e.field,l):void 0;i+=`<Cell${u?` ss:StyleID="${u}"`:""}><Data ss:Type="${a}">${c}</Data></Cell>`}i+="</Row>"}return i}(e,t,r,o,n),i+="\n</Table>\n</Worksheet>\n</Workbook>",i}var _=class extends g{static manifest={queries:[{type:"export:csv",description:"Triggers a CSV export"}]};name="export";get defaultConfig(){return{fileName:"export",includeHeaders:!0,onlyVisible:!0,onlySelected:!1}}isExportingFlag=!1;lastExportInfo=null;handleQuery(e){if("export:csv"===e.type)return this.exportCsv(),!0}resolveExportData(e,t){const r=this.config,n={format:e,fileName:t?.fileName??r.fileName??"export",includeHeaders:t?.includeHeaders??r.includeHeaders,processCell:t?.processCell,processHeader:t?.processHeader,processHeaderRow:t?.processHeaderRow,mode:t?.mode??"raw",columns:t?.columns,rowIndices:t?.rowIndices,excelStyles:t?.excelStyles,fileExtension:t?.fileExtension,headerRows:t?.headerRows},o=m(this.columns,t?.columns,r.onlyVisible);let s;if(t?.rowIndices)s=y(this.rows,t.rowIndices);else if(r.onlySelected){const e=this.getSelectionState();s=e?.selected?.size?y(this.rows,[...e.selected]):[...this.rows]}else s=[...this.rows];if(!1===n.includeHeaders)n.headerRows=void 0;else{const e=n.headerRows??this.#o(o);n.headerRows=this.#s(e,o,n.processHeaderRow)}return{columns:o,rows:s,fullParams:n}}#o(e){if(0===e.length)return[];const t=this.grid;if(!t?.query)return[];const r=t.query("collectHeaderRows",{columns:e});if(!r||0===r.length)return[];const n=[];for(const o of r)if(o)if(Array.isArray(o))for(const e of o)e&&Array.isArray(e.cells)&&e.cells.length>0&&n.push(e);else Array.isArray(o.cells)&&o.cells.length>0&&n.push(o);return n}#s(e,t,r){if(!e||0===e.length)return;const n=t.length,o=[];for(let s=0;s<e.length;s++){const t=e[s];if(!t||!Array.isArray(t.cells)||0===t.cells.length)continue;const i=[];let l=!1,a=0,c=!1;for(const e of t.cells){const t=Math.max(1,0|e.span);if(a+t>n){c=!0;break}a+=t;const o=r?r(e,s):e;null===o?i.push({label:"",span:t}):(i.push({...o,span:t}),""!==(o.label??"")&&(l=!0))}c||(a<n&&i.push({label:"",span:n-a}),l&&o.push({cells:i}))}return o.length>0?o:void 0}resolveCellOutput(e,t,r,n,o){let s=e;if("formatted"===n){const n=this.#i(t);if(n)try{const t=n(e,r);s=null==t?"":String(t)}catch{s=null==e?"":String(e)}else s="date"===t.type?function(e){if(null==e||""===e)return"";if(e instanceof Date)return isNaN(e.getTime())?"":e.toLocaleDateString();if("number"==typeof e||"string"==typeof e){const t=new Date(e);return isNaN(t.getTime())?"":t.toLocaleDateString()}return""}(e):"boolean"===t.type?!!e:e}return o&&(s=o(s,t.field,r)),s}performExport(e,t){const{columns:r,rows:n,fullParams:o}=this.resolveExportData(e,t);this.isExportingFlag=!0;let s=o.fileName??"export";const i=this.#l(r);try{switch(e){case"csv":{const e=w(this.#a(n,r,o),i,{...o,processCell:void 0},{bom:!0});s=s.endsWith(".csv")?s:`${s}.csv`,function(e,t){S(new Blob([e],{type:"text/csv;charset=utf-8;"}),t)}(e,s);break}case"excel":{const e=I(this.#a(n,r,o),i,{...o,processCell:void 0}),t=o.fileExtension??".xls",l=t.startsWith(".")?t:`.${t}`;s=s.endsWith(l)?s:`${s}${l}`,function(e,t){S(new Blob([e],{type:"application/vnd.ms-excel;charset=utf-8;"}),t)}(e,s);break}case"json":{const e=this.#a(n,r,o),t=o.headerRows&&o.headerRows.length>0?{headerRows:o.headerRows,rows:e}:e,i=JSON.stringify(t,null,2);s=s.endsWith(".json")?s:`${s}.json`,S(new Blob([i],{type:"application/json"}),s);break}}this.lastExportInfo={format:e,timestamp:/* @__PURE__ */new Date},this.emit("export-complete",{format:e,fileName:s,rowCount:n.length,columnCount:r.length})}finally{this.isExportingFlag=!1}}#a(e,t,r){const n=r.mode??"raw";return e.map(e=>{const o={};for(const i of t){const t=s(e,i);o[i.field]=this.resolveCellOutput(t,i,e,n,r.processCell)}return o})}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}export(e){const{columns:t,rows:r,fullParams:n}=this.resolveExportData("json",e);return this.#a(r,t,n)}getResolvedColumns(e){return m(this.columns,e?.columns,this.config.onlyVisible)}formatCsv(e,t,r){const{columns:n,fullParams:o}=this.resolveExportData("csv",t);return w(e,this.#l(n),o,r)}formatExcel(e,t){const{columns:r,fullParams:n}=this.resolveExportData("excel",t);return I(e,this.#l(r),n)}#l(e){return e.map(e=>e.valueAccessor?{...e,valueAccessor:void 0}:e)}#i(e){if(e.format)return e.format;if(!e.type)return;const t=this.grid,r=t?.__frameworkAdapter;return r?.getTypeDefault?r.getTypeDefault(e.type,t?._hostElement)?.format:void 0}exportCsv(e){this.performExport("csv",e)}exportExcel(e){this.performExport("excel",e)}exportJson(e){this.performExport("json",e)}isExporting(){return this.isExportingFlag}getLastExport(){return this.lastExportInfo}};export{_ as ExportPlugin};
1
+ var e=/* @__PURE__ */new WeakMap;function t(e){return"__proto__"===e||"constructor"===e||"prototype"===e}var r=/* @__PURE__ */new Map;function n(e){if(-1===e.indexOf("."))return null;let t=r.get(e);return void 0===t&&(t=Object.freeze(e.split(".")),r.set(e,t)),t}function o(e,r){let n=e;for(let o=0;o<r.length;o++){if(null==n||"object"!=typeof n)return;const e=r[o];if(t(e))return;n=n[e]}return n}function s(r,s,i=-1){if(!s.valueAccessor)return function(e,r){if(null==e)return;const s=n(r),i=e;return null===s?t(r)?void 0:i[r]:Object.prototype.hasOwnProperty.call(i,r)?i[r]:o(i,s)}(r,s.field);if("object"!=typeof r||null===r)return s.valueAccessor({row:r,column:s,rowIndex:i});const l=r,a=s.field;let c=e.get(l);if(c){const e=c.get(a);if(void 0!==e)return e.v}else c=/* @__PURE__ */new Map,e.set(l,c);const u=s.valueAccessor({row:r,column:s,rowIndex:i});return c.set(a,{v:u}),u}function i(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function l(e,t,r,n){return`${i(r,n)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}var a="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),c=(new RegExp(`__(proto|defineGetter|defineSetter)|${a.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),u=/^on\w+$/i,f=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),d=/^\s*(javascript|vbscript|data|blob):/i;function p(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(c.has(e)){t.push(n);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI)&&Array.from(n.attributes).some(e=>u.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();u.test(e)?r.push(t.name):"is"!==e?(f.has(e)&&d.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}var h={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};var g=class{static dependencies;static manifest;aliases;version="3.5.3";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const t={...this.userConfig},r={};for(const n of Object.keys(t))r[n]=this;for(const n of e){const e=n.userConfig;for(const[o,s]of Object.entries(e)){if(void 0===s)continue;if(!(o in t)){t[o]=s,r[o]=n;continue}if(t[o]===s)continue;const e=r[o]?.constructor.name??this.constructor.name,i=n.constructor.name,a=l("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${o}" supplied by both ${e} and ${i}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(a)}}Object.assign(this.userConfig,t)}refreshUserConfigFrom(e){const t=this.userConfig,r={...e.userConfig};for(const n of Object.keys(t))delete t[n];Object.assign(t,r)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const r=this.grid?.query?.(e,t);return Array.isArray(r)?r.some(Boolean):!!r}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...h,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}setIcon(e,t,r){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const n=this.#t(t,r);var o,s;void 0!==n?"string"==typeof n?(o=e,(s=n)&&"string"==typeof s?-1!==s.indexOf("<")||-1!==s.indexOf("&")?o.replaceChildren(p(s)):o.textContent=s:o.replaceChildren()):n instanceof HTMLElement&&e.replaceChildren(n.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const r=document.createElement("span");r.setAttribute("part","sort-indicator"),r.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(r,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(r,"sortNone"));const n=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return n?e.insertBefore(r,n):e.appendChild(r),r}warn(e,t){void 0!==t?console.warn(l(e,t,this.gridElement.id,this.name)):console.warn(`${i(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(l(e,t,this.gridElement.id,this.name))}};function m(e,t,r=!0){let n=e;if(r&&(n=n.filter(e=>!e.hidden&&!e.field.startsWith("__")&&!0!==e.utility)),t?.length){const e=new Set(t);n=n.filter(t=>e.has(t.field))}return n}function y(e,t){return t?.length?[...t].sort((e,t)=>e-t).map(t=>e[t]).filter(e=>null!=e):e}var b=/^[=+\-@\t\r]/;function v(e,t){if("string"==typeof e){const r=!1!==t.escapeFormulas&&b.test(e)?`'${e}`:e,n=t.quoting??"auto";return"always"===n||"auto"===n&&(r.includes(t.delimiter)||r.includes(t.newline)||r.includes('"')||r.includes("\n")||r.includes("\r"))?`"${r.replace(/"/g,'""')}"`:r}return"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":null==e?"":e instanceof Date?e.toISOString():"object"==typeof e?JSON.stringify(e):String(e)}function w(e,t,r,n={}){const o=n.delimiter??",",i=n.newline??"\n",l={delimiter:o,newline:i,quoting:n.quoteStrings??1?"auto":"never",escapeFormulas:n.escapeFormulas},a=[],c=n.bom?"\ufeff":"";if(!1!==r.includeHeaders){const e=t.map(e=>{const t=e.header||e.field;return v(r.processHeader?r.processHeader(t,e.field):t,l)});a.push(e.join(o))}for(const u of e){const e=t.map(e=>{let t=s(u,e);return r.processCell&&(t=r.processCell(t,e.field,u)),v(t,l)});a.push(e.join(o))}return c+a.join(i)}function S(e,t){const r=URL.createObjectURL(e),n=document.createElement("a");n.href=r,n.download=t,n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(r)}function x(e){return JSON.stringify(C(e))}function C(e){if(null==e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(C);const t={};for(const r of Object.keys(e).sort())t[r]=C(e[r]);return t}var E=class{#r=/* @__PURE__ */new Map;#n=0;register(e){const t=x(e),r=this.#r.get(t);if(r)return r.id;this.#n++;const n=`s${this.#n}`;return this.#r.set(t,{id:n,style:e}),n}getStyleId(e){return this.#r.get(x(e))?.id}get size(){return this.#r.size}toXml(){if(0===this.#r.size)return"";let e="\n<Styles>";for(const{id:t,style:r}of this.#r.values())e+=$(t,r);return e+="\n</Styles>",e}};function $(e,t){let r=`\n<Style ss:ID="${e}">`;if(t.font&&(r+="<Font",t.font.name&&(r+=` ss:FontName="${t.font.name}"`),t.font.size&&(r+=` ss:Size="${t.font.size}"`),t.font.bold&&(r+=' ss:Bold="1"'),t.font.italic&&(r+=' ss:Italic="1"'),t.font.color&&(r+=` ss:Color="${t.font.color}"`),r+="/>"),t.fill){const e=t.fill.pattern??"Solid";r+=`<Interior ss:Color="${t.fill.color}" ss:Pattern="${e}"/>`}return t.numberFormat&&(r+=`<NumberFormat ss:Format="${t.numberFormat}"/>`),t.alignment&&(r+="<Alignment",t.alignment.horizontal&&(r+=` ss:Horizontal="${t.alignment.horizontal}"`),t.alignment.vertical&&(r+=` ss:Vertical="${t.alignment.vertical}"`),t.alignment.wrapText&&(r+=' ss:WrapText="1"'),r+="/>"),t.borders&&(r+="<Borders>",t.borders.top&&(r+=R("Top",t.borders.top)),t.borders.bottom&&(r+=R("Bottom",t.borders.bottom)),t.borders.left&&(r+=R("Left",t.borders.left)),t.borders.right&&(r+=R("Right",t.borders.right)),r+="</Borders>"),r+="</Style>",r}function R(e,t){let r=`<Border ss:Position="${e}" ss:LineStyle="Continuous" ss:Weight="${function(e){switch(e){case"Thin":return 1;case"Medium":return 2;case"Thick":return 3}}(t.style)}"`;return t.color&&(r+=` ss:Color="${t.color}"`),r+="/>",r}function A(e,t,r,n,o){if(t.cellStyle){const s=t.cellStyle(r,n,o);if(s)return e.register(s)}const s=t.columnStyles?.[n];return s?e.getStyleId(s):t.defaultStyle?e.getStyleId(t.defaultStyle):void 0}function D(e,r){const s=Math.min(r.length,50);let i=(e.header??e.field).length;const l=function(e){const r=n(e);return null===r?t(e)?()=>{}:t=>null==t?void 0:t[e]:t=>{if(null==t)return;const n=t;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:o(n,r)}}(e.field);for(let t=0;t<s;t++){const e=l(r[t]),n=null==e?0:String(e).length;n>i&&(i=n)}return i+2}function j(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function H(e){return null==e?{type:"String",displayValue:""}:"number"!=typeof e||isNaN(e)?e instanceof Date?{type:"DateTime",displayValue:e.toISOString()}:{type:"String",displayValue:j(String(e))}:{type:"Number",displayValue:String(e)}}function I(e,t,r){const n=r.excelStyles,o=n?function(e){const t=new E;if(e.headerStyle&&t.register(e.headerStyle),e.groupHeaderStyle&&t.register(e.groupHeaderStyle),e.defaultStyle&&t.register(e.defaultStyle),e.columnStyles)for(const r of Object.values(e.columnStyles))t.register(r);return t}(n):void 0;let i='<?xml version="1.0" encoding="UTF-8"?>\n<?mso-application progid="Excel.Sheet"?>\n<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"\n xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">';o&&n&&(i+=function(e,t,r,n){if(t.cellStyle)for(const o of r)for(const r of n){const n=t.cellStyle(s(o,r),r.field,o);n&&e.register(n)}return e.toXml()}(o,n,e,t)),i+='\n<Worksheet ss:Name="Sheet1">\n<Table>',n&&(i+=function(e,t,r){const n=r.columnWidths,o=r.autoFitColumns;if(!n&&!o)return"";let s="";for(const i of e){let e=n?.[i.field];null==e&&o&&(e=D(i,t)),s+=null!=e?`\n<Column ss:Width="${7*e}"/>`:"\n<Column/>"}return s}(t,e,n));const l=n?.headerStyle&&o?o.getStyleId(n.headerStyle):void 0,a=n?.groupHeaderStyle&&o?o.getStyleId(n.groupHeaderStyle):l;return!1!==r.includeHeaders&&(i+=function(e,t){if(!e.headerRows?.length)return"";const r=t?` ss:StyleID="${t}"`:"";let n="";for(const o of e.headerRows){n+="\n<Row>";for(const e of o.cells){const t=Math.max(1,0|e.span);n+=`<Cell${r}${t>1?` ss:MergeAcross="${t-1}"`:""}><Data ss:Type="String">${j(e.label??"")}</Data></Cell>`}n+="</Row>"}return n}(r,a),i+=function(e,t,r){const n=r?` ss:StyleID="${r}"`:"";let o="\n<Row>";for(const s of e){const e=s.header||s.field;o+=`<Cell${n}><Data ss:Type="String">${j(t.processHeader?t.processHeader(e,s.field):e)}</Data></Cell>`}return o+"</Row>"}(t,r,l)),i+=function(e,t,r,n,o){let i="";for(const l of e){i+="\n<Row>";for(const e of t){let t=s(l,e);r.processCell&&(t=r.processCell(t,e.field,l));const{type:a,displayValue:c}=H(t),u=n&&o?A(n,o,t,e.field,l):void 0;i+=`<Cell${u?` ss:StyleID="${u}"`:""}><Data ss:Type="${a}">${c}</Data></Cell>`}i+="</Row>"}return i}(e,t,r,o,n),i+="\n</Table>\n</Worksheet>\n</Workbook>",i}var _=class extends g{static manifest={queries:[{type:"export:csv",description:"Triggers a CSV export"}]};name="export";get defaultConfig(){return{fileName:"export",includeHeaders:!0,onlyVisible:!0,onlySelected:!1}}isExportingFlag=!1;lastExportInfo=null;handleQuery(e){if("export:csv"===e.type)return this.exportCsv(),!0}resolveExportData(e,t){const r=this.config,n={format:e,fileName:t?.fileName??r.fileName??"export",includeHeaders:t?.includeHeaders??r.includeHeaders,processCell:t?.processCell,processHeader:t?.processHeader,processHeaderRow:t?.processHeaderRow,mode:t?.mode??"raw",columns:t?.columns,rowIndices:t?.rowIndices,excelStyles:t?.excelStyles,fileExtension:t?.fileExtension,headerRows:t?.headerRows},o=m(this.columns,t?.columns,r.onlyVisible);let s;if(t?.rowIndices)s=y(this.rows,t.rowIndices);else if(r.onlySelected){const e=this.getSelectionState();s=e?.selected?.size?y(this.rows,[...e.selected]):[...this.rows]}else s=[...this.rows];if(!1===n.includeHeaders)n.headerRows=void 0;else{const e=n.headerRows??this.#o(o);n.headerRows=this.#s(e,o,n.processHeaderRow)}return{columns:o,rows:s,fullParams:n}}#o(e){if(0===e.length)return[];const t=this.grid;if(!t?.query)return[];const r=t.query("collectHeaderRows",{columns:e});if(!r||0===r.length)return[];const n=[];for(const o of r)if(o)if(Array.isArray(o))for(const e of o)e&&Array.isArray(e.cells)&&e.cells.length>0&&n.push(e);else Array.isArray(o.cells)&&o.cells.length>0&&n.push(o);return n}#s(e,t,r){if(!e||0===e.length)return;const n=t.length,o=[];for(let s=0;s<e.length;s++){const t=e[s];if(!t||!Array.isArray(t.cells)||0===t.cells.length)continue;const i=[];let l=!1,a=0,c=!1;for(const e of t.cells){const t=Math.max(1,0|e.span);if(a+t>n){c=!0;break}a+=t;const o=r?r(e,s):e;null===o?i.push({label:"",span:t}):(i.push({...o,span:t}),""!==(o.label??"")&&(l=!0))}c||(a<n&&i.push({label:"",span:n-a}),l&&o.push({cells:i}))}return o.length>0?o:void 0}resolveCellOutput(e,t,r,n,o){let s=e;if("formatted"===n){const n=this.#i(t);if(n)try{const t=n(e,r);s=null==t?"":String(t)}catch{s=null==e?"":String(e)}else s="date"===t.type?function(e){if(null==e||""===e)return"";if(e instanceof Date)return isNaN(e.getTime())?"":e.toLocaleDateString();if("number"==typeof e||"string"==typeof e){const t=new Date(e);return isNaN(t.getTime())?"":t.toLocaleDateString()}return""}(e):"boolean"===t.type?!!e:e}return o&&(s=o(s,t.field,r)),s}performExport(e,t){const{columns:r,rows:n,fullParams:o}=this.resolveExportData(e,t);this.isExportingFlag=!0;let s=o.fileName??"export";const i=this.#l(r);try{switch(e){case"csv":{const e=w(this.#a(n,r,o),i,{...o,processCell:void 0},{bom:!0});s=s.endsWith(".csv")?s:`${s}.csv`,function(e,t){S(new Blob([e],{type:"text/csv;charset=utf-8;"}),t)}(e,s);break}case"excel":{const e=I(this.#a(n,r,o),i,{...o,processCell:void 0}),t=o.fileExtension??".xls",l=t.startsWith(".")?t:`.${t}`;s=s.endsWith(l)?s:`${s}${l}`,function(e,t){S(new Blob([e],{type:"application/vnd.ms-excel;charset=utf-8;"}),t)}(e,s);break}case"json":{const e=this.#a(n,r,o),t=o.headerRows&&o.headerRows.length>0?{headerRows:o.headerRows,rows:e}:e,i=JSON.stringify(t,null,2);s=s.endsWith(".json")?s:`${s}.json`,S(new Blob([i],{type:"application/json"}),s);break}}this.lastExportInfo={format:e,timestamp:/* @__PURE__ */new Date},this.emit("export-complete",{format:e,fileName:s,rowCount:n.length,columnCount:r.length})}finally{this.isExportingFlag=!1}}#a(e,t,r){const n=r.mode??"raw";return e.map(e=>{const o={};for(const i of t){const t=s(e,i);o[i.field]=this.resolveCellOutput(t,i,e,n,r.processCell)}return o})}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}export(e){const{columns:t,rows:r,fullParams:n}=this.resolveExportData("json",e);return this.#a(r,t,n)}getResolvedColumns(e){return m(this.columns,e?.columns,this.config.onlyVisible)}formatCsv(e,t,r){const{columns:n,fullParams:o}=this.resolveExportData("csv",t);return w(e,this.#l(n),o,r)}formatExcel(e,t){const{columns:r,fullParams:n}=this.resolveExportData("excel",t);return I(e,this.#l(r),n)}#l(e){return e.map(e=>e.valueAccessor?{...e,valueAccessor:void 0}:e)}#i(e){if(e.format)return e.format;if(!e.type)return;const t=this.grid,r=t?.__frameworkAdapter;return r?.getTypeDefault?r.getTypeDefault(e.type,t?._hostElement)?.format:void 0}exportCsv(e){this.performExport("csv",e)}exportExcel(e){this.performExport("excel",e)}exportJson(e){this.performExport("json",e)}isExporting(){return this.isExportingFlag}getLastExport(){return this.lastExportInfo}};export{_ as ExportPlugin};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- var e=/* @__PURE__ */new WeakMap;function t(e){return"__proto__"===e||"constructor"===e||"prototype"===e}var r=/* @__PURE__ */new Map;function n(e){if(-1===e.indexOf("."))return null;let t=r.get(e);return void 0===t&&(t=Object.freeze(e.split(".")),r.set(e,t)),t}function i(e,r){let n=e;for(let i=0;i<r.length;i++){if(null==n||"object"!=typeof n)return;const e=r[i];if(t(e))return;n=n[e]}return n}function l(e){const r=n(e);return null===r?t(e)?()=>{}:t=>null==t?void 0:t[e]:t=>{if(null==t)return;const n=t;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:i(n,r)}}function a(r,l,a=-1){if(!l.valueAccessor)return function(e,r){if(null==e)return;const l=n(r),a=e;return null===l?t(r)?void 0:a[r]:Object.prototype.hasOwnProperty.call(a,r)?a[r]:i(a,l)}(r,l.field);if("object"!=typeof r||null===r)return l.valueAccessor({row:r,column:l,rowIndex:a});const o=r,s=l.field;let c=e.get(o);if(c){const e=c.get(s);if(void 0!==e)return e.v}else c=/* @__PURE__ */new Map,e.set(o,c);const d=l.valueAccessor({row:r,column:l,rowIndex:a});return c.set(s,{v:d}),d}var o="(Blank)";function s(e){return null==e||""===e||"number"==typeof e&&isNaN(e)}function c(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 d(e,r,n){const i=e.field,a=l(i),d=n?e=>n(a(e),e):a;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 l=new Set(e.value);return r?e=>{const n=r(t(e),e),a=Array.isArray(n)?n:null!=n?[n]:[],s=0===a.length?l.has(o):a.some(e=>l.has(e));return i?!s:s}:e=>{const r=t(e),n=null==r||""===r?l.has(o):l.has(r);return i?!n:n}}(e,a,n)??function(e,r,n,i){const l=e.operator,a="number"===e.type&&i,o=a&&function(e){return-1===e.indexOf(".")&&!t(e)}(r)?r:null;if("greaterThan"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r>t}:a?e=>{const r=n(e);return!s(r)&&r>t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i>t}}if("greaterThanOrEqual"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r>=t}:a?e=>{const r=n(e);return!s(r)&&r>=t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i>=t}}if("lessThan"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r<t}:a?e=>{const r=n(e);return!s(r)&&r<t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i<t}}if("lessThanOrEqual"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r<=t}:a?e=>{const r=n(e);return!s(r)&&r<=t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i<=t}}if("between"===l){const t=c(e.value),r=c(e.valueTo);return o?e=>{const n=e[o];if(s(n))return!1;return n>=t&&n<=r}:a?e=>{const i=n(e);if(s(i))return!1;return i>=t&&i<=r}:e=>{const i=n(e);if(s(i))return!1;const l=c(i);return!isNaN(l)&&l>=t&&l<=r}}}(e,i,d,void 0===n)??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,r,d)??(()=>!0)}function u(e,t,r){const n=/* @__PURE__ */new Set;let i=!1;const a=l(t);for(const l of e){const e=a(l);if(r){const t=r(e,l);if(Array.isArray(t)){0===t.length&&(i=!0);for(const e of t)null!=e&&n.add(e)}else null!=t?n.add(t):i=!0}else null!=e&&""!==e?n.add(e):i=!0}return i&&n.add(o),[...n].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}var p={sortApplied:(e,t)=>`Sorted by ${e}, ${t}`,sortCleared:()=>"Sort cleared",filterApplied:e=>`Filter applied on ${e}`,filterCleared:e=>`Filter cleared from ${e}`,allFiltersCleared:()=>"All filters cleared",groupExpanded:(e,t)=>`Group ${e} expanded, ${t} rows`,groupCollapsed:e=>`Group ${e} collapsed`,selectionChanged:e=>`${e} rows selected`,columnSelected:e=>`Column ${e} selected`,columnSelectionChanged:e=>`${e} columns selected`,columnSelectionCleared:()=>"Column selection cleared",selectionAxisChanged:e=>"column"===e?"Row selection cleared, column selection active":"Column selection cleared, row selection active",editingStarted:e=>`Editing row ${e+1}`,editingCommitted:e=>`Row ${e+1} saved`,dataLoaded:e=>`${e} rows loaded`},f={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};function h(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 b(e,t,...r){const n=(e&&"effectiveConfig"in e?e.effectiveConfig:void 0)?.a11y?.messages?.[t];return n?n(...r):p[t](...r)}function g(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function m(e,t,r,n){return`${g(r,n)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}var v="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),w=(new RegExp(`__(proto|defineGetter|defineSetter)|${v.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),y=/^on\w+$/i,x=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),C=/^\s*(javascript|vbscript|data|blob):/i;function E(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(w.has(e)){t.push(n);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI)&&Array.from(n.attributes).some(e=>y.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();y.test(e)?r.push(t.name):"is"!==e?(x.has(e)&&C.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}var k=class{static dependencies;static manifest;aliases;version="3.5.2";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const t={...this.userConfig},r={};for(const n of Object.keys(t))r[n]=this;for(const n of e){const e=n.userConfig;for(const[i,l]of Object.entries(e)){if(void 0===l)continue;if(!(i in t)){t[i]=l,r[i]=n;continue}if(t[i]===l)continue;const e=r[i]?.constructor.name??this.constructor.name,a=n.constructor.name,o=m("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${i}" supplied by both ${e} and ${a}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(o)}}Object.assign(this.userConfig,t)}refreshUserConfigFrom(e){const t=this.userConfig,r={...e.userConfig};for(const n of Object.keys(t))delete t[n];Object.assign(t,r)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const r=this.grid?.query?.(e,t);return Array.isArray(r)?r.some(Boolean):!!r}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...f,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}setIcon(e,t,r){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const n=this.#t(t,r);var i,l;void 0!==n?"string"==typeof n?(i=e,(l=n)&&"string"==typeof l?-1!==l.indexOf("<")||-1!==l.indexOf("&")?i.replaceChildren(E(l)):i.textContent=l:i.replaceChildren()):n instanceof HTMLElement&&e.replaceChildren(n.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const r=document.createElement("span");r.setAttribute("part","sort-indicator"),r.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(r,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(r,"sortNone"));const n=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return n?e.insertBefore(r,n):e.appendChild(r),r}warn(e,t){void 0!==t?console.warn(m(e,t,this.gridElement.id,this.name)):console.warn(`${g(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(m(e,t,this.gridElement.id,this.name))}};function F(e){return e?e.toISOString().split("T")[0]:""}function S(e){return e?"string"==typeof e?e:"number"==typeof e?F(new Date(e)):"":""}var A=335e5;function N(e){const{totalRows:t,viewportHeight:r,scrollTop:n,rowHeight:i,overscan:l,maxSpacerHeight:a=A}=e,o=Math.ceil(r/i),s=t*i,c=function(e,t,r=A){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 T(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 b=document.createElement("span");b.textContent=t.t("filter.selectAll","Select All"),f.appendChild(h),f.appendChild(b),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 m=()=>{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);m(),E()}),m(),e.appendChild(p);const v=document.createElement("div");v.className="tbw-filter-values";const w=document.createElement("div");w.className="tbw-filter-values-spacer",v.appendChild(w);const y=document.createElement("div");y.className="tbw-filter-values-content",v.appendChild(y);let x=[];const C=(e,t)=>{const r=c(e),n=null==e?"__null__":String(e),i=document.createElement("label");i.className="tbw-filter-value-item",i.style.position="absolute",i.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,i.style.left="0",i.style.right="0",i.style.boxSizing="border-box";const l=document.createElement("input");l.type="checkbox",l.className="tbw-filter-checkbox",l.checked=g.get(n)??!0,l.dataset.value=n,l.addEventListener("change",()=>{g.set(n,l.checked),m()});const a=document.createElement("span");return a.textContent=r,i.appendChild(l),i.appendChild(a),i},E=()=>{const e=x.length,t=v.clientHeight,r=v.scrollTop;if(w.style.height=e*s+"px",e<=50/3)return y.innerHTML="",y.style.transform="translateY(0px)",void x.forEach((e,t)=>{y.appendChild(C(e,t))});const n=N({totalRows:e,viewportHeight:t,scrollTop:r,rowHeight:s,overscan:3});y.style.transform=`translateY(${n.offsetY}px)`,y.innerHTML="";for(let i=n.start;i<n.end;i++)y.appendChild(C(x[i],i-n.start))},k=e=>{const n=i.caseSensitive??!1,l=n?e:e.toLowerCase();if(x=r.filter(t=>{const r=c(t),i=n?r:r.toLowerCase();return!e||i.includes(l)}),x.sort((e,t)=>{const r=null==e?"__null__":String(e),n=null==t?"__null__":String(t),i=g.get(r)??!0;return i!==(g.get(n)??!0)?i?-1:1:"number"==typeof e&&"number"==typeof t?e-t:c(e).localeCompare(c(t))}),0===x.length){w.style.height="0px",y.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent=t.t("filter.noMatches","No matching values"),void y.appendChild(e)}E()};let F;v.addEventListener("scroll",()=>{x.length>0&&E()},{passive:!0}),k(u.value),e.appendChild(v),u.addEventListener("input",()=>{clearTimeout(F),F=setTimeout(()=>{l.set(a,u.value),k(u.value)},i.debounceMs??150)});const S=document.createElement("div");S.className="tbw-filter-buttons";const A=document.createElement("button");A.type="button",A.className="tbw-filter-apply-btn",A.textContent=t.t("filter.apply","Apply"),A.addEventListener("click",()=>{const e=[];for(const[t,n]of g)if(!n)if("__null__"===t)e.push(null);else{const n=r.find(e=>String(e)===t);e.push(void 0!==n?n:t)}t.applySetFilter(e)}),S.appendChild(A);const T=document.createElement("button");T.type="button",T.className="tbw-filter-clear-btn",T.textContent=t.t("filter.clear","Clear Filter"),T.addEventListener("click",()=>{t.clearFilter()}),S.appendChild(T),e.appendChild(S)}function L(e,t){if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t}var R=class e extends k{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}}@media (pointer:coarse){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){return e.filterValue?e.filterValue:e.valueAccessor?(t,r)=>a(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 r=function(e,t){const r=/* @__PURE__ */new Map,n=/* @__PURE__ */new Map;for(const{field:a,filterValue:o}of t)r.set(a,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!o}),n.set(a,l(a));for(const l of e)for(const{field:e,filterValue:i}of t){const t=r.get(e),a=n.get(e)(l);if(i){const e=i(a,l);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 i=/* @__PURE__ */new Map;for(const[l,{values:a,hasBlank:s}]of r)s&&a.add(o),i.set(l,[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return i}(this.getDataRows(),t);for(const{field:n}of t){const t=this.excludedValues.get(n),i=r.get(n)??[];e[n]=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?o:e)),l=this.getUniqueValues(e),a=new Set(l.filter(e=>!i.has(e)));this.excludedValues.set(e,a)}else"set"===t.type&&this.excludedValues.delete(e);else this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles()}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=(n=t,JSON.stringify(n.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var n;const i=e===this.cachedInputRows;if(this.cacheKey===r&&this.cachedResult&&i)return this.cachedResult;if(!i)for(const[a,o]of this.filters)"set"===o.type&&"in"===o.operator&&this.syncExcludedValues(a,o);const l=function(e,t,r=!1,n){if(!t.length)return e;const i=t.map(e=>d(e,r,n?.get(e.field)));return 1===i.length?e.filter(i[0]):e.filter(e=>{for(let t=0;t<i.length;t++)if(!i[t](e))return!1;return!0})}(e,t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=l,this.cacheKey=r,this.cachedInputRows=e,l}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;h(this.gridElement,b(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||h(this.gridElement,b(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;h(this.gridElement,b(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 u(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=u(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?o:e)),l=new Set(n.filter(e=>!r.has(e)));this.excludedValues.set(e,l)}let l=this.excludedValues.get(e);l||(l=/* @__PURE__ */new Set,this.excludedValues.set(e,l));const a=this.searchText.get(e)??"",s={field:e,column:t,uniqueValues:n,excludedValues:l,searchText:a,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=L(a?.min??o?.min,c),p=L(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,g=n.get(i);let m=h,v=b;const w="blank"===g?.operator;"between"===g?.operator?(m=L(g.value,h),v=L(g.valueTo,b)):"greaterThanOrEqual"===g?.operator?m=L(g.value,h):"lessThanOrEqual"===g?.operator&&(v=L(g.value,b));const y=document.createElement("div");y.className="tbw-filter-range-inputs";const x=document.createElement("div");x.className="tbw-filter-range-group";const C=document.createElement("label");C.textContent=t.t("filter.min","Min"),C.className="tbw-filter-range-label";const E=document.createElement("input");E.type="number",E.className="tbw-filter-range-input",E.min=String(u),E.max=String(p),E.step=String(f),E.value=String(m),x.appendChild(C),x.appendChild(E),y.appendChild(x);const k=document.createElement("span");k.className="tbw-filter-range-separator",k.textContent="–",y.appendChild(k);const F=document.createElement("div");F.className="tbw-filter-range-group";const S=document.createElement("label");S.textContent=t.t("filter.max","Max"),S.className="tbw-filter-range-label";const A=document.createElement("input");A.type="number",A.className="tbw-filter-range-input",A.min=String(u),A.max=String(p),A.step=String(f),A.value=String(v),F.appendChild(S),F.appendChild(A),y.appendChild(F),e.appendChild(y);const N=document.createElement("div");N.className="tbw-filter-range-slider";const T=document.createElement("div");T.className="tbw-filter-range-track";const R=document.createElement("div");R.className="tbw-filter-range-fill";const P=document.createElement("input");P.type="range",P.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",P.min=String(u),P.max=String(p),P.step=String(f),P.value=String(m);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(v),N.appendChild(T),N.appendChild(R),N.appendChild(P),N.appendChild(M),e.appendChild(N);const q=document.createElement("label");q.className="tbw-filter-blank-option";const _=document.createElement("input");_.type="checkbox",_.className="tbw-filter-blank-checkbox",_.checked=w;const B=document.createTextNode("Blank");q.appendChild(_),q.appendChild(B);const V=e=>{E.disabled=e,A.disabled=e,P.disabled=e,M.disabled=e,y.classList.toggle("tbw-filter-disabled",e),N.classList.toggle("tbw-filter-disabled",e)};V(w),_.addEventListener("change",()=>{V(_.checked)}),e.appendChild(q);const $=()=>{const e=parseFloat(P.value),t=parseFloat(M.value),r=p-u,n=(e-u)/r*100,i=(t-u)/r*100;R.style.left=`${n}%`,R.style.width=i-n+"%"};P.addEventListener("input",()=>{const e=Math.min(parseFloat(P.value),parseFloat(M.value));P.value=String(e),E.value=String(e),$()}),M.addEventListener("input",()=>{const e=Math.max(parseFloat(M.value),parseFloat(P.value));M.value=String(e),A.value=String(e),$()}),E.addEventListener("input",()=>{const e=parseFloat(E.value);let t=Number.isFinite(e)?e:u;t=Math.max(u,Math.min(t,parseFloat(A.value))),P.value=String(t),$()}),A.addEventListener("input",()=>{const e=parseFloat(A.value);let t=Number.isFinite(e)?e:p;t=Math.min(p,Math.max(t,parseFloat(E.value))),M.value=String(t),$()}),$();const I=document.createElement("div");I.className="tbw-filter-buttons";const H=document.createElement("button");H.type="button",H.className="tbw-filter-apply-btn",H.textContent=t.t("filter.apply","Apply"),H.addEventListener("click",()=>{if(_.checked)return void t.applyTextFilter("blank","");const e=parseFloat(E.value),r=parseFloat(A.value),n=Number.isFinite(e)?e:h,i=Number.isFinite(r)?r:b;n!==h||i!==b?t.applyTextFilter("between",n,i):t.clearFilter()}),I.appendChild(H);const O=document.createElement("button");O.type="button",O.className="tbw-filter-clear-btn",O.textContent=t.t("filter.clear","Clear Filter"),O.addEventListener("click",()=>{t.clearFilter()}),I.appendChild(O),e.appendChild(I)}(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=S(a?.min)||S(o?.min)||F(c),p=S(a?.max)||S(o?.max)||F(d),f=F(c)||S(a?.min)||S(o?.min),h=F(d)||S(a?.max)||S(o?.max),b=n.get(i);let g=f,m=h;const v="blank"===b?.operator;"between"===b?.operator?(g=S(b.value)||f,m=S(b.valueTo)||h):"greaterThanOrEqual"===b?.operator?g=S(b.value)||f:"lessThanOrEqual"===b?.operator&&(m=S(b.value)||h);const w=document.createElement("div");w.className="tbw-filter-date-range";const y=document.createElement("div");y.className="tbw-filter-date-group";const x=document.createElement("label");x.textContent=t.t("filter.from","From"),x.className="tbw-filter-range-label";const C=document.createElement("input");C.type="date",C.className="tbw-filter-date-input",u&&(C.min=u),p&&(C.max=p),C.value=g,y.appendChild(x),y.appendChild(C),w.appendChild(y);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",w.appendChild(E);const k=document.createElement("div");k.className="tbw-filter-date-group";const A=document.createElement("label");A.textContent="To",A.className="tbw-filter-range-label";const N=document.createElement("input");N.type="date",N.className="tbw-filter-date-input",u&&(N.min=u),p&&(N.max=p),N.value=m,k.appendChild(A),k.appendChild(N),w.appendChild(k),e.appendChild(w);const T=document.createElement("label");T.className="tbw-filter-blank-option";const L=document.createElement("input");L.type="checkbox",L.className="tbw-filter-blank-checkbox",L.checked=v;const R=document.createTextNode("Show only blank");T.appendChild(L),T.appendChild(R);const P=e=>{C.disabled=e,N.disabled=e,w.classList.toggle("tbw-filter-disabled",e)};P(v),L.addEventListener("change",()=>{P(L.checked)}),e.appendChild(T);const M=document.createElement("div");M.className="tbw-filter-buttons";const q=document.createElement("button");q.type="button",q.className="tbw-filter-apply-btn",q.textContent=t.t("filter.apply","Apply"),q.addEventListener("click",()=>{if(L.checked)return void t.applyTextFilter("blank","");const e=C.value,r=N.value,n=e&&e!==f?e:"",i=r&&r!==h?r:"";n&&i?t.applyTextFilter("between",n,i):n?t.applyTextFilter("greaterThanOrEqual",n):i?t.applyTextFilter("lessThanOrEqual",i):t.clearFilter()}),M.appendChild(q);const _=document.createElement("button");_.type="button",_.className="tbw-filter-clear-btn",_.textContent=t.t("filter.clear","Clear Filter"),_.addEventListener("click",()=>{t.clearFilter()}),M.appendChild(_),e.appendChild(M)}(r,s,n,this.filters):T(r,s,n,l,{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===e.supportsAnchorPositioning&&(e.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),e.supportsAnchorPositioning}positionPanel(t,r){const n=r.closest(".header-row")??r;if(n.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=n,e.checkAnchorPositioningSupport()){n.style.anchorName="",r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r;const e=n.getBoundingClientRect().bottom-r.getBoundingClientRect().bottom;return t.style.marginTop=`${e+4}px`,void requestAnimationFrame(()=>{const e=t.getBoundingClientRect(),n=r.getBoundingClientRect();e.top<n.top&&t.classList.add("tbw-filter-panel-above")})}const i=n.getBoundingClientRect(),l=r.getBoundingClientRect();t.style.position="fixed",t.style.top=`${i.bottom+4}px`,t.style.left=`${l.right}px`,requestAnimationFrame(()=>{const e=t.getBoundingClientRect();t.style.left=l.right-e.width+"px",l.right-e.width<8&&(t.style.left=`${l.left}px`),e.bottom>window.innerHeight-8&&(t.style.top=i.top-e.height-4+"px",t.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{o as BLANK_FILTER_VALUE,R as FilteringPlugin};
1
+ var e=/* @__PURE__ */new WeakMap;function t(e){return"__proto__"===e||"constructor"===e||"prototype"===e}var r=/* @__PURE__ */new Map;function n(e){if(-1===e.indexOf("."))return null;let t=r.get(e);return void 0===t&&(t=Object.freeze(e.split(".")),r.set(e,t)),t}function i(e,r){let n=e;for(let i=0;i<r.length;i++){if(null==n||"object"!=typeof n)return;const e=r[i];if(t(e))return;n=n[e]}return n}function l(e){const r=n(e);return null===r?t(e)?()=>{}:t=>null==t?void 0:t[e]:t=>{if(null==t)return;const n=t;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:i(n,r)}}function a(r,l,a=-1){if(!l.valueAccessor)return function(e,r){if(null==e)return;const l=n(r),a=e;return null===l?t(r)?void 0:a[r]:Object.prototype.hasOwnProperty.call(a,r)?a[r]:i(a,l)}(r,l.field);if("object"!=typeof r||null===r)return l.valueAccessor({row:r,column:l,rowIndex:a});const o=r,s=l.field;let c=e.get(o);if(c){const e=c.get(s);if(void 0!==e)return e.v}else c=/* @__PURE__ */new Map,e.set(o,c);const d=l.valueAccessor({row:r,column:l,rowIndex:a});return c.set(s,{v:d}),d}var o="(Blank)";function s(e){return null==e||""===e||"number"==typeof e&&isNaN(e)}function c(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 d(e,r,n){const i=e.field,a=l(i),d=n?e=>n(a(e),e):a;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 l=new Set(e.value);return r?e=>{const n=r(t(e),e),a=Array.isArray(n)?n:null!=n?[n]:[],s=0===a.length?l.has(o):a.some(e=>l.has(e));return i?!s:s}:e=>{const r=t(e),n=null==r||""===r?l.has(o):l.has(r);return i?!n:n}}(e,a,n)??function(e,r,n,i){const l=e.operator,a="number"===e.type&&i,o=a&&function(e){return-1===e.indexOf(".")&&!t(e)}(r)?r:null;if("greaterThan"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r>t}:a?e=>{const r=n(e);return!s(r)&&r>t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i>t}}if("greaterThanOrEqual"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r>=t}:a?e=>{const r=n(e);return!s(r)&&r>=t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i>=t}}if("lessThan"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r<t}:a?e=>{const r=n(e);return!s(r)&&r<t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i<t}}if("lessThanOrEqual"===l){const t=c(e.value);return o?e=>{const r=e[o];return!s(r)&&r<=t}:a?e=>{const r=n(e);return!s(r)&&r<=t}:e=>{const r=n(e);if(s(r))return!1;const i=c(r);return!isNaN(i)&&i<=t}}if("between"===l){const t=c(e.value),r=c(e.valueTo);return o?e=>{const n=e[o];if(s(n))return!1;return n>=t&&n<=r}:a?e=>{const i=n(e);if(s(i))return!1;return i>=t&&i<=r}:e=>{const i=n(e);if(s(i))return!1;const l=c(i);return!isNaN(l)&&l>=t&&l<=r}}}(e,i,d,void 0===n)??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,r,d)??(()=>!0)}function u(e,t,r){const n=/* @__PURE__ */new Set;let i=!1;const a=l(t);for(const l of e){const e=a(l);if(r){const t=r(e,l);if(Array.isArray(t)){0===t.length&&(i=!0);for(const e of t)null!=e&&n.add(e)}else null!=t?n.add(t):i=!0}else null!=e&&""!==e?n.add(e):i=!0}return i&&n.add(o),[...n].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}var p={sortApplied:(e,t)=>`Sorted by ${e}, ${t}`,sortCleared:()=>"Sort cleared",filterApplied:e=>`Filter applied on ${e}`,filterCleared:e=>`Filter cleared from ${e}`,allFiltersCleared:()=>"All filters cleared",groupExpanded:(e,t)=>`Group ${e} expanded, ${t} rows`,groupCollapsed:e=>`Group ${e} collapsed`,selectionChanged:e=>`${e} rows selected`,columnSelected:e=>`Column ${e} selected`,columnSelectionChanged:e=>`${e} columns selected`,columnSelectionCleared:()=>"Column selection cleared",selectionAxisChanged:e=>"column"===e?"Row selection cleared, column selection active":"Column selection cleared, row selection active",editingStarted:e=>`Editing row ${e+1}`,editingCommitted:e=>`Row ${e+1} saved`,dataLoaded:e=>`${e} rows loaded`},f={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};function h(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 b(e,t,...r){const n=(e&&"effectiveConfig"in e?e.effectiveConfig:void 0)?.a11y?.messages?.[t];return n?n(...r):p[t](...r)}function g(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function m(e,t,r,n){return`${g(r,n)} ${e}: ${t}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(e)}`}var v="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),w=(new RegExp(`__(proto|defineGetter|defineSetter)|${v.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),y=/^on\w+$/i,x=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),C=/^\s*(javascript|vbscript|data|blob):/i;function E(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const n of r){const e=n.tagName.toLowerCase();if(w.has(e)){t.push(n);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===n.namespaceURI)&&Array.from(n.attributes).some(e=>y.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(n);continue}const r=[];for(const t of n.attributes){const e=t.name.toLowerCase();y.test(e)?r.push(t.name):"is"!==e?(x.has(e)&&C.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>n.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}var k=class{static dependencies;static manifest;aliases;version="3.5.3";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const t={...this.userConfig},r={};for(const n of Object.keys(t))r[n]=this;for(const n of e){const e=n.userConfig;for(const[i,l]of Object.entries(e)){if(void 0===l)continue;if(!(i in t)){t[i]=l,r[i]=n;continue}if(t[i]===l)continue;const e=r[i]?.constructor.name??this.constructor.name,a=n.constructor.name,o=m("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${i}" supplied by both ${e} and ${a}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(o)}}Object.assign(this.userConfig,t)}refreshUserConfigFrom(e){const t=this.userConfig,r={...e.userConfig};for(const n of Object.keys(t))delete t[n];Object.assign(t,r)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const r=this.grid?.query?.(e,t);return Array.isArray(r)?r.some(Boolean):!!r}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...f,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}setIcon(e,t,r){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const n=this.#t(t,r);var i,l;void 0!==n?"string"==typeof n?(i=e,(l=n)&&"string"==typeof l?-1!==l.indexOf("<")||-1!==l.indexOf("&")?i.replaceChildren(E(l)):i.textContent=l:i.replaceChildren()):n instanceof HTMLElement&&e.replaceChildren(n.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const r=document.createElement("span");r.setAttribute("part","sort-indicator"),r.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(r,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(r,"sortNone"));const n=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return n?e.insertBefore(r,n):e.appendChild(r),r}warn(e,t){void 0!==t?console.warn(m(e,t,this.gridElement.id,this.name)):console.warn(`${g(this.gridElement.id,this.name)} ${e}`)}throwDiagnostic(e,t){throw new Error(m(e,t,this.gridElement.id,this.name))}};function F(e){return e?e.toISOString().split("T")[0]:""}function S(e){return e?"string"==typeof e?e:"number"==typeof e?F(new Date(e)):"":""}var A=335e5;function N(e){const{totalRows:t,viewportHeight:r,scrollTop:n,rowHeight:i,overscan:l,maxSpacerHeight:a=A}=e,o=Math.ceil(r/i),s=t*i,c=function(e,t,r=A){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 T(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 b=document.createElement("span");b.textContent=t.t("filter.selectAll","Select All"),f.appendChild(h),f.appendChild(b),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 m=()=>{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);m(),E()}),m(),e.appendChild(p);const v=document.createElement("div");v.className="tbw-filter-values";const w=document.createElement("div");w.className="tbw-filter-values-spacer",v.appendChild(w);const y=document.createElement("div");y.className="tbw-filter-values-content",v.appendChild(y);let x=[];const C=(e,t)=>{const r=c(e),n=null==e?"__null__":String(e),i=document.createElement("label");i.className="tbw-filter-value-item",i.style.position="absolute",i.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,i.style.left="0",i.style.right="0",i.style.boxSizing="border-box";const l=document.createElement("input");l.type="checkbox",l.className="tbw-filter-checkbox",l.checked=g.get(n)??!0,l.dataset.value=n,l.addEventListener("change",()=>{g.set(n,l.checked),m()});const a=document.createElement("span");return a.textContent=r,i.appendChild(l),i.appendChild(a),i},E=()=>{const e=x.length,t=v.clientHeight,r=v.scrollTop;if(w.style.height=e*s+"px",e<=50/3)return y.innerHTML="",y.style.transform="translateY(0px)",void x.forEach((e,t)=>{y.appendChild(C(e,t))});const n=N({totalRows:e,viewportHeight:t,scrollTop:r,rowHeight:s,overscan:3});y.style.transform=`translateY(${n.offsetY}px)`,y.innerHTML="";for(let i=n.start;i<n.end;i++)y.appendChild(C(x[i],i-n.start))},k=e=>{const n=i.caseSensitive??!1,l=n?e:e.toLowerCase();if(x=r.filter(t=>{const r=c(t),i=n?r:r.toLowerCase();return!e||i.includes(l)}),x.sort((e,t)=>{const r=null==e?"__null__":String(e),n=null==t?"__null__":String(t),i=g.get(r)??!0;return i!==(g.get(n)??!0)?i?-1:1:"number"==typeof e&&"number"==typeof t?e-t:c(e).localeCompare(c(t))}),0===x.length){w.style.height="0px",y.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent=t.t("filter.noMatches","No matching values"),void y.appendChild(e)}E()};let F;v.addEventListener("scroll",()=>{x.length>0&&E()},{passive:!0}),k(u.value),e.appendChild(v),u.addEventListener("input",()=>{clearTimeout(F),F=setTimeout(()=>{l.set(a,u.value),k(u.value)},i.debounceMs??150)});const S=document.createElement("div");S.className="tbw-filter-buttons";const A=document.createElement("button");A.type="button",A.className="tbw-filter-apply-btn",A.textContent=t.t("filter.apply","Apply"),A.addEventListener("click",()=>{const e=[];for(const[t,n]of g)if(!n)if("__null__"===t)e.push(null);else{const n=r.find(e=>String(e)===t);e.push(void 0!==n?n:t)}t.applySetFilter(e)}),S.appendChild(A);const T=document.createElement("button");T.type="button",T.className="tbw-filter-clear-btn",T.textContent=t.t("filter.clear","Clear Filter"),T.addEventListener("click",()=>{t.clearFilter()}),S.appendChild(T),e.appendChild(S)}function L(e,t){if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);return isNaN(r)?t:r}return t}var R=class e extends k{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}}@media (pointer:coarse){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){return e.filterValue?e.filterValue:e.valueAccessor?(t,r)=>a(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 r=function(e,t){const r=/* @__PURE__ */new Map,n=/* @__PURE__ */new Map;for(const{field:a,filterValue:o}of t)r.set(a,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!o}),n.set(a,l(a));for(const l of e)for(const{field:e,filterValue:i}of t){const t=r.get(e),a=n.get(e)(l);if(i){const e=i(a,l);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 i=/* @__PURE__ */new Map;for(const[l,{values:a,hasBlank:s}]of r)s&&a.add(o),i.set(l,[...a].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return i}(this.getDataRows(),t);for(const{field:n}of t){const t=this.excludedValues.get(n),i=r.get(n)??[];e[n]=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?o:e)),l=this.getUniqueValues(e),a=new Set(l.filter(e=>!i.has(e)));this.excludedValues.set(e,a)}else"set"===t.type&&this.excludedValues.delete(e);else this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles()}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=(n=t,JSON.stringify(n.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var n;const i=e===this.cachedInputRows;if(this.cacheKey===r&&this.cachedResult&&i)return this.cachedResult;if(!i)for(const[a,o]of this.filters)"set"===o.type&&"in"===o.operator&&this.syncExcludedValues(a,o);const l=function(e,t,r=!1,n){if(!t.length)return e;const i=t.map(e=>d(e,r,n?.get(e.field)));return 1===i.length?e.filter(i[0]):e.filter(e=>{for(let t=0;t<i.length;t++)if(!i[t](e))return!1;return!0})}(e,t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=l,this.cacheKey=r,this.cachedInputRows=e,l}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;h(this.gridElement,b(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||h(this.gridElement,b(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;h(this.gridElement,b(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 u(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=u(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?o:e)),l=new Set(n.filter(e=>!r.has(e)));this.excludedValues.set(e,l)}let l=this.excludedValues.get(e);l||(l=/* @__PURE__ */new Set,this.excludedValues.set(e,l));const a=this.searchText.get(e)??"",s={field:e,column:t,uniqueValues:n,excludedValues:l,searchText:a,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=L(a?.min??o?.min,c),p=L(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,g=n.get(i);let m=h,v=b;const w="blank"===g?.operator;"between"===g?.operator?(m=L(g.value,h),v=L(g.valueTo,b)):"greaterThanOrEqual"===g?.operator?m=L(g.value,h):"lessThanOrEqual"===g?.operator&&(v=L(g.value,b));const y=document.createElement("div");y.className="tbw-filter-range-inputs";const x=document.createElement("div");x.className="tbw-filter-range-group";const C=document.createElement("label");C.textContent=t.t("filter.min","Min"),C.className="tbw-filter-range-label";const E=document.createElement("input");E.type="number",E.className="tbw-filter-range-input",E.min=String(u),E.max=String(p),E.step=String(f),E.value=String(m),x.appendChild(C),x.appendChild(E),y.appendChild(x);const k=document.createElement("span");k.className="tbw-filter-range-separator",k.textContent="–",y.appendChild(k);const F=document.createElement("div");F.className="tbw-filter-range-group";const S=document.createElement("label");S.textContent=t.t("filter.max","Max"),S.className="tbw-filter-range-label";const A=document.createElement("input");A.type="number",A.className="tbw-filter-range-input",A.min=String(u),A.max=String(p),A.step=String(f),A.value=String(v),F.appendChild(S),F.appendChild(A),y.appendChild(F),e.appendChild(y);const N=document.createElement("div");N.className="tbw-filter-range-slider";const T=document.createElement("div");T.className="tbw-filter-range-track";const R=document.createElement("div");R.className="tbw-filter-range-fill";const P=document.createElement("input");P.type="range",P.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",P.min=String(u),P.max=String(p),P.step=String(f),P.value=String(m);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(v),N.appendChild(T),N.appendChild(R),N.appendChild(P),N.appendChild(M),e.appendChild(N);const q=document.createElement("label");q.className="tbw-filter-blank-option";const _=document.createElement("input");_.type="checkbox",_.className="tbw-filter-blank-checkbox",_.checked=w;const B=document.createTextNode("Blank");q.appendChild(_),q.appendChild(B);const V=e=>{E.disabled=e,A.disabled=e,P.disabled=e,M.disabled=e,y.classList.toggle("tbw-filter-disabled",e),N.classList.toggle("tbw-filter-disabled",e)};V(w),_.addEventListener("change",()=>{V(_.checked)}),e.appendChild(q);const $=()=>{const e=parseFloat(P.value),t=parseFloat(M.value),r=p-u,n=(e-u)/r*100,i=(t-u)/r*100;R.style.left=`${n}%`,R.style.width=i-n+"%"};P.addEventListener("input",()=>{const e=Math.min(parseFloat(P.value),parseFloat(M.value));P.value=String(e),E.value=String(e),$()}),M.addEventListener("input",()=>{const e=Math.max(parseFloat(M.value),parseFloat(P.value));M.value=String(e),A.value=String(e),$()}),E.addEventListener("input",()=>{const e=parseFloat(E.value);let t=Number.isFinite(e)?e:u;t=Math.max(u,Math.min(t,parseFloat(A.value))),P.value=String(t),$()}),A.addEventListener("input",()=>{const e=parseFloat(A.value);let t=Number.isFinite(e)?e:p;t=Math.min(p,Math.max(t,parseFloat(E.value))),M.value=String(t),$()}),$();const I=document.createElement("div");I.className="tbw-filter-buttons";const H=document.createElement("button");H.type="button",H.className="tbw-filter-apply-btn",H.textContent=t.t("filter.apply","Apply"),H.addEventListener("click",()=>{if(_.checked)return void t.applyTextFilter("blank","");const e=parseFloat(E.value),r=parseFloat(A.value),n=Number.isFinite(e)?e:h,i=Number.isFinite(r)?r:b;n!==h||i!==b?t.applyTextFilter("between",n,i):t.clearFilter()}),I.appendChild(H);const O=document.createElement("button");O.type="button",O.className="tbw-filter-clear-btn",O.textContent=t.t("filter.clear","Clear Filter"),O.addEventListener("click",()=>{t.clearFilter()}),I.appendChild(O),e.appendChild(I)}(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=S(a?.min)||S(o?.min)||F(c),p=S(a?.max)||S(o?.max)||F(d),f=F(c)||S(a?.min)||S(o?.min),h=F(d)||S(a?.max)||S(o?.max),b=n.get(i);let g=f,m=h;const v="blank"===b?.operator;"between"===b?.operator?(g=S(b.value)||f,m=S(b.valueTo)||h):"greaterThanOrEqual"===b?.operator?g=S(b.value)||f:"lessThanOrEqual"===b?.operator&&(m=S(b.value)||h);const w=document.createElement("div");w.className="tbw-filter-date-range";const y=document.createElement("div");y.className="tbw-filter-date-group";const x=document.createElement("label");x.textContent=t.t("filter.from","From"),x.className="tbw-filter-range-label";const C=document.createElement("input");C.type="date",C.className="tbw-filter-date-input",u&&(C.min=u),p&&(C.max=p),C.value=g,y.appendChild(x),y.appendChild(C),w.appendChild(y);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",w.appendChild(E);const k=document.createElement("div");k.className="tbw-filter-date-group";const A=document.createElement("label");A.textContent="To",A.className="tbw-filter-range-label";const N=document.createElement("input");N.type="date",N.className="tbw-filter-date-input",u&&(N.min=u),p&&(N.max=p),N.value=m,k.appendChild(A),k.appendChild(N),w.appendChild(k),e.appendChild(w);const T=document.createElement("label");T.className="tbw-filter-blank-option";const L=document.createElement("input");L.type="checkbox",L.className="tbw-filter-blank-checkbox",L.checked=v;const R=document.createTextNode("Show only blank");T.appendChild(L),T.appendChild(R);const P=e=>{C.disabled=e,N.disabled=e,w.classList.toggle("tbw-filter-disabled",e)};P(v),L.addEventListener("change",()=>{P(L.checked)}),e.appendChild(T);const M=document.createElement("div");M.className="tbw-filter-buttons";const q=document.createElement("button");q.type="button",q.className="tbw-filter-apply-btn",q.textContent=t.t("filter.apply","Apply"),q.addEventListener("click",()=>{if(L.checked)return void t.applyTextFilter("blank","");const e=C.value,r=N.value,n=e&&e!==f?e:"",i=r&&r!==h?r:"";n&&i?t.applyTextFilter("between",n,i):n?t.applyTextFilter("greaterThanOrEqual",n):i?t.applyTextFilter("lessThanOrEqual",i):t.clearFilter()}),M.appendChild(q);const _=document.createElement("button");_.type="button",_.className="tbw-filter-clear-btn",_.textContent=t.t("filter.clear","Clear Filter"),_.addEventListener("click",()=>{t.clearFilter()}),M.appendChild(_),e.appendChild(M)}(r,s,n,this.filters):T(r,s,n,l,{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===e.supportsAnchorPositioning&&(e.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),e.supportsAnchorPositioning}positionPanel(t,r){const n=r.closest(".header-row")??r;if(n.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=n,e.checkAnchorPositioningSupport()){n.style.anchorName="",r.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=r;const e=n.getBoundingClientRect().bottom-r.getBoundingClientRect().bottom;return t.style.marginTop=`${e+4}px`,void requestAnimationFrame(()=>{const e=t.getBoundingClientRect(),n=r.getBoundingClientRect();e.top<n.top&&t.classList.add("tbw-filter-panel-above")})}const i=n.getBoundingClientRect(),l=r.getBoundingClientRect();t.style.position="fixed",t.style.top=`${i.bottom+4}px`,t.style.left=`${l.right}px`,requestAnimationFrame(()=>{const e=t.getBoundingClientRect();t.style.left=l.right-e.width+"px",l.right-e.width<8&&(t.style.left=`${l.left}px`),e.bottom>window.innerHeight-8&&(t.style.top=i.top-e.height-4+"px",t.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{o as BLANK_FILTER_VALUE,R as FilteringPlugin};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- function e(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function t(t,r,o,n){return`${e(o,n)} ${t}: ${r}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(t)}`}var r="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),o=(new RegExp(`__(proto|defineGetter|defineSetter)|${r.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),n=/^on\w+$/i,i=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),s=/^\s*(javascript|vbscript|data|blob):/i;function l(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const l of r){const e=l.tagName.toLowerCase();if(o.has(e)){t.push(l);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===l.namespaceURI)&&Array.from(l.attributes).some(e=>n.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(l);continue}const r=[];for(const t of l.attributes){const e=t.name.toLowerCase();n.test(e)?r.push(t.name):"is"!==e?(i.has(e)&&s.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>l.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}function d(e,t){t&&"string"==typeof t?-1!==t.indexOf("<")||-1!==t.indexOf("&")?e.replaceChildren(l(t)):e.textContent=t:e.replaceChildren()}var c={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};var u=class{static dependencies;static manifest;aliases;version="3.5.2";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const r={...this.userConfig},o={};for(const t of Object.keys(r))o[t]=this;for(const n of e){const e=n.userConfig;for(const[i,s]of Object.entries(e)){if(void 0===s)continue;if(!(i in r)){r[i]=s,o[i]=n;continue}if(r[i]===s)continue;const e=o[i]?.constructor.name??this.constructor.name,l=n.constructor.name,d=t("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${i}" supplied by both ${e} and ${l}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(d)}}Object.assign(this.userConfig,r)}refreshUserConfigFrom(e){const t=this.userConfig,r={...e.userConfig};for(const o of Object.keys(t))delete t[o];Object.assign(t,r)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const r=this.grid?.query?.(e,t);return Array.isArray(r)?r.some(Boolean):!!r}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...c,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}setIcon(e,t,r){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const o=this.#t(t,r);void 0!==o?"string"==typeof o?d(e,o):o instanceof HTMLElement&&e.replaceChildren(o.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const r=document.createElement("span");r.setAttribute("part","sort-indicator"),r.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(r,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(r,"sortNone"));const o=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return o?e.insertBefore(r,o):e.appendChild(r),r}warn(r,o){void 0!==o?console.warn(t(r,o,this.gridElement.id,this.name)):console.warn(`${e(this.gridElement.id,this.name)} ${r}`)}throwDiagnostic(e,r){throw new Error(t(e,r,this.gridElement.id,this.name))}};function a(e){return e.map(e=>{return e.id?e:(e.header||function(e,r,o,n){throw new Error(t(e,r,o,n))}("TBW113",'ColumnGroupDefinition requires either an "id" or a "header" to generate an id from.'),{...e,id:(r=e.header,r.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""))});var r})}function g(e){if(!e.length)return[];const t=[],r=/* @__PURE__ */new Map,o=(e,r)=>{if(!r.length)return;const o=t[t.length-1];o&&o.implicit&&o.firstIndex+o.columns.length===e?o.columns.push(...r):t.push({id:"__implicit__"+e,label:void 0,columns:r,firstIndex:e,implicit:!0})};let n=[],i=0;return e.forEach((e,s)=>{const l=e.group;if(!l)return 0===n.length&&(i=s),void n.push(e);n.length&&(o(i,n.slice()),n=[]);const d="string"==typeof l?l:l.id,c="string"==typeof l?void 0:l.label;c&&!r.has(d)&&r.set(d,c);const u=r.get(d)??c,a=t[t.length-1];a&&!a.implicit&&a.id===d?a.columns.push(e):t.push({id:d,label:u,columns:[e],firstIndex:s})}),n.length&&o(i,n),1===t.length&&t[0].implicit&&t[0].columns.length===e.length?[]:t}function f(e){const t=function(e){const t=/* @__PURE__ */new Set;for(let r=0;r<e.length;r++){if(!String(e[r].id).startsWith("__implicit__"))continue;if(!e[r].columns.every(e=>e.field?.startsWith("__tbw_")))continue;let o=null;for(let t=r-1;t>=0;t--)if(!String(e[t].id).startsWith("__implicit__")){o=e[t].id;break}let n=null;for(let t=r+1;t<e.length;t++)if(!String(e[t].id).startsWith("__implicit__")){n=e[t].id;break}o&&n&&o===n&&t.add(String(e[r].id))}return t}(e);return{merged:p(e,t),embedded:t}}function h(e,t){const r=e.columns[0],o=e.columns[e.columns.length-1],n=r?t.findIndex(e=>e.field===r.field):-1,i=o?t.findIndex(e=>e.field===o.field):-1;return-1!==n&&-1!==i?[n,i]:null}function p(e,t){const r=[];for(const o of e){if(String(o.id).startsWith("__implicit__")&&t.has(String(o.id)))continue;const e=r[r.length-1];e&&!String(o.id).startsWith("__implicit__")&&e.id===o.id?r[r.length-1]={...e,columns:[...e.columns,...o.columns]}:r.push({...o,columns:[...o.columns]})}return r}function m(e,t){if(!t.group)return;const r="string"==typeof t.group?t.group:t.group.id,o="string"==typeof t.group?t.group:t.group.label??t.group.id,n=e.get(r);n?n.fields.includes(t.field)||n.fields.push(t.field):e.set(r,{id:r,label:o,fields:[t.field]})}var b=class extends u{static manifest={ownedProperties:[{property:"group",level:"column",description:'the "group" column property'},{property:"columnGroups",level:"config",description:'the "columnGroups" config property',isUsed:e=>Array.isArray(e)&&e.length>0}],queries:[{type:"getColumnGrouping",description:"Returns column group metadata for the visibility panel"},{type:"collectHeaderRows",description:"Contributes a group-header row above the leaf header for exports / printers"}]};name="groupingColumns";styles="@layer tbw-plugins{.header-group-row{background:var(--tbw-grouping-columns-header-bg,var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border,var(--tbw-color-border));grid-auto-flow:column;display:grid}.header-group-cell{padding:var(--tbw-button-padding-sm,.25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm,.9em);text-transform:uppercase;letter-spacing:.5px;text-overflow:ellipsis;white-space:nowrap;border-right:2px solid var(--tbw-grouping-columns-separator,var(--tbw-color-border-strong,var(--tbw-color-border)));justify-content:center;align-items:center;min-width:0;display:flex;overflow:hidden}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator,var(--tbw-color-border-strong,var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator,var(--tbw-color-border-strong,var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";get defaultConfig(){return{showGroupBorders:!0,lockGroupOrder:!1}}groups=[];isActive=!1;#r=/* @__PURE__ */new Set;#o=[];#n=/* @__PURE__ */new Map;attach(e){super.attach(e),this.gridElement.addEventListener("column-move",this.#i,{signal:this.disconnectSignal})}detach(){this.groups=[],this.isActive=!1,this.#r.clear(),this.#o=[],this.#n.clear()}#i=e=>{if(!this.isActive)return;const t=e,{field:r,columnOrder:o}=t.detail;if(this.config.lockGroupOrder){const e=/* @__PURE__ */new Map;for(const t of this.groups){if(t.id.startsWith("__implicit__"))continue;const r=e.get(t.id);r?r.push(...t.columns):e.set(t.id,[...t.columns])}for(const[,n]of e)if(!this.#s(n,o))return t.preventDefault(),void this.#l(r)}this.#d(o)};#d(e){this.#r.clear();const t=/* @__PURE__ */new Map;for(const r of this.groups)for(const e of r.columns)t.set(e.field,r.id);for(let r=0;r<e.length-1;r++)t.get(e[r])!==t.get(e[r+1])&&this.#r.add(e[r])}#s(e,t){const r=e.map(e=>t.indexOf(e.field)).filter(e=>-1!==e).sort((e,t)=>e-t);return r.length<=1||r.length===r[r.length-1]-r[0]+1}#l(e){const t=this.gridElement?.querySelector(`.header-row [part~="header-cell"][data-field="${e}"]`);t&&(t.style.setProperty("--_flash-color","var(--tbw-color-error)"),t.animate([{backgroundColor:"rgba(from var(--_flash-color) r g b / 30%)"},{backgroundColor:"transparent"}],{duration:400,easing:"ease-out"}))}handleQuery(e){return"getColumnGrouping"===e.type?this.#c():"collectHeaderRows"===e.type?this.#u(e.context):void 0}#u(e){const t=e?.columns;if(!Array.isArray(t)||0===t.length)return;const r=g(t);if(0===r.length)return;const{merged:o}=f(r),n=[];for(const i of o){const e=String(i.id).startsWith("__implicit__"),r=i.columns[0],o=i.columns[i.columns.length-1];if(!r||!o)continue;const s=t.findIndex(e=>e.field===r.field),l=t.findIndex(e=>e.field===o.field);if(s<0||l<0)continue;const d=l-s+1;n.push({label:e?"":i.label??i.id,span:d,source:this.name})}return 0!==n.length?n.reduce((e,t)=>e+t.span,0)!==t.length?{cells:[{label:"",span:t.length,source:this.name}]}:{cells:n}:void 0}#c(){const e=this.#a()??this.#g()??this.#f();return this.#h(e),e}#a(){if(0!==this.#o.length)return this.#o.filter(e=>e.children.length>0).map(e=>({id:e.id,label:e.header,fields:[...e.children]}))}#g(){if(!this.isActive||0===this.groups.length)return;const e=/* @__PURE__ */new Map;for(const t of this.groups){if(t.id.startsWith("__implicit__"))continue;const r=e.get(t.id);if(r)for(const e of t.columns)r.fields.includes(e.field)||r.fields.push(e.field);else e.set(t.id,{id:t.id,label:t.label??t.id,fields:t.columns.map(e=>e.field)})}for(const t of this.columns)t.hidden&&m(e,t);return Array.from(e.values())}#f(){const e=/* @__PURE__ */new Map;for(const t of this.columns)m(e,t);return Array.from(e.values())}#h(e){const t=this.grid?.getColumnOrder();if(!t||0===t.length)return;const r=new Map(t.map((e,t)=>[e,t]));for(const o of e)o.fields.sort((e,t)=>(r.get(e)??1/0)-(r.get(t)??1/0))}static detect(e,t){const r=t?.features?.groupingColumns;if(r&&"object"==typeof r&&Array.isArray(r.columnGroups)&&r.columnGroups.length>0)return!0;if(t?.columnGroups&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;const o=t?.columns;return!!Array.isArray(o)&&function(e){return e.some(e=>null!=e.group)}(o)}processColumns(e){const t=this.config?.columnGroups,r=this.grid?.gridConfig?.columnGroups;let o,n;if(t&&Array.isArray(t)&&t.length>0?(r&&Array.isArray(r)&&r.length>0&&this.warn("TBW114","columnGroups defined in both gridConfig and groupingColumns feature config. Using feature config (higher precedence)."),o=t):r&&Array.isArray(r)&&r.length>0&&(o=r),o&&o.length>0){const t=a(o);this.#o=t,this.#n.clear();for(const e of t)e.renderer&&this.#n.set(e.id,e.renderer);const r=/* @__PURE__ */new Map;for(const e of t)for(const t of e.children)r.set(t,{id:e.id,label:e.header});n=e.map(e=>{const t=r.get(e.field);return t&&!e.group?{...e,group:t}:e})}else this.#o=[],this.#n.clear(),n=[...e];const i=g(n);if(0===i.length)return this.isActive=!1,this.groups=[],n;if(this.#n.size>0)for(const s of i){const e=this.#n.get(s.id);e&&(s.renderer=e)}this.isActive=!0,this.groups=i,this.#r.clear();for(const s of i){const e=s.columns[s.columns.length-1];e?.field&&this.#r.add(e.field)}return n}afterRender(){if(!this.isActive){const e=(this.gridElement?.querySelector(".header"))?.querySelector(".header-group-row");return void(e&&e.remove())}const e=this.gridElement?.querySelector(".header");if(!e)return;const t=e.querySelector(".header-group-row");t&&t.remove();const r=this.visibleColumns,o=g(r);if(0===o.length)return;if(this.#n.size>0)for(const l of o){const e=this.#n.get(l.id);e&&(l.renderer=e)}this.#r.clear();const n=f(o);for(let l=0;l<n.merged.length;l++){const e=n.merged[l],t=e.columns[e.columns.length-1];t?.field&&l<n.merged.length-1&&this.#r.add(t.field)}const i=function(e,t,r,o){if(0===e.length)return null;const n=document.createElement("div");n.className="header-group-row",n.setAttribute("role","row");const{merged:i}=o??f(e);for(const s of i){const e=String(s.id),o=e.startsWith("__implicit__"),i=h(s,t);if(!i)continue;const[l,c]=i,u=c-l+1,a=o?"":s.label||s.id,g=document.createElement("div");g.className="cell header-group-cell",o&&g.classList.add("implicit-group"),g.setAttribute("data-group",e),g.style.gridColumn=`${l+1} / span ${u}`;const f=!o&&(s.renderer||r)||void 0;if(f&&!o){const t=f({id:e,label:String(a),columns:s.columns,firstIndex:l,isImplicit:!1});t instanceof HTMLElement?g.appendChild(t):"string"==typeof t?d(g,t):g.textContent=a}else g.textContent=a;n.appendChild(g)}return n}(o,r,this.config.groupHeaderRenderer,n);if(i){i.classList.toggle("no-borders",!this.config.showGroupBorders);const t=e.querySelector(".header-row");t?e.insertBefore(i,t):e.appendChild(i)}const s=e.querySelector(".header-row");s&&(s.classList.toggle("no-group-borders",!this.config.showGroupBorders),function(e,t,r,o){if(!t.length||!e)return;const{merged:n,embedded:i}=o??f(t),s=/* @__PURE__ */new Map;for(const d of n)if(!String(d.id).startsWith("__implicit__"))for(const e of d.columns)e.field&&s.set(e.field,d.id);for(let d=0;d<t.length;d++){const e=t[d];if(String(e.id).startsWith("__implicit__")&&i.has(String(e.id)))for(let r=d-1;r>=0;r--)if(!String(t[r].id).startsWith("__implicit__")){for(const o of e.columns)o.field&&s.set(o.field,t[r].id);break}}const l=Array.from(e.querySelectorAll(".cell[data-field]"));l.forEach(e=>{const t=e.getAttribute("data-field")||"",r=s.get(t);r&&(e.classList.add("grouped"),e.getAttribute("data-group")||e.setAttribute("data-group",r))});for(const d of n){const e=d.columns[d.columns.length-1],t=l.find(t=>t.getAttribute("data-field")===e.field);t&&t.classList.add("group-end")}}(s,o,0,n))}afterCellRender(e){this.isActive&&this.config.showGroupBorders&&e.cellElement.classList.toggle("group-end",this.#r.has(e.column.field))}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){return this.groups.filter(t=>t.id===e).flatMap(e=>e.columns)}refresh(){this.requestRender()}};export{b as GroupingColumnsPlugin};
1
+ function e(e,t){return`[tbw-grid${e?`#${e}`:""}${t?`:${t}`:""}]`}function t(t,r,o,n){return`${e(o,n)} ${t}: ${r}\n\n → More info: ${function(e){return`https://toolboxjs.com/grid/errors#${e.toLowerCase()}`}(t)}`}var r="__otorp__|__retteGenifed__|__retteSenifed__|rotcurtsnoc|wodniw|sihTlabolg|labolg|ssecorp|noitcnuF|tropmi|lave|tcelfeR|yxorP|rorrE|stnemugra|tnemucod|noitacol|eikooc|egarotSlacol|egarotSnoisses|BDdexedni|hctef|tseuqeRpttHLMX|tekcoSbeW|rekroW|rekroWderahS|rekroWecivreS|renepo|tnerap|pot|semarf|fles".split("|").map(e=>e.split("").reverse().join("")),o=(new RegExp(`__(proto|defineGetter|defineSetter)|${r.slice(3).join("|")}|this\\b`),new Set("script|iframe|object|embed|form|input|button|textarea|select|link|meta|base|style|template|slot|portal|frame|frameset|applet|noscript|noembed|plaintext|xmp|listing|math".split("|"))),n=/^on\w+$/i,i=new Set("href|src|action|formaction|data|srcdoc|xlink:href|poster|srcset".split("|")),s=/^\s*(javascript|vbscript|data|blob):/i;function l(e){const t=document.createElement("template");return e&&"string"==typeof e&&(t.innerHTML=e,function(e){const t=[],r=e.querySelectorAll("*");for(const l of r){const e=l.tagName.toLowerCase();if(o.has(e)){t.push(l);continue}if(("svg"===e||"http://www.w3.org/2000/svg"===l.namespaceURI)&&Array.from(l.attributes).some(e=>n.test(e.name)||"href"===e.name||"xlink:href"===e.name)){t.push(l);continue}const r=[];for(const t of l.attributes){const e=t.name.toLowerCase();n.test(e)?r.push(t.name):"is"!==e?(i.has(e)&&s.test(t.value)||"style"===e&&/expression\s*\(|javascript:|behavior\s*:/i.test(t.value))&&r.push(t.name):r.push(t.name)}r.forEach(e=>l.removeAttribute(e))}t.forEach(e=>e.remove())}(t.content)),t.content}function d(e,t){t&&"string"==typeof t?-1!==t.indexOf("<")||-1!==t.indexOf("&")?e.replaceChildren(l(t)):e.textContent=t:e.replaceChildren()}var c={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:"",filterActive:"",print:"🖨️"};var u=class{static dependencies;static manifest;aliases;version="3.5.3";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#e;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}get resolvedConfig(){return this.#e?this.config:{...this.defaultConfig,...this.userConfig}}mergeConfigsFrom(e){if(0===e.length)return;const r={...this.userConfig},o={};for(const t of Object.keys(r))o[t]=this;for(const n of e){const e=n.userConfig;for(const[i,s]of Object.entries(e)){if(void 0===s)continue;if(!(i in r)){r[i]=s,o[i]=n;continue}if(r[i]===s)continue;const e=o[i]?.constructor.name??this.constructor.name,l=n.constructor.name,d=t("TBW025",`Cannot merge plugin configs for "${this.name}": conflicting value for "${i}" supplied by both ${e} and ${l}. Pass the option on a single instance, or remove the duplicate.`,void 0,this.name);throw new Error(d)}}Object.assign(this.userConfig,r)}refreshUserConfigFrom(e){const t=this.userConfig,r={...e.userConfig};for(const o of Object.keys(t))delete t[o];Object.assign(t,r)}attach(e){this.#e?.abort(),this.#e=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#e?.abort(),this.#e=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const r=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(r),r.defaultPrevented}on(e,t){this.grid?._pluginManager?.subscribe(this,e,t)}off(e){this.grid?._pluginManager?.unsubscribe(this,e)}emitPluginEvent(e,t){this.grid?._pluginManager?.emitPluginEvent(e,t)}broadcast(e,t){this.emitPluginEvent(e,t),this.emit(e,t)}queryBoolean(e,t=null){const r=this.grid?.query?.(e,t);return Array.isArray(r)?r.some(Boolean):!!r}requestRender(){this.grid?.requestRender?.()}requestColumnsRender(){this.grid?.requestColumnsRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}requestVirtualRefresh(){this.grid?.requestVirtualRefresh?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid?._hostElement}get disconnectSignal(){return this.#e?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...c,...e}}t(e,t){return this.grid?.effectiveConfig?.locale?.[e]??t}get translate(){return(e,t)=>this.t(e,t)}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(!1===e||"off"===e)return!1;if(!0===e||"on"===e)return!0;const t=this.gridElement;return!t||"0"!==getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),r=parseInt(t,10);if(!isNaN(r))return r}return 200}setIcon(e,t,r){e.dataset.icon=t.replace(/([A-Z])/g,"-$1").toLowerCase(),"collapse"===t?e.dataset.expanded="":"expand"===t&&delete e.dataset.expanded;const o=this.#t(t,r);void 0!==o?"string"==typeof o?d(e,o):o instanceof HTMLElement&&e.replaceChildren(o.cloneNode(!0)):e.innerHTML=""}#t(e,t){return void 0!==t?t:this.grid?.gridConfig?.icons?.[e]}updateSortIndicator(e,t){e.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove();const r=document.createElement("span");r.setAttribute("part","sort-indicator"),r.className="sort-indicator",t?(e.setAttribute("aria-sort","asc"===t?"ascending":"descending"),e.setAttribute("data-sort",t),this.setIcon(r,"asc"===t?"sortAsc":"sortDesc")):(e.setAttribute("aria-sort","none"),e.removeAttribute("data-sort"),this.setIcon(r,"sortNone"));const o=e.querySelector(".tbw-filter-btn")??e.querySelector(".resize-handle");return o?e.insertBefore(r,o):e.appendChild(r),r}warn(r,o){void 0!==o?console.warn(t(r,o,this.gridElement.id,this.name)):console.warn(`${e(this.gridElement.id,this.name)} ${r}`)}throwDiagnostic(e,r){throw new Error(t(e,r,this.gridElement.id,this.name))}};function a(e){return e.map(e=>{return e.id?e:(e.header||function(e,r,o,n){throw new Error(t(e,r,o,n))}("TBW113",'ColumnGroupDefinition requires either an "id" or a "header" to generate an id from.'),{...e,id:(r=e.header,r.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""))});var r})}function g(e){if(!e.length)return[];const t=[],r=/* @__PURE__ */new Map,o=(e,r)=>{if(!r.length)return;const o=t[t.length-1];o&&o.implicit&&o.firstIndex+o.columns.length===e?o.columns.push(...r):t.push({id:"__implicit__"+e,label:void 0,columns:r,firstIndex:e,implicit:!0})};let n=[],i=0;return e.forEach((e,s)=>{const l=e.group;if(!l)return 0===n.length&&(i=s),void n.push(e);n.length&&(o(i,n.slice()),n=[]);const d="string"==typeof l?l:l.id,c="string"==typeof l?void 0:l.label;c&&!r.has(d)&&r.set(d,c);const u=r.get(d)??c,a=t[t.length-1];a&&!a.implicit&&a.id===d?a.columns.push(e):t.push({id:d,label:u,columns:[e],firstIndex:s})}),n.length&&o(i,n),1===t.length&&t[0].implicit&&t[0].columns.length===e.length?[]:t}function f(e){const t=function(e){const t=/* @__PURE__ */new Set;for(let r=0;r<e.length;r++){if(!String(e[r].id).startsWith("__implicit__"))continue;if(!e[r].columns.every(e=>e.field?.startsWith("__tbw_")))continue;let o=null;for(let t=r-1;t>=0;t--)if(!String(e[t].id).startsWith("__implicit__")){o=e[t].id;break}let n=null;for(let t=r+1;t<e.length;t++)if(!String(e[t].id).startsWith("__implicit__")){n=e[t].id;break}o&&n&&o===n&&t.add(String(e[r].id))}return t}(e);return{merged:p(e,t),embedded:t}}function h(e,t){const r=e.columns[0],o=e.columns[e.columns.length-1],n=r?t.findIndex(e=>e.field===r.field):-1,i=o?t.findIndex(e=>e.field===o.field):-1;return-1!==n&&-1!==i?[n,i]:null}function p(e,t){const r=[];for(const o of e){if(String(o.id).startsWith("__implicit__")&&t.has(String(o.id)))continue;const e=r[r.length-1];e&&!String(o.id).startsWith("__implicit__")&&e.id===o.id?r[r.length-1]={...e,columns:[...e.columns,...o.columns]}:r.push({...o,columns:[...o.columns]})}return r}function m(e,t){if(!t.group)return;const r="string"==typeof t.group?t.group:t.group.id,o="string"==typeof t.group?t.group:t.group.label??t.group.id,n=e.get(r);n?n.fields.includes(t.field)||n.fields.push(t.field):e.set(r,{id:r,label:o,fields:[t.field]})}var b=class extends u{static manifest={ownedProperties:[{property:"group",level:"column",description:'the "group" column property'},{property:"columnGroups",level:"config",description:'the "columnGroups" config property',isUsed:e=>Array.isArray(e)&&e.length>0}],queries:[{type:"getColumnGrouping",description:"Returns column group metadata for the visibility panel"},{type:"collectHeaderRows",description:"Contributes a group-header row above the leaf header for exports / printers"}]};name="groupingColumns";styles="@layer tbw-plugins{.header-group-row{background:var(--tbw-grouping-columns-header-bg,var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border,var(--tbw-color-border));grid-auto-flow:column;display:grid}.header-group-cell{padding:var(--tbw-button-padding-sm,.25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm,.9em);text-transform:uppercase;letter-spacing:.5px;text-overflow:ellipsis;white-space:nowrap;border-right:2px solid var(--tbw-grouping-columns-separator,var(--tbw-color-border-strong,var(--tbw-color-border)));justify-content:center;align-items:center;min-width:0;display:flex;overflow:hidden}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator,var(--tbw-color-border-strong,var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator,var(--tbw-color-border-strong,var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";get defaultConfig(){return{showGroupBorders:!0,lockGroupOrder:!1}}groups=[];isActive=!1;#r=/* @__PURE__ */new Set;#o=[];#n=/* @__PURE__ */new Map;attach(e){super.attach(e),this.gridElement.addEventListener("column-move",this.#i,{signal:this.disconnectSignal})}detach(){this.groups=[],this.isActive=!1,this.#r.clear(),this.#o=[],this.#n.clear()}#i=e=>{if(!this.isActive)return;const t=e,{field:r,columnOrder:o}=t.detail;if(this.config.lockGroupOrder){const e=/* @__PURE__ */new Map;for(const t of this.groups){if(t.id.startsWith("__implicit__"))continue;const r=e.get(t.id);r?r.push(...t.columns):e.set(t.id,[...t.columns])}for(const[,n]of e)if(!this.#s(n,o))return t.preventDefault(),void this.#l(r)}this.#d(o)};#d(e){this.#r.clear();const t=/* @__PURE__ */new Map;for(const r of this.groups)for(const e of r.columns)t.set(e.field,r.id);for(let r=0;r<e.length-1;r++)t.get(e[r])!==t.get(e[r+1])&&this.#r.add(e[r])}#s(e,t){const r=e.map(e=>t.indexOf(e.field)).filter(e=>-1!==e).sort((e,t)=>e-t);return r.length<=1||r.length===r[r.length-1]-r[0]+1}#l(e){const t=this.gridElement?.querySelector(`.header-row [part~="header-cell"][data-field="${e}"]`);t&&(t.style.setProperty("--_flash-color","var(--tbw-color-error)"),t.animate([{backgroundColor:"rgba(from var(--_flash-color) r g b / 30%)"},{backgroundColor:"transparent"}],{duration:400,easing:"ease-out"}))}handleQuery(e){return"getColumnGrouping"===e.type?this.#c():"collectHeaderRows"===e.type?this.#u(e.context):void 0}#u(e){const t=e?.columns;if(!Array.isArray(t)||0===t.length)return;const r=g(t);if(0===r.length)return;const{merged:o}=f(r),n=[];for(const i of o){const e=String(i.id).startsWith("__implicit__"),r=i.columns[0],o=i.columns[i.columns.length-1];if(!r||!o)continue;const s=t.findIndex(e=>e.field===r.field),l=t.findIndex(e=>e.field===o.field);if(s<0||l<0)continue;const d=l-s+1;n.push({label:e?"":i.label??i.id,span:d,source:this.name})}return 0!==n.length?n.reduce((e,t)=>e+t.span,0)!==t.length?{cells:[{label:"",span:t.length,source:this.name}]}:{cells:n}:void 0}#c(){const e=this.#a()??this.#g()??this.#f();return this.#h(e),e}#a(){if(0!==this.#o.length)return this.#o.filter(e=>e.children.length>0).map(e=>({id:e.id,label:e.header,fields:[...e.children]}))}#g(){if(!this.isActive||0===this.groups.length)return;const e=/* @__PURE__ */new Map;for(const t of this.groups){if(t.id.startsWith("__implicit__"))continue;const r=e.get(t.id);if(r)for(const e of t.columns)r.fields.includes(e.field)||r.fields.push(e.field);else e.set(t.id,{id:t.id,label:t.label??t.id,fields:t.columns.map(e=>e.field)})}for(const t of this.columns)t.hidden&&m(e,t);return Array.from(e.values())}#f(){const e=/* @__PURE__ */new Map;for(const t of this.columns)m(e,t);return Array.from(e.values())}#h(e){const t=this.grid?.getColumnOrder();if(!t||0===t.length)return;const r=new Map(t.map((e,t)=>[e,t]));for(const o of e)o.fields.sort((e,t)=>(r.get(e)??1/0)-(r.get(t)??1/0))}static detect(e,t){const r=t?.features?.groupingColumns;if(r&&"object"==typeof r&&Array.isArray(r.columnGroups)&&r.columnGroups.length>0)return!0;if(t?.columnGroups&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;const o=t?.columns;return!!Array.isArray(o)&&function(e){return e.some(e=>null!=e.group)}(o)}processColumns(e){const t=this.config?.columnGroups,r=this.grid?.gridConfig?.columnGroups;let o,n;if(t&&Array.isArray(t)&&t.length>0?(r&&Array.isArray(r)&&r.length>0&&this.warn("TBW114","columnGroups defined in both gridConfig and groupingColumns feature config. Using feature config (higher precedence)."),o=t):r&&Array.isArray(r)&&r.length>0&&(o=r),o&&o.length>0){const t=a(o);this.#o=t,this.#n.clear();for(const e of t)e.renderer&&this.#n.set(e.id,e.renderer);const r=/* @__PURE__ */new Map;for(const e of t)for(const t of e.children)r.set(t,{id:e.id,label:e.header});n=e.map(e=>{const t=r.get(e.field);return t&&!e.group?{...e,group:t}:e})}else this.#o=[],this.#n.clear(),n=[...e];const i=g(n);if(0===i.length)return this.isActive=!1,this.groups=[],n;if(this.#n.size>0)for(const s of i){const e=this.#n.get(s.id);e&&(s.renderer=e)}this.isActive=!0,this.groups=i,this.#r.clear();for(const s of i){const e=s.columns[s.columns.length-1];e?.field&&this.#r.add(e.field)}return n}afterRender(){if(!this.isActive){const e=(this.gridElement?.querySelector(".header"))?.querySelector(".header-group-row");return void(e&&e.remove())}const e=this.gridElement?.querySelector(".header");if(!e)return;const t=e.querySelector(".header-group-row");t&&t.remove();const r=this.visibleColumns,o=g(r);if(0===o.length)return;if(this.#n.size>0)for(const l of o){const e=this.#n.get(l.id);e&&(l.renderer=e)}this.#r.clear();const n=f(o);for(let l=0;l<n.merged.length;l++){const e=n.merged[l],t=e.columns[e.columns.length-1];t?.field&&l<n.merged.length-1&&this.#r.add(t.field)}const i=function(e,t,r,o){if(0===e.length)return null;const n=document.createElement("div");n.className="header-group-row",n.setAttribute("role","row");const{merged:i}=o??f(e);for(const s of i){const e=String(s.id),o=e.startsWith("__implicit__"),i=h(s,t);if(!i)continue;const[l,c]=i,u=c-l+1,a=o?"":s.label||s.id,g=document.createElement("div");g.className="cell header-group-cell",o&&g.classList.add("implicit-group"),g.setAttribute("data-group",e),g.style.gridColumn=`${l+1} / span ${u}`;const f=!o&&(s.renderer||r)||void 0;if(f&&!o){const t=f({id:e,label:String(a),columns:s.columns,firstIndex:l,isImplicit:!1});t instanceof HTMLElement?g.appendChild(t):"string"==typeof t?d(g,t):g.textContent=a}else g.textContent=a;n.appendChild(g)}return n}(o,r,this.config.groupHeaderRenderer,n);if(i){i.classList.toggle("no-borders",!this.config.showGroupBorders);const t=e.querySelector(".header-row");t?e.insertBefore(i,t):e.appendChild(i)}const s=e.querySelector(".header-row");s&&(s.classList.toggle("no-group-borders",!this.config.showGroupBorders),function(e,t,r,o){if(!t.length||!e)return;const{merged:n,embedded:i}=o??f(t),s=/* @__PURE__ */new Map;for(const d of n)if(!String(d.id).startsWith("__implicit__"))for(const e of d.columns)e.field&&s.set(e.field,d.id);for(let d=0;d<t.length;d++){const e=t[d];if(String(e.id).startsWith("__implicit__")&&i.has(String(e.id)))for(let r=d-1;r>=0;r--)if(!String(t[r].id).startsWith("__implicit__")){for(const o of e.columns)o.field&&s.set(o.field,t[r].id);break}}const l=Array.from(e.querySelectorAll(".cell[data-field]"));l.forEach(e=>{const t=e.getAttribute("data-field")||"",r=s.get(t);r&&(e.classList.add("grouped"),e.getAttribute("data-group")||e.setAttribute("data-group",r))});for(const d of n){const e=d.columns[d.columns.length-1],t=l.find(t=>t.getAttribute("data-field")===e.field);t&&t.classList.add("group-end")}}(s,o,0,n))}afterCellRender(e){this.isActive&&this.config.showGroupBorders&&e.cellElement.classList.toggle("group-end",this.#r.has(e.column.field))}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){return this.groups.filter(t=>t.id===e).flatMap(e=>e.columns)}refresh(){this.requestRender()}};export{b as GroupingColumnsPlugin};
2
2
  //# sourceMappingURL=index.js.map