bways-grid 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/fesm2022/bways-grid.mjs +3440 -0
- package/fesm2022/bways-grid.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/bways-grid.module.d.ts +13 -0
- package/lib/components/cell/cell.component.d.ts +20 -0
- package/lib/components/choose-columns/choose-columns.component.d.ts +17 -0
- package/lib/components/column-tool-panel/column-tool-panel.component.d.ts +36 -0
- package/lib/components/filter-tool-panel/filter-tool-panel.component.d.ts +63 -0
- package/lib/components/header/header.component.d.ts +42 -0
- package/lib/components/header-filter/header-filter.component.d.ts +31 -0
- package/lib/components/header-menu/header-menu.component.d.ts +41 -0
- package/lib/components/pagination/pagination.component.d.ts +22 -0
- package/lib/components/row/row.component.d.ts +19 -0
- package/lib/components/side-bar/side-bar.component.d.ts +42 -0
- package/lib/components/ultra-grid/ultra-grid.component.d.ts +155 -0
- package/lib/core/grid-engine.service.d.ts +14 -0
- package/lib/core/grid-flattener.service.d.ts +8 -0
- package/lib/core/row-cache.d.ts +10 -0
- package/lib/core/viewport-manager.d.ts +21 -0
- package/lib/datasources/infinite-scroll.datasource.d.ts +17 -0
- package/lib/datasources/server-datasource.interface.d.ts +14 -0
- package/lib/directives/column-resize.directive.d.ts +18 -0
- package/lib/models/column.model.d.ts +21 -0
- package/lib/models/csv-export.model.d.ts +12 -0
- package/lib/models/filter.model.d.ts +18 -0
- package/lib/models/grid-config.model.d.ts +11 -0
- package/lib/models/row.model.d.ts +26 -0
- package/lib/services/csv-export.service.d.ts +11 -0
- package/lib/workers/generated/export.worker.code.d.ts +1 -0
- package/lib/workers/generated/sorting.worker.code.d.ts +1 -0
- package/package.json +23 -0
- package/public-api.d.ts +19 -0
- package/src/lib/workers/export.worker.ts +110 -0
- package/src/lib/workers/generated/export.worker.code.ts +7 -0
- package/src/lib/workers/generated/sorting.worker.code.ts +4 -0
- package/src/lib/workers/sorting.worker.ts +423 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CsvExportOptions {
|
|
2
|
+
/** Whether to export all rows in the dataset or only the rows currently visible (filtered/sorted). Default: 'all' */
|
|
3
|
+
mode?: 'visible' | 'all';
|
|
4
|
+
/** The filename to save the downloaded file as. Default: 'export.csv' */
|
|
5
|
+
fileName?: string;
|
|
6
|
+
/** Whether to include the column headers in the first row. Default: true */
|
|
7
|
+
includeHeaders?: boolean;
|
|
8
|
+
/** The character used to separate values. Default: ',' */
|
|
9
|
+
separator?: string;
|
|
10
|
+
/** Optional list of column fields to export. If not provided, all visible columns are exported. */
|
|
11
|
+
columnKeys?: string[];
|
|
12
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Condition-based filter model for AG Grid-style advanced filtering.
|
|
3
|
+
* Each column can have up to 2 conditions joined by AND/OR.
|
|
4
|
+
*/
|
|
5
|
+
export type TextFilterType = 'contains' | 'notContains' | 'equals' | 'notEqual' | 'startsWith' | 'endsWith' | 'blank' | 'notBlank';
|
|
6
|
+
export type NumberFilterType = 'equals' | 'notEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'lessThan' | 'lessThanOrEqual' | 'inRange' | 'blank' | 'notBlank';
|
|
7
|
+
export type FilterConditionType = TextFilterType | NumberFilterType;
|
|
8
|
+
export interface FilterCondition {
|
|
9
|
+
type: FilterConditionType;
|
|
10
|
+
value: string;
|
|
11
|
+
valueTo?: string;
|
|
12
|
+
}
|
|
13
|
+
export type JoinOperator = 'AND' | 'OR';
|
|
14
|
+
export interface ColumnConditionFilter {
|
|
15
|
+
condition1: FilterCondition;
|
|
16
|
+
operator: JoinOperator;
|
|
17
|
+
condition2?: FilterCondition;
|
|
18
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface UltraGridConfig {
|
|
2
|
+
rowHeight?: number;
|
|
3
|
+
headerHeight?: number;
|
|
4
|
+
bufferSize?: number;
|
|
5
|
+
theme?: 'ag-theme-alpine' | 'ag-theme-balham' | 'custom';
|
|
6
|
+
multiSort?: boolean;
|
|
7
|
+
rowSelection?: 'single' | 'multiple';
|
|
8
|
+
sideBar?: boolean;
|
|
9
|
+
groupIncludeFooter?: boolean;
|
|
10
|
+
statusBar?: boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type UltraGridNodeType = 'group' | 'leaf' | 'group-footer';
|
|
2
|
+
export interface UltraGridNode {
|
|
3
|
+
id: string | number;
|
|
4
|
+
type: UltraGridNodeType;
|
|
5
|
+
level: number;
|
|
6
|
+
parent?: UltraGridGroupNode | null;
|
|
7
|
+
data: any;
|
|
8
|
+
selected?: boolean;
|
|
9
|
+
height?: number;
|
|
10
|
+
top?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface UltraGridLeafNode extends UltraGridNode {
|
|
13
|
+
type: 'leaf';
|
|
14
|
+
}
|
|
15
|
+
export interface UltraGridGroupNode extends UltraGridNode {
|
|
16
|
+
type: 'group';
|
|
17
|
+
groupField: string;
|
|
18
|
+
groupKey: any;
|
|
19
|
+
children: UltraGridNode[];
|
|
20
|
+
}
|
|
21
|
+
export interface UltraGridGroupFooterNode extends UltraGridNode {
|
|
22
|
+
type: 'group-footer';
|
|
23
|
+
groupField: string;
|
|
24
|
+
groupKey: any;
|
|
25
|
+
}
|
|
26
|
+
export type UltraGridRow = UltraGridLeafNode | UltraGridGroupNode | UltraGridGroupFooterNode;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CsvExportOptions } from '../models/csv-export.model';
|
|
2
|
+
import { UltraGridColumn } from '../models/column.model';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class CsvExportService {
|
|
5
|
+
private isBrowser;
|
|
6
|
+
constructor(platformId: Object);
|
|
7
|
+
exportDataAsCsv(options: CsvExportOptions, columns: UltraGridColumn[], data: any[], config?: any): Promise<void>;
|
|
8
|
+
private downloadBlob;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CsvExportService, never>;
|
|
10
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CsvExportService>;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const EXPORT_WORKER_CODE = "\"use strict\";(()=>{var E=1e4;addEventListener(\"message\",({data:a})=>{let{action:c,columns:e,data:l,options:u}=a;if(c===\"START_EXPORT\")try{let s=u.separator||\",\",g=u.includeHeaders!==!1,o=[];if(g){let t=e.map(n=>m(n.headerName||n.field,s)).join(s);o.push(t+`\n`)}let r=\"\",d=0,f=(t,n)=>{let C=t.data?t.data:t,y=e.map((p,h)=>{let i=C[p.field];return h===0&&n>0&&(i=\" \".repeat(n)+(i||\"\")),h===0&&t.type===\"group\"&&t.children&&(i=(i||\"\")+` (${t.children.length})`),m(i,s)}).join(s);if(r+=y+`\n`,d++,d>0&&d%E===0&&(o.push(r),r=\"\"),t.type===\"group\"&&t.children&&t.children.length>0)for(let p of t.children)f(p,n+1)};for(let t=0;t<l.length;t++){let n=l[t].level||0;f(l[t],n)}r&&o.push(r),postMessage({action:\"COMPLETE\",payload:{parts:o,type:\"text/csv;charset=utf-8\"}})}catch(s){postMessage({action:\"ERROR\",error:s.message||\"CSV Export Failed\"})}});function m(a,c){if(a==null)return\"\";let e=String(a);return e.includes(c)||e.includes(`\n`)||e.includes('\"')?`\"${e.replace(/\"/g,'\"\"')}\"`:e}})();\n";
|
|
@@ -0,0 +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";
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bways-grid",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^19.2.0",
|
|
6
|
+
"@angular/core": "^19.2.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"module": "fesm2022/bways-grid.mjs",
|
|
13
|
+
"typings": "index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./index.d.ts",
|
|
20
|
+
"default": "./fesm2022/bways-grid.mjs"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from './lib/bways-grid.module';
|
|
2
|
+
export * from './lib/components/ultra-grid/ultra-grid.component';
|
|
3
|
+
export * from './lib/components/header/header.component';
|
|
4
|
+
export * from './lib/components/row/row.component';
|
|
5
|
+
export * from './lib/components/cell/cell.component';
|
|
6
|
+
export * from './lib/components/pagination/pagination.component';
|
|
7
|
+
export * from './lib/components/side-bar/side-bar.component';
|
|
8
|
+
export * from './lib/components/column-tool-panel/column-tool-panel.component';
|
|
9
|
+
export * from './lib/components/filter-tool-panel/filter-tool-panel.component';
|
|
10
|
+
export * from './lib/directives/column-resize.directive';
|
|
11
|
+
export * from './lib/models/column.model';
|
|
12
|
+
export * from './lib/models/row.model';
|
|
13
|
+
export * from './lib/models/grid-config.model';
|
|
14
|
+
export * from './lib/models/filter.model';
|
|
15
|
+
export * from './lib/datasources/server-datasource.interface';
|
|
16
|
+
export * from './lib/datasources/infinite-scroll.datasource';
|
|
17
|
+
export * from './lib/core/grid-engine.service';
|
|
18
|
+
export * from './lib/core/viewport-manager';
|
|
19
|
+
export * from './lib/core/row-cache';
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/// <reference lib="webworker" />
|
|
2
|
+
import { CsvExportOptions } from '../models/csv-export.model';
|
|
3
|
+
import { UltraGridColumn } from '../models/column.model';
|
|
4
|
+
|
|
5
|
+
const CHUNK_SIZE = 10000;
|
|
6
|
+
|
|
7
|
+
addEventListener('message', ({ data: msg }) => {
|
|
8
|
+
const { action, columns, data, options } = msg;
|
|
9
|
+
|
|
10
|
+
if (action === 'START_EXPORT') {
|
|
11
|
+
try {
|
|
12
|
+
const separator = options.separator || ',';
|
|
13
|
+
const includeHeaders = options.includeHeaders !== false;
|
|
14
|
+
|
|
15
|
+
// We use an array of strings as a payload buffer.
|
|
16
|
+
// V8 String concat `a += b` can hit memory bounds and slow down exponentially.
|
|
17
|
+
// Joining an array at the end is orders of magnitude faster and memory-safe.
|
|
18
|
+
const parts: string[] = [];
|
|
19
|
+
|
|
20
|
+
// Write Headers
|
|
21
|
+
if (includeHeaders) {
|
|
22
|
+
const headerRow = columns.map((col: UltraGridColumn) => escapeCsvValue(col.headerName || col.field, separator)).join(separator);
|
|
23
|
+
parts.push(headerRow + '\n');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// We use a helper function to process rows recursively to handle hidden/collapsed tree children
|
|
27
|
+
let currentChunkStr = '';
|
|
28
|
+
let rowCount = 0;
|
|
29
|
+
|
|
30
|
+
const processRow = (row: any, currentLevel: number) => {
|
|
31
|
+
// If it's a flattened Tree Node (from Grid engine), extract the underlying 'data'
|
|
32
|
+
const rowData = row.data ? row.data : row;
|
|
33
|
+
|
|
34
|
+
const csvRow = columns.map((col: UltraGridColumn, colIndex: number) => {
|
|
35
|
+
let val = rowData[col.field];
|
|
36
|
+
|
|
37
|
+
// Add indentation for TREE data on the very first column
|
|
38
|
+
if (colIndex === 0 && currentLevel > 0) {
|
|
39
|
+
const indent = ' '.repeat(currentLevel);
|
|
40
|
+
val = indent + (val || '');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Append count to groups if it's the group field
|
|
44
|
+
if (colIndex === 0 && row.type === 'group' && row.children) {
|
|
45
|
+
val = (val || '') + ` (${row.children.length})`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return escapeCsvValue(val, separator);
|
|
49
|
+
}).join(separator);
|
|
50
|
+
|
|
51
|
+
currentChunkStr += csvRow + '\n';
|
|
52
|
+
rowCount++;
|
|
53
|
+
|
|
54
|
+
if (rowCount > 0 && rowCount % CHUNK_SIZE === 0) {
|
|
55
|
+
parts.push(currentChunkStr);
|
|
56
|
+
currentChunkStr = '';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Recursively process children if they exist to ensure collapsed rows are exported
|
|
60
|
+
if (row.type === 'group' && row.children && row.children.length > 0) {
|
|
61
|
+
for (const child of row.children) {
|
|
62
|
+
processRow(child, currentLevel + 1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
for (let i = 0; i < data.length; i++) {
|
|
68
|
+
// Determine base level, usually 0 for top level rows.
|
|
69
|
+
// data[i].level might already be set if it came from the flattener, so we prefer that if present.
|
|
70
|
+
const baseLevel = data[i].level || 0;
|
|
71
|
+
processRow(data[i], baseLevel);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Push final remaining rows
|
|
75
|
+
if (currentChunkStr) {
|
|
76
|
+
parts.push(currentChunkStr);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Return the Array of Strings (not joined) back to main thread.
|
|
80
|
+
// The Main Thread using `new Blob(parts)` accepts string arrays directly and handles the concatenation
|
|
81
|
+
// using native fast path, avoiding hitting Javascript String length allocation limits.
|
|
82
|
+
postMessage({
|
|
83
|
+
action: 'COMPLETE',
|
|
84
|
+
payload: {
|
|
85
|
+
parts,
|
|
86
|
+
type: 'text/csv;charset=utf-8'
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
} catch (e: any) {
|
|
91
|
+
postMessage({ action: 'ERROR', error: e.message || 'CSV Export Failed' });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
function escapeCsvValue(value: any, separator: string): string {
|
|
97
|
+
if (value === null || value === undefined) {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const strValue = String(value);
|
|
102
|
+
|
|
103
|
+
// If the value contains the separator, a newline, or a double quote, it must be enclosed in quotes
|
|
104
|
+
if (strValue.includes(separator) || strValue.includes('\n') || strValue.includes('"')) {
|
|
105
|
+
// Double up any existing quotes inside the string, then wrap the whole string in quotes
|
|
106
|
+
return `"${strValue.replace(/"/g, '""')}"`;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return strValue;
|
|
110
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// AUTO-GENERATED FILE. DO NOT EDIT.
|
|
2
|
+
// Built from src/lib/workers/export.worker.ts
|
|
3
|
+
export const EXPORT_WORKER_CODE = `"use strict";(()=>{var E=1e4;addEventListener("message",({data:a})=>{let{action:c,columns:e,data:l,options:u}=a;if(c==="START_EXPORT")try{let s=u.separator||",",g=u.includeHeaders!==!1,o=[];if(g){let t=e.map(n=>m(n.headerName||n.field,s)).join(s);o.push(t+\`
|
|
4
|
+
\`)}let r="",d=0,f=(t,n)=>{let C=t.data?t.data:t,y=e.map((p,h)=>{let i=C[p.field];return h===0&&n>0&&(i=" ".repeat(n)+(i||"")),h===0&&t.type==="group"&&t.children&&(i=(i||"")+\` (\${t.children.length})\`),m(i,s)}).join(s);if(r+=y+\`
|
|
5
|
+
\`,d++,d>0&&d%E===0&&(o.push(r),r=""),t.type==="group"&&t.children&&t.children.length>0)for(let p of t.children)f(p,n+1)};for(let t=0;t<l.length;t++){let n=l[t].level||0;f(l[t],n)}r&&o.push(r),postMessage({action:"COMPLETE",payload:{parts:o,type:"text/csv;charset=utf-8"}})}catch(s){postMessage({action:"ERROR",error:s.message||"CSV Export Failed"})}});function m(a,c){if(a==null)return"";let e=String(a);return e.includes(c)||e.includes(\`
|
|
6
|
+
\`)||e.includes('"')?\`"\${e.replace(/"/g,'""')}"\`:e}})();
|
|
7
|
+
`;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// AUTO-GENERATED FILE. DO NOT EDIT.
|
|
2
|
+
// Built from src/lib/workers/sorting.worker.ts
|
|
3
|
+
export 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}}})();
|
|
4
|
+
`;
|