bways-grid 0.0.5 → 0.0.7

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.
@@ -1 +1 @@
1
- export declare const SORTING_WORKER_CODE = "\"use strict\";(()=>{var G=[],N=[];addEventListener(\"message\",r=>{let{action:a,rows:n,sortModel:o,filterModel:i,conditionFilters:e,groupModel:t,aggregations:d,groupStateMap:l}=r.data;if(a===\"INIT\"){G=(n||[]).map(u=>({...u,type:\"leaf\",level:0})),postMessage({action:\"INIT_DONE\"});return}if(a===\"FLATTEN_ONLY\"){let s=m(N,l||{},r.data.groupIncludeFooter);postMessage({flatList:s});return}if(a===\"EXECUTE\"){let s=G;if(i&&Object.keys(i).length>0){let c={};for(let p of Object.keys(i))c[p]=new Set(i[p]);s=s.filter(p=>{for(let y of Object.keys(c)){let F=c[y],k=p.data?p.data[y]:null;if(!F.has(k))return!1}return!0})}e&&Object.keys(e).length>0&&(s=O(s,e));let u=s,f=d||{};if(t&&t.length>0?u=E(s,t,f):s.forEach(c=>c.level=0),o&&o.length>0&&L(u,o),N=u,t&&t.length>0&&r.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:v(s,f)};N.push(p)}let g=m(N,l||{},r.data.groupIncludeFooter),h=U(N);postMessage({flatList:g,resultTree:h})}});function U(r){return r.map(a=>{if(a.type===\"leaf\")return{id:a.id,type:\"leaf\",level:a.level};if(a.type===\"group\"){let n=a;return{...n,children:n.children?U(n.children):void 0}}return a})}function m(r,a,n=!1){let o=[],i=[];for(let e=r.length-1;e>=0;e--)i.push(r[e]);for(;i.length>0;){let e=i.pop();if(e.type===\"group\"){let t=e;if(o.push({id:t.id,type:\"group\",level:t.level,groupField:t.groupField,groupKey:t.groupKey,data:t.data,childCount:t.children?t.children.length:0}),!!a[t.id]&&(n&&i.push({id:`${t.id}-footer`,type:\"group-footer\",level:t.level,groupField:t.groupField,groupKey:t.groupKey,data:{...t.data}}),t.children))for(let l=t.children.length-1;l>=0;l--)i.push(t.children[l])}else e.type===\"group-footer\"?o.push({id:e.id,type:\"group-footer\",level:e.level,groupField:e.groupField,groupKey:e.groupKey,data:e.data}):o.push({id:e.id,type:\"leaf\",level:e.level})}return o}function E(r,a,n){return T(r,a,0,n,\"root\")}function T(r,a,n,o,i){let e=a[n],t=n===a.length-1,d=new Map;for(let s of r){let u=s.data?s.data[e]:null;d.has(u)||d.set(u,[]),d.get(u).push(s)}let l=[];for(let[s,u]of d.entries()){let f=`${i}-${e}-${s}`,g={id:f,type:\"group\",level:n,groupField:e,groupKey:s,data:{[e]:s},children:[]},h=v(u,o);Object.assign(g.data,h),t?(u.forEach(c=>c.level=n+1),g.children=u):g.children=T(u,a,n+1,o,f),l.push(g)}return l}function v(r,a){let n={};for(let o of Object.keys(a)){let i=a[o],e=0;if(i===\"count\")e=r.length;else{let t=!0,d=0,l=0;for(let s of r){let u=s.data?s.data[o]:0,f=0;typeof u==\"number\"?f=u:typeof u==\"string\"&&(f=Number(u.replace(/[^0-9.-]+/g,\"\"))),isNaN(f)&&(f=0),i===\"sum\"?e+=f:i===\"min\"?t?e=f:e=Math.min(e,f):i===\"max\"?t?e=f:e=Math.max(e,f):i===\"avg\"&&(d+=f,l++),t=!1}i===\"avg\"&&(e=l>0?d/l:0)}n[o]=e}return n}function L(r,a){r.sort((n,o)=>{for(let i of a){let{field:e,direction:t}=i,d=n.data?n.data[e]:null,l=o.data?o.data[e]:null;if(d===l)continue;let s=d>l?1:-1;return t===\"asc\"?s:-s}return 0});for(let n of r)n.type===\"group\"&&n.children&&L(n.children,a)}function O(r,a){let n=Object.keys(a);return n.length===0?r:r.filter(o=>{for(let i of n){let e=a[i];if(!e||!e.condition1)continue;let t=o.data?o.data[i]:null,d=b(t,e.condition1);if(e.condition2&&e.condition2.type){let l=b(t,e.condition2);if(!(e.operator===\"OR\"?d||l:d&&l))return!1}else if(!d)return!1}return!0})}function b(r,a){let{type:n,value:o,valueTo:i}=a;if(n===\"blank\")return r==null||r===\"\";if(n===\"notBlank\")return r!=null&&r!==\"\";if(o==null||o===\"\")return!0;let e=String(r??\"\").toLowerCase(),t=String(o).toLowerCase();switch(n){case\"contains\":return e.includes(t);case\"notContains\":return!e.includes(t);case\"equals\":return!isNaN(Number(r))&&!isNaN(Number(o))?Number(r)===Number(o):e===t;case\"notEqual\":return!isNaN(Number(r))&&!isNaN(Number(o))?Number(r)!==Number(o):e!==t;case\"startsWith\":return e.startsWith(t);case\"endsWith\":return e.endsWith(t);case\"greaterThan\":return Number(r)>Number(o);case\"greaterThanOrEqual\":return Number(r)>=Number(o);case\"lessThan\":return Number(r)<Number(o);case\"lessThanOrEqual\":return Number(r)<=Number(o);case\"inRange\":if(i==null||i===\"\")return!0;let d=Number(r);return d>=Number(o)&&d<=Number(i);default:return!0}}})();\n";
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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bways-grid",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0"
@@ -0,0 +1,103 @@
1
+ import * as XLSX from 'xlsx';
2
+
3
+ export interface ExcelExportOptions {
4
+ fileName?: string;
5
+ includeHeaders?: boolean;
6
+ customHeaders?: any[][]; // New property for rows to prepend
7
+ }
8
+
9
+ addEventListener('message', ({ data }) => {
10
+ const { action, columns, data: rowData, options } = data;
11
+
12
+ if (action === 'START_EXPORT') {
13
+ console.log('Worker START_EXPORT with options:', options);
14
+ try {
15
+ const includeHeaders = options.includeHeaders !== false;
16
+ const rows: any[][] = [];
17
+
18
+ // 0. Prepend Custom Headers
19
+ const custom = options.customHeaders;
20
+ if (custom && Array.isArray(custom)) {
21
+ for (let i = 0; i < custom.length; i++) {
22
+ rows.push(custom[i]);
23
+ }
24
+ }
25
+
26
+ // 1. Process headers
27
+ if (includeHeaders) {
28
+ const headerRow = columns.map((col: any) => col.headerName || col.field);
29
+ rows.push(headerRow);
30
+ }
31
+
32
+ // 2. Flatten Tree Data into 2D Array
33
+ const flattenNode = (node: any, level: number) => {
34
+ if (node.type === 'group') {
35
+ const row: any[] = [];
36
+ const padding = ' '.repeat(level);
37
+ const groupTitle = `${padding}${node.groupField}: ${node.groupKey}`;
38
+
39
+ columns.forEach((col: any, idx: number) => {
40
+ if (idx === 0) {
41
+ row.push(groupTitle);
42
+ } else {
43
+ let val = '';
44
+ if (node.data && node.data[col.field] !== undefined && node.data[col.field] !== null) {
45
+ val = node.data[col.field];
46
+ }
47
+ row.push(val);
48
+ }
49
+ });
50
+ rows.push(row);
51
+
52
+ if (node.children && node.children.length > 0) {
53
+ for (const child of node.children) {
54
+ flattenNode(child, level + 1);
55
+ }
56
+ }
57
+ } else if (node.type === 'group-footer') {
58
+ const row: any[] = [];
59
+ const padding = ' '.repeat(level);
60
+ columns.forEach((col: any, idx: number) => {
61
+ if (idx === 0) {
62
+ row.push(`${padding}Total (${node.groupKey})`);
63
+ } else {
64
+ row.push(node.data && node.data[col.field] != null ? node.data[col.field] : '');
65
+ }
66
+ });
67
+ rows.push(row);
68
+ } else {
69
+ const row: any[] = columns.map((col: any) => {
70
+ if (node.data == null) return '';
71
+ const val = node.data[col.field];
72
+ return val != null ? val : '';
73
+ });
74
+ rows.push(row);
75
+ }
76
+ };
77
+
78
+ for (let i = 0; i < rowData.length; i++) {
79
+ const nodeVal = rowData[i];
80
+ flattenNode(nodeVal, nodeVal.level || 0);
81
+ }
82
+
83
+ // 3. Generate XLSX
84
+ const worksheet = XLSX.utils.aoa_to_sheet(rows);
85
+ const workbook = XLSX.utils.book_new();
86
+ XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
87
+
88
+ // 4. Write to ArrayBuffer
89
+ const u8 = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
90
+
91
+ postMessage({
92
+ action: 'COMPLETE',
93
+ payload: {
94
+ buffer: u8,
95
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
96
+ }
97
+ });
98
+
99
+ } catch (error: any) {
100
+ postMessage({ action: 'ERROR', error: error.message || 'Excel Export Failed' });
101
+ }
102
+ }
103
+ });