bways-grid 0.0.17 → 0.0.18

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.
@@ -27,6 +27,9 @@ export declare class ColumnToolPanelComponent implements OnChanges {
27
27
  getColumnHeader(field: string): string;
28
28
  applySearch(): void;
29
29
  toggleVisibility(col: UltraGridColumn): void;
30
+ isAllColumnsSelected(): boolean;
31
+ isSomeColumnsSelected(): boolean;
32
+ toggleAllColumns(): void;
30
33
  onDrop(event: CdkDragDrop<UltraGridColumn[]>): void;
31
34
  onGroupDrop(event: CdkDragDrop<UltraGridColumn[]>): void;
32
35
  removeGroup(col: UltraGridColumn): void;
@@ -42,6 +42,8 @@ export declare class FilterToolPanelComponent implements OnChanges {
42
42
  importReportRequested: EventEmitter<any>;
43
43
  sections: FilterSection[];
44
44
  private _loadedFields;
45
+ showSaveModal: boolean;
46
+ reportNameInput: string;
45
47
  constructor(cdr: ChangeDetectorRef);
46
48
  get hasAnyActiveFilter(): boolean;
47
49
  ngOnChanges(changes: SimpleChanges): void;
@@ -63,6 +65,8 @@ export declare class FilterToolPanelComponent implements OnChanges {
63
65
  onClearAll(): void;
64
66
  trackByField(index: number, section: FilterSection): string;
65
67
  onSaveReportPrompt(): void;
68
+ confirmSaveReport(): void;
69
+ cancelSaveReport(): void;
66
70
  onImportReport(): void;
67
71
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterToolPanelComponent, never>;
68
72
  static ɵcmp: i0.ɵɵComponentDeclaration<FilterToolPanelComponent, "ug-filter-tool-panel", never, { "columns": { "alias": "columns"; "required": false; }; "rowData": { "alias": "rowData"; "required": false; }; "activeFilters": { "alias": "activeFilters"; "required": false; }; "conditionFilters": { "alias": "conditionFilters"; "required": false; }; }, { "filterApplied": "filterApplied"; "conditionFilterChanged": "conditionFilterChanged"; "clearAllFilters": "clearAllFilters"; "saveReportRequested": "saveReportRequested"; "importReportRequested": "importReportRequested"; }, never, never, true, never>;
@@ -45,6 +45,7 @@ export declare class UltraGridComponent implements OnInit, OnDestroy, OnChanges
45
45
  private _dynamicPivotColumns;
46
46
  private _userColumns;
47
47
  private _isRebuildingColumns;
48
+ private _autoColumnWidth;
48
49
  _internalDataSource?: InfiniteScrollDataSource<UltraGridRow>;
49
50
  _localTreeData: UltraGridNode[];
50
51
  _unpaginatedLocalData: UltraGridRow[];
@@ -1 +1 @@
1
- export declare const SORTING_WORKER_CODE = "\"use strict\";(()=>{var b=[],h=[];addEventListener(\"message\",e=>{let{action:a,rows:o,sortModel:r,filterModel:i,conditionFilters:t,groupModel:n,aggregations:u,groupStateMap:d}=e.data;if(a===\"INIT\"){b=(o||[]).map(l=>({...l,type:\"leaf\",level:0})),postMessage({action:\"INIT_DONE\"});return}if(a===\"FLATTEN_ONLY\"){let s=U(h,d||{},e.data.groupIncludeFooter);postMessage({flatList:s});return}if(a===\"EXECUTE\"){let s=b,{pivotMode:l,pivotColumns:c}=e.data;if(i&&Object.keys(i).length>0){let g={};for(let p of Object.keys(i))g[p]=new Set(i[p]);s=s.filter(p=>{for(let G of Object.keys(g)){let O=g[G],S=p.data?p.data[G]:null;if(!O.has(S))return!1}return!0})}t&&Object.keys(t).length>0&&(s=$(s,t));let f={...u||{}},y=[];if(l&&c&&c.length>0&&Object.keys(f).length>0){let{virtualAggrs:g,dynamicColumns:p}=K(s,c,f);f=g,y=p}let N=s;if(n&&n.length>0?N=M(s,n,f):s.forEach(g=>g.level=0),r&&r.length>0&&E(N,r),h=N,n&&n.length>0&&e.data.groupIncludeFooter&&Object.keys(f).length>0){let p={id:\"grand-total-footer\",type:\"group-footer\",level:0,groupField:\"Grand Total\",groupKey:\"Grand Total\",data:k(s,f)};h.push(p)}let m=U(h,d||{},e.data.groupIncludeFooter),F=L(h);postMessage({flatList:m,resultTree:F,pivotColumns:y})}});function L(e){return e.map(a=>{if(a.type===\"leaf\")return{id:a.id,type:\"leaf\",level:a.level};if(a.type===\"group\"){let o=a;return{...o,children:o.children?L(o.children):void 0}}return a})}function U(e,a,o=!1){let r=[],i=[];for(let t=e.length-1;t>=0;t--)i.push(e[t]);for(;i.length>0;){let t=i.pop();if(t.type===\"group\"){let n=t;if(r.push({id:n.id,type:\"group\",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:n.data,childCount:n.children?n.children.length:0}),!!a[n.id]&&(o&&i.push({id:`${n.id}-footer`,type:\"group-footer\",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:{...n.data}}),n.children))for(let d=n.children.length-1;d>=0;d--)i.push(n.children[d])}else t.type===\"group-footer\"?r.push({id:t.id,type:\"group-footer\",level:t.level,groupField:t.groupField,groupKey:t.groupKey,data:t.data}):r.push({id:t.id,type:\"leaf\",level:t.level})}return r}function C(e){let a=[],o=[...e];for(;o.length>0;){let r=o.pop();if(I(r))a.push(r);else if(j(r)&&r.children)for(let i=r.children.length-1;i>=0;i--)o.push(r.children[i])}return a}function I(e){return e.type===\"leaf\"}function j(e){return e.type===\"group\"}function A(e){if(typeof e==\"number\")return e;if(typeof e!=\"string\")return e==null?0:Number(e);let a=e.trim();if(!a)return 0;let o=a.startsWith(\"(\")&&a.endsWith(\")\"),r=a.replace(/[\\u2212\\u2013\\u2014]/g,\"-\");r.includes(\"-\")&&(o=!0),r=r.replace(/[^0-9.]/g,\"\");let i=r?Number(r):0;return isNaN(i)?0:o?-i:i}function M(e,a,o){return T(e,a,0,o,\"root\")}function T(e,a,o,r,i){let t=a[o],n=o===a.length-1,u=new Map;for(let s of e){let l=s.data?s.data[t]:null;u.has(l)||u.set(l,[]),u.get(l).push(s)}let d=[];for(let[s,l]of u.entries()){let c=`${i}-${t}-${s}`,f={id:c,type:\"group\",level:o,groupField:t,groupKey:s,data:{[t]:s},children:[]},y=C(l),N=k(y,r);Object.assign(f.data,N),n?(l.forEach(m=>m.level=o+1),f.children=l):f.children=T(l,a,o+1,r,c),d.push(f)}return d}function k(e,a){let o={};for(let r of Object.keys(a)){let i=a[r],t=0;if(i===\"count\")t=e.length;else{let n=!0,u=0,d=0;for(let s of e){let l=s.data?s.data[r]:null,c=A(l);i===\"sum\"?t=Number(t)+c:i===\"min\"?n?t=c:t=Math.min(t,c):i===\"max\"?n?t=c:t=Math.max(t,c):i===\"avg\"&&(u=Number(u)+c,d++),n=!1}i===\"avg\"&&(t=d>0?u/d:0)}o[r]=t}return o}function E(e,a){e.sort((o,r)=>{for(let i of a){let{field:t,direction:n}=i,u=o.data?o.data[t]:null,d=r.data?r.data[t]:null;if(u===d)continue;let s=u>d?1:-1;return n===\"asc\"?s:-s}return 0});for(let o of e)o.type===\"group\"&&o.children&&E(o.children,a)}function $(e,a){let o=Object.keys(a);return o.length===0?e:e.filter(r=>{for(let i of o){let t=a[i];if(!t||!t.condition1)continue;let n=r.data?r.data[i]:null,u=v(n,t.condition1);if(t.condition2&&t.condition2.type){let d=v(n,t.condition2);if(!(t.operator===\"OR\"?u||d:u&&d))return!1}else if(!u)return!1}return!0})}function v(e,a){let{type:o,value:r,valueTo:i}=a;if(o===\"blank\")return e==null||e===\"\";if(o===\"notBlank\")return e!=null&&e!==\"\";if(r==null||r===\"\")return!0;let t=String(e??\"\").toLowerCase(),n=String(r).toLowerCase();switch(o){case\"contains\":return t.includes(n);case\"notContains\":return!t.includes(n);case\"equals\":return!isNaN(Number(e))&&!isNaN(Number(r))?Number(e)===Number(r):t===n;case\"notEqual\":return!isNaN(Number(e))&&!isNaN(Number(r))?Number(e)!==Number(r):t!==n;case\"startsWith\":return t.startsWith(n);case\"endsWith\":return t.endsWith(n);case\"greaterThan\":return Number(e)>Number(r);case\"greaterThanOrEqual\":return Number(e)>=Number(r);case\"lessThan\":return Number(e)<Number(r);case\"lessThanOrEqual\":return Number(e)<=Number(r);case\"inRange\":if(i==null||i===\"\")return!0;let u=Number(e);return u>=Number(r)&&u<=Number(i);default:return!0}}function K(e,a,o){let r={};a.forEach(d=>r[d]=new Set),e.forEach(d=>{a.forEach(s=>{let l=d.data[s];l!=null&&r[s].add(l)})});let i={},t=[],n=a[0];return Array.from(r[n]).sort().forEach(d=>{Object.keys(o).forEach(s=>{let l=o[s],c=`pivot_${n}_${d}_${s}`;i[c]=l,t.push({field:c,headerName:`${d} (${s})`,pivotValue:d,originalField:s,isPivotColumn:!0}),e.forEach(f=>{String(f.data[n])===String(d)?f.data[c]=f.data[s]:f.data[c]=null})})}),{virtualAggrs:i,dynamicColumns:t}}})();\n";
1
+ export declare const SORTING_WORKER_CODE = "\"use strict\";(()=>{var U=[],h=[];addEventListener(\"message\",t=>{let{action:o,rows:a,sortModel:r,filterModel:i,conditionFilters:e,groupModel:n,aggregations:l,groupStateMap:d}=t.data;if(o===\"INIT\"){U=(a||[]).map(u=>({...u,type:\"leaf\",level:0})),postMessage({action:\"INIT_DONE\"});return}if(o===\"FLATTEN_ONLY\"){let s=v(h,d||{},t.data.groupIncludeFooter);postMessage({flatList:s});return}if(o===\"EXECUTE\"){let s=U,{pivotMode:u,pivotColumns:f}=t.data;if(i&&Object.keys(i).length>0){let p={};for(let g of Object.keys(i))p[g]=new Set(i[g]);s=s.filter(g=>{for(let b of Object.keys(p)){let O=p[b],S=g.data?g.data[b]:null;if(!O.has(S))return!1}return!0})}e&&Object.keys(e).length>0&&(s=$(s,e));let c={...l||{}},y=[];if(u&&f&&f.length>0&&Object.keys(c).length>0){let{virtualAggrs:p,dynamicColumns:g}=D(s,f,c);c=p,y=g}let N=s;if(n&&n.length>0?N=M(s,n,c):u&&f&&f.length>0&&Object.keys(c).length>0?N=[{id:\"pivot-root\",type:\"leaf\",level:0,data:G(s,c)}]:s.forEach(p=>p.level=0),r&&r.length>0&&E(N,r),h=N,n&&n.length>0&&t.data.groupIncludeFooter&&Object.keys(c).length>0){let g={id:\"grand-total-footer\",type:\"group-footer\",level:0,groupField:\"Grand Total\",groupKey:\"Grand Total\",data:G(s,c)};h.push(g)}let m=v(h,d||{},t.data.groupIncludeFooter),F=T(h);postMessage({flatList:m,resultTree:F,pivotColumns:y})}});function T(t){return t.map(o=>{if(o.type===\"leaf\")return{id:o.id,type:\"leaf\",level:o.level,data:o.id===\"pivot-root\"?o.data:void 0};if(o.type===\"group\"){let a=o;return{...a,children:a.children?T(a.children):void 0}}return o})}function v(t,o,a=!1){let r=[],i=[];for(let e=t.length-1;e>=0;e--)i.push(t[e]);for(;i.length>0;){let e=i.pop();if(e.type===\"group\"){let n=e;if(r.push({id:n.id,type:\"group\",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:n.data,childCount:n.children?n.children.length:0}),!!o[n.id]&&(a&&i.push({id:`${n.id}-footer`,type:\"group-footer\",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:{...n.data}}),n.children))for(let d=n.children.length-1;d>=0;d--)i.push(n.children[d])}else e.type===\"group-footer\"?r.push({id:e.id,type:\"group-footer\",level:e.level,groupField:e.groupField,groupKey:e.groupKey,data:e.data}):r.push({id:e.id,type:\"leaf\",level:e.level,data:e.id===\"pivot-root\"?e.data:void 0})}return r}function j(t){let o=[],a=[...t];for(;a.length>0;){let r=a.pop();if(C(r))o.push(r);else if(I(r)&&r.children)for(let i=r.children.length-1;i>=0;i--)a.push(r.children[i])}return o}function C(t){return t.type===\"leaf\"}function I(t){return t.type===\"group\"}function A(t){if(typeof t==\"number\")return t;if(typeof t!=\"string\")return t==null?0:Number(t);let o=t.trim();if(!o)return 0;let a=o.startsWith(\"(\")&&o.endsWith(\")\"),r=o.replace(/[\\u2212\\u2013\\u2014]/g,\"-\");r.includes(\"-\")&&(a=!0),r=r.replace(/[^0-9.]/g,\"\");let i=r?Number(r):0;return isNaN(i)?0:a?-i:i}function M(t,o,a){return k(t,o,0,a,\"root\")}function k(t,o,a,r,i){let e=o[a],n=a===o.length-1,l=new Map;for(let s of t){let u=s.data?s.data[e]:null;l.has(u)||l.set(u,[]),l.get(u).push(s)}let d=[];for(let[s,u]of l.entries()){let f=`${i}-${e}-${s}`,c={id:f,type:\"group\",level:a,groupField:e,groupKey:s,data:{[e]:s},children:[]},y=j(u),N=G(y,r);Object.assign(c.data,N),n?(u.forEach(m=>m.level=a+1),c.children=u):c.children=k(u,o,a+1,r,f),d.push(c)}return d}function G(t,o){let a={};for(let r of Object.keys(o)){let i=o[r],e=0;if(i===\"count\")e=t.length;else{let n=!0,l=0,d=0;for(let s of t){let u=s.data?s.data[r]:null,f=A(u);i===\"sum\"?e=Number(e)+f:i===\"min\"?n?e=f:e=Math.min(e,f):i===\"max\"?n?e=f:e=Math.max(e,f):i===\"avg\"&&(l=Number(l)+f,d++),n=!1}i===\"avg\"&&(e=d>0?l/d:0)}a[r]=e}return a}function E(t,o){t.sort((a,r)=>{for(let i of o){let{field:e,direction:n}=i,l=a.data?a.data[e]:null,d=r.data?r.data[e]:null;if(l===d)continue;let s=l>d?1:-1;return n===\"asc\"?s:-s}return 0});for(let a of t)a.type===\"group\"&&a.children&&E(a.children,o)}function $(t,o){let a=Object.keys(o);return a.length===0?t:t.filter(r=>{for(let i of a){let e=o[i];if(!e||!e.condition1)continue;let n=r.data?r.data[i]:null,l=L(n,e.condition1);if(e.condition2&&e.condition2.type){let d=L(n,e.condition2);if(!(e.operator===\"OR\"?l||d:l&&d))return!1}else if(!l)return!1}return!0})}function L(t,o){let{type:a,value:r,valueTo:i}=o;if(a===\"blank\")return t==null||t===\"\";if(a===\"notBlank\")return t!=null&&t!==\"\";if(r==null||r===\"\")return!0;let e=String(t??\"\").toLowerCase(),n=String(r).toLowerCase();switch(a){case\"contains\":return e.includes(n);case\"notContains\":return!e.includes(n);case\"equals\":return!isNaN(Number(t))&&!isNaN(Number(r))?Number(t)===Number(r):e===n;case\"notEqual\":return!isNaN(Number(t))&&!isNaN(Number(r))?Number(t)!==Number(r):e!==n;case\"startsWith\":return e.startsWith(n);case\"endsWith\":return e.endsWith(n);case\"greaterThan\":return Number(t)>Number(r);case\"greaterThanOrEqual\":return Number(t)>=Number(r);case\"lessThan\":return Number(t)<Number(r);case\"lessThanOrEqual\":return Number(t)<=Number(r);case\"inRange\":if(i==null||i===\"\")return!0;let l=Number(t);return l>=Number(r)&&l<=Number(i);default:return!0}}function D(t,o,a){let r={};o.forEach(d=>r[d]=new Set),t.forEach(d=>{o.forEach(s=>{let u=d.data[s];u!=null&&r[s].add(u)})});let i={},e=[],n=o[0];return Array.from(r[n]).sort().forEach(d=>{Object.keys(a).forEach(s=>{let u=a[s],f=`pivot_${n}_${d}_${s}`;i[f]=u,e.push({field:f,headerName:`${d} (${s})`,pivotValue:d,originalField:s,isPivotColumn:!0}),t.forEach(c=>{String(c.data[n])===String(d)?c.data[f]=c.data[s]:c.data[f]=null})})}),{virtualAggrs:i,dynamicColumns:e}}})();\n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bways-grid",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0"
@@ -1,4 +1,4 @@
1
1
  // AUTO-GENERATED FILE. DO NOT EDIT.
2
2
  // Built from src/lib/workers/sorting.worker.ts
3
- export const SORTING_WORKER_CODE = `"use strict";(()=>{var b=[],h=[];addEventListener("message",e=>{let{action:a,rows:o,sortModel:r,filterModel:i,conditionFilters:t,groupModel:n,aggregations:u,groupStateMap:d}=e.data;if(a==="INIT"){b=(o||[]).map(l=>({...l,type:"leaf",level:0})),postMessage({action:"INIT_DONE"});return}if(a==="FLATTEN_ONLY"){let s=U(h,d||{},e.data.groupIncludeFooter);postMessage({flatList:s});return}if(a==="EXECUTE"){let s=b,{pivotMode:l,pivotColumns:c}=e.data;if(i&&Object.keys(i).length>0){let g={};for(let p of Object.keys(i))g[p]=new Set(i[p]);s=s.filter(p=>{for(let G of Object.keys(g)){let O=g[G],S=p.data?p.data[G]:null;if(!O.has(S))return!1}return!0})}t&&Object.keys(t).length>0&&(s=\$(s,t));let f={...u||{}},y=[];if(l&&c&&c.length>0&&Object.keys(f).length>0){let{virtualAggrs:g,dynamicColumns:p}=K(s,c,f);f=g,y=p}let N=s;if(n&&n.length>0?N=M(s,n,f):s.forEach(g=>g.level=0),r&&r.length>0&&E(N,r),h=N,n&&n.length>0&&e.data.groupIncludeFooter&&Object.keys(f).length>0){let p={id:"grand-total-footer",type:"group-footer",level:0,groupField:"Grand Total",groupKey:"Grand Total",data:k(s,f)};h.push(p)}let m=U(h,d||{},e.data.groupIncludeFooter),F=L(h);postMessage({flatList:m,resultTree:F,pivotColumns:y})}});function L(e){return e.map(a=>{if(a.type==="leaf")return{id:a.id,type:"leaf",level:a.level};if(a.type==="group"){let o=a;return{...o,children:o.children?L(o.children):void 0}}return a})}function U(e,a,o=!1){let r=[],i=[];for(let t=e.length-1;t>=0;t--)i.push(e[t]);for(;i.length>0;){let t=i.pop();if(t.type==="group"){let n=t;if(r.push({id:n.id,type:"group",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:n.data,childCount:n.children?n.children.length:0}),!!a[n.id]&&(o&&i.push({id:\`\${n.id}-footer\`,type:"group-footer",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:{...n.data}}),n.children))for(let d=n.children.length-1;d>=0;d--)i.push(n.children[d])}else t.type==="group-footer"?r.push({id:t.id,type:"group-footer",level:t.level,groupField:t.groupField,groupKey:t.groupKey,data:t.data}):r.push({id:t.id,type:"leaf",level:t.level})}return r}function C(e){let a=[],o=[...e];for(;o.length>0;){let r=o.pop();if(I(r))a.push(r);else if(j(r)&&r.children)for(let i=r.children.length-1;i>=0;i--)o.push(r.children[i])}return a}function I(e){return e.type==="leaf"}function j(e){return e.type==="group"}function A(e){if(typeof e=="number")return e;if(typeof e!="string")return e==null?0:Number(e);let a=e.trim();if(!a)return 0;let o=a.startsWith("(")&&a.endsWith(")"),r=a.replace(/[\\u2212\\u2013\\u2014]/g,"-");r.includes("-")&&(o=!0),r=r.replace(/[^0-9.]/g,"");let i=r?Number(r):0;return isNaN(i)?0:o?-i:i}function M(e,a,o){return T(e,a,0,o,"root")}function T(e,a,o,r,i){let t=a[o],n=o===a.length-1,u=new Map;for(let s of e){let l=s.data?s.data[t]:null;u.has(l)||u.set(l,[]),u.get(l).push(s)}let d=[];for(let[s,l]of u.entries()){let c=\`\${i}-\${t}-\${s}\`,f={id:c,type:"group",level:o,groupField:t,groupKey:s,data:{[t]:s},children:[]},y=C(l),N=k(y,r);Object.assign(f.data,N),n?(l.forEach(m=>m.level=o+1),f.children=l):f.children=T(l,a,o+1,r,c),d.push(f)}return d}function k(e,a){let o={};for(let r of Object.keys(a)){let i=a[r],t=0;if(i==="count")t=e.length;else{let n=!0,u=0,d=0;for(let s of e){let l=s.data?s.data[r]:null,c=A(l);i==="sum"?t=Number(t)+c:i==="min"?n?t=c:t=Math.min(t,c):i==="max"?n?t=c:t=Math.max(t,c):i==="avg"&&(u=Number(u)+c,d++),n=!1}i==="avg"&&(t=d>0?u/d:0)}o[r]=t}return o}function E(e,a){e.sort((o,r)=>{for(let i of a){let{field:t,direction:n}=i,u=o.data?o.data[t]:null,d=r.data?r.data[t]:null;if(u===d)continue;let s=u>d?1:-1;return n==="asc"?s:-s}return 0});for(let o of e)o.type==="group"&&o.children&&E(o.children,a)}function \$(e,a){let o=Object.keys(a);return o.length===0?e:e.filter(r=>{for(let i of o){let t=a[i];if(!t||!t.condition1)continue;let n=r.data?r.data[i]:null,u=v(n,t.condition1);if(t.condition2&&t.condition2.type){let d=v(n,t.condition2);if(!(t.operator==="OR"?u||d:u&&d))return!1}else if(!u)return!1}return!0})}function v(e,a){let{type:o,value:r,valueTo:i}=a;if(o==="blank")return e==null||e==="";if(o==="notBlank")return e!=null&&e!=="";if(r==null||r==="")return!0;let t=String(e??"").toLowerCase(),n=String(r).toLowerCase();switch(o){case"contains":return t.includes(n);case"notContains":return!t.includes(n);case"equals":return!isNaN(Number(e))&&!isNaN(Number(r))?Number(e)===Number(r):t===n;case"notEqual":return!isNaN(Number(e))&&!isNaN(Number(r))?Number(e)!==Number(r):t!==n;case"startsWith":return t.startsWith(n);case"endsWith":return t.endsWith(n);case"greaterThan":return Number(e)>Number(r);case"greaterThanOrEqual":return Number(e)>=Number(r);case"lessThan":return Number(e)<Number(r);case"lessThanOrEqual":return Number(e)<=Number(r);case"inRange":if(i==null||i==="")return!0;let u=Number(e);return u>=Number(r)&&u<=Number(i);default:return!0}}function K(e,a,o){let r={};a.forEach(d=>r[d]=new Set),e.forEach(d=>{a.forEach(s=>{let l=d.data[s];l!=null&&r[s].add(l)})});let i={},t=[],n=a[0];return Array.from(r[n]).sort().forEach(d=>{Object.keys(o).forEach(s=>{let l=o[s],c=\`pivot_\${n}_\${d}_\${s}\`;i[c]=l,t.push({field:c,headerName:\`\${d} (\${s})\`,pivotValue:d,originalField:s,isPivotColumn:!0}),e.forEach(f=>{String(f.data[n])===String(d)?f.data[c]=f.data[s]:f.data[c]=null})})}),{virtualAggrs:i,dynamicColumns:t}}})();
3
+ export const SORTING_WORKER_CODE = `"use strict";(()=>{var U=[],h=[];addEventListener("message",t=>{let{action:o,rows:a,sortModel:r,filterModel:i,conditionFilters:e,groupModel:n,aggregations:l,groupStateMap:d}=t.data;if(o==="INIT"){U=(a||[]).map(u=>({...u,type:"leaf",level:0})),postMessage({action:"INIT_DONE"});return}if(o==="FLATTEN_ONLY"){let s=v(h,d||{},t.data.groupIncludeFooter);postMessage({flatList:s});return}if(o==="EXECUTE"){let s=U,{pivotMode:u,pivotColumns:f}=t.data;if(i&&Object.keys(i).length>0){let p={};for(let g of Object.keys(i))p[g]=new Set(i[g]);s=s.filter(g=>{for(let b of Object.keys(p)){let O=p[b],S=g.data?g.data[b]:null;if(!O.has(S))return!1}return!0})}e&&Object.keys(e).length>0&&(s=\$(s,e));let c={...l||{}},y=[];if(u&&f&&f.length>0&&Object.keys(c).length>0){let{virtualAggrs:p,dynamicColumns:g}=D(s,f,c);c=p,y=g}let N=s;if(n&&n.length>0?N=M(s,n,c):u&&f&&f.length>0&&Object.keys(c).length>0?N=[{id:"pivot-root",type:"leaf",level:0,data:G(s,c)}]:s.forEach(p=>p.level=0),r&&r.length>0&&E(N,r),h=N,n&&n.length>0&&t.data.groupIncludeFooter&&Object.keys(c).length>0){let g={id:"grand-total-footer",type:"group-footer",level:0,groupField:"Grand Total",groupKey:"Grand Total",data:G(s,c)};h.push(g)}let m=v(h,d||{},t.data.groupIncludeFooter),F=T(h);postMessage({flatList:m,resultTree:F,pivotColumns:y})}});function T(t){return t.map(o=>{if(o.type==="leaf")return{id:o.id,type:"leaf",level:o.level,data:o.id==="pivot-root"?o.data:void 0};if(o.type==="group"){let a=o;return{...a,children:a.children?T(a.children):void 0}}return o})}function v(t,o,a=!1){let r=[],i=[];for(let e=t.length-1;e>=0;e--)i.push(t[e]);for(;i.length>0;){let e=i.pop();if(e.type==="group"){let n=e;if(r.push({id:n.id,type:"group",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:n.data,childCount:n.children?n.children.length:0}),!!o[n.id]&&(a&&i.push({id:\`\${n.id}-footer\`,type:"group-footer",level:n.level,groupField:n.groupField,groupKey:n.groupKey,data:{...n.data}}),n.children))for(let d=n.children.length-1;d>=0;d--)i.push(n.children[d])}else e.type==="group-footer"?r.push({id:e.id,type:"group-footer",level:e.level,groupField:e.groupField,groupKey:e.groupKey,data:e.data}):r.push({id:e.id,type:"leaf",level:e.level,data:e.id==="pivot-root"?e.data:void 0})}return r}function j(t){let o=[],a=[...t];for(;a.length>0;){let r=a.pop();if(C(r))o.push(r);else if(I(r)&&r.children)for(let i=r.children.length-1;i>=0;i--)a.push(r.children[i])}return o}function C(t){return t.type==="leaf"}function I(t){return t.type==="group"}function A(t){if(typeof t=="number")return t;if(typeof t!="string")return t==null?0:Number(t);let o=t.trim();if(!o)return 0;let a=o.startsWith("(")&&o.endsWith(")"),r=o.replace(/[\\u2212\\u2013\\u2014]/g,"-");r.includes("-")&&(a=!0),r=r.replace(/[^0-9.]/g,"");let i=r?Number(r):0;return isNaN(i)?0:a?-i:i}function M(t,o,a){return k(t,o,0,a,"root")}function k(t,o,a,r,i){let e=o[a],n=a===o.length-1,l=new Map;for(let s of t){let u=s.data?s.data[e]:null;l.has(u)||l.set(u,[]),l.get(u).push(s)}let d=[];for(let[s,u]of l.entries()){let f=\`\${i}-\${e}-\${s}\`,c={id:f,type:"group",level:a,groupField:e,groupKey:s,data:{[e]:s},children:[]},y=j(u),N=G(y,r);Object.assign(c.data,N),n?(u.forEach(m=>m.level=a+1),c.children=u):c.children=k(u,o,a+1,r,f),d.push(c)}return d}function G(t,o){let a={};for(let r of Object.keys(o)){let i=o[r],e=0;if(i==="count")e=t.length;else{let n=!0,l=0,d=0;for(let s of t){let u=s.data?s.data[r]:null,f=A(u);i==="sum"?e=Number(e)+f:i==="min"?n?e=f:e=Math.min(e,f):i==="max"?n?e=f:e=Math.max(e,f):i==="avg"&&(l=Number(l)+f,d++),n=!1}i==="avg"&&(e=d>0?l/d:0)}a[r]=e}return a}function E(t,o){t.sort((a,r)=>{for(let i of o){let{field:e,direction:n}=i,l=a.data?a.data[e]:null,d=r.data?r.data[e]:null;if(l===d)continue;let s=l>d?1:-1;return n==="asc"?s:-s}return 0});for(let a of t)a.type==="group"&&a.children&&E(a.children,o)}function \$(t,o){let a=Object.keys(o);return a.length===0?t:t.filter(r=>{for(let i of a){let e=o[i];if(!e||!e.condition1)continue;let n=r.data?r.data[i]:null,l=L(n,e.condition1);if(e.condition2&&e.condition2.type){let d=L(n,e.condition2);if(!(e.operator==="OR"?l||d:l&&d))return!1}else if(!l)return!1}return!0})}function L(t,o){let{type:a,value:r,valueTo:i}=o;if(a==="blank")return t==null||t==="";if(a==="notBlank")return t!=null&&t!=="";if(r==null||r==="")return!0;let e=String(t??"").toLowerCase(),n=String(r).toLowerCase();switch(a){case"contains":return e.includes(n);case"notContains":return!e.includes(n);case"equals":return!isNaN(Number(t))&&!isNaN(Number(r))?Number(t)===Number(r):e===n;case"notEqual":return!isNaN(Number(t))&&!isNaN(Number(r))?Number(t)!==Number(r):e!==n;case"startsWith":return e.startsWith(n);case"endsWith":return e.endsWith(n);case"greaterThan":return Number(t)>Number(r);case"greaterThanOrEqual":return Number(t)>=Number(r);case"lessThan":return Number(t)<Number(r);case"lessThanOrEqual":return Number(t)<=Number(r);case"inRange":if(i==null||i==="")return!0;let l=Number(t);return l>=Number(r)&&l<=Number(i);default:return!0}}function D(t,o,a){let r={};o.forEach(d=>r[d]=new Set),t.forEach(d=>{o.forEach(s=>{let u=d.data[s];u!=null&&r[s].add(u)})});let i={},e=[],n=o[0];return Array.from(r[n]).sort().forEach(d=>{Object.keys(a).forEach(s=>{let u=a[s],f=\`pivot_\${n}_\${d}_\${s}\`;i[f]=u,e.push({field:f,headerName:\`\${d} (\${s})\`,pivotValue:d,originalField:s,isPivotColumn:!0}),t.forEach(c=>{String(c.data[n])===String(d)?c.data[f]=c.data[s]:c.data[f]=null})})}),{virtualAggrs:i,dynamicColumns:e}}})();
4
4
  `;
@@ -66,6 +66,15 @@ addEventListener('message', (event: MessageEvent) => {
66
66
 
67
67
  if (groupModel && groupModel.length > 0) {
68
68
  resultTree = buildTree(processed, groupModel, resultAggregations);
69
+ } else if (pivotMode && pivotColumns && pivotColumns.length > 0 && Object.keys(resultAggregations).length > 0) {
70
+ // Aggregate all rows into a single row if pivoting without grouping
71
+ const grandTotalData = computeAggregations(processed, resultAggregations);
72
+ resultTree = [{
73
+ id: 'pivot-root',
74
+ type: 'leaf',
75
+ level: 0,
76
+ data: grandTotalData
77
+ } as UltraGridLeafNode];
69
78
  } else {
70
79
  processed.forEach(r => r.level = 0);
71
80
  }
@@ -110,8 +119,8 @@ function stripTreeData(nodes: UltraGridNode[]): UltraGridNode[] {
110
119
  return {
111
120
  id: node.id,
112
121
  type: 'leaf',
113
- level: node.level
114
- // Notice: no .data
122
+ level: node.level,
123
+ data: node.id === 'pivot-root' ? (node as UltraGridLeafNode).data : undefined
115
124
  } as any;
116
125
  } else if (node.type === 'group') {
117
126
  const groupNode = node as UltraGridGroupNode;
@@ -186,7 +195,8 @@ function flattenTree(nodes: UltraGridNode[], stateMap: { [key: string]: boolean
186
195
  result.push({
187
196
  id: node.id,
188
197
  type: 'leaf',
189
- level: node.level
198
+ level: node.level,
199
+ data: node.id === 'pivot-root' ? (node as UltraGridLeafNode).data : undefined
190
200
  });
191
201
  }
192
202
  }