eru-grid 0.0.21 → 0.0.23
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/fesm2022/eru-grid.mjs +6186 -674
- package/fesm2022/eru-grid.mjs.map +1 -1
- package/package.json +19 -7
- package/src/lib/assets/images/down-arrow.png +0 -0
- package/src/lib/styles/grid.scss +322 -0
- package/src/lib/styles/index.scss +51 -0
- package/src/lib/styles/theme.scss +96 -0
- package/types/eru-grid.d.ts +1512 -0
- package/index.d.ts +0 -917
|
@@ -0,0 +1,1512 @@
|
|
|
1
|
+
import * as eru_grid from 'eru-grid';
|
|
2
|
+
import * as _angular_core from '@angular/core';
|
|
3
|
+
import { OnInit, AfterViewInit, OnDestroy, QueryList, ElementRef, ChangeDetectorRef, EventEmitter, Provider } from '@angular/core';
|
|
4
|
+
import { FixedSizeVirtualScrollStrategy, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
5
|
+
import { MatDatepicker } from '@angular/material/datepicker';
|
|
6
|
+
import { MatCommonModule } from '@angular/material/core';
|
|
7
|
+
|
|
8
|
+
interface Row {
|
|
9
|
+
entity_id: string;
|
|
10
|
+
entity_data: {
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
};
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
}
|
|
15
|
+
interface RowGroup {
|
|
16
|
+
id: string;
|
|
17
|
+
key: string;
|
|
18
|
+
title: string;
|
|
19
|
+
totalRowCount: number;
|
|
20
|
+
isExpanded?: boolean;
|
|
21
|
+
isLoading?: boolean;
|
|
22
|
+
currentPage?: number;
|
|
23
|
+
hasMoreRows?: boolean;
|
|
24
|
+
currentLoadedRows: number;
|
|
25
|
+
subtotal?: {
|
|
26
|
+
[key: string]: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
interface RowGrandTotal {
|
|
30
|
+
[key: string]: number;
|
|
31
|
+
}
|
|
32
|
+
interface GroupItem$1 {
|
|
33
|
+
type: 'header' | 'row' | 'table-header' | 'row-place-holder' | 'ghost-loading';
|
|
34
|
+
group?: RowGroup;
|
|
35
|
+
row?: Row;
|
|
36
|
+
}
|
|
37
|
+
interface ColumnWidthConstraints {
|
|
38
|
+
minWidth?: number;
|
|
39
|
+
maxWidth?: number;
|
|
40
|
+
}
|
|
41
|
+
type GridMode = 'table' | 'pivot';
|
|
42
|
+
interface GridFeatures {
|
|
43
|
+
editable: boolean;
|
|
44
|
+
columnResizable: boolean;
|
|
45
|
+
columnReorderable: boolean;
|
|
46
|
+
cellSelection: boolean;
|
|
47
|
+
rowSelection: boolean;
|
|
48
|
+
exportable: boolean;
|
|
49
|
+
filtering: boolean;
|
|
50
|
+
showColumnLines?: boolean;
|
|
51
|
+
showRowLines?: boolean;
|
|
52
|
+
enableRowSubtotals?: boolean;
|
|
53
|
+
enableColumnSubtotals?: boolean;
|
|
54
|
+
enableColumnGrandTotal?: boolean;
|
|
55
|
+
enableGrandTotal?: boolean;
|
|
56
|
+
subtotalPosition?: 'before' | 'after';
|
|
57
|
+
subtotalPositionColumn?: 'before' | 'after';
|
|
58
|
+
grandTotalPosition?: 'before' | 'after';
|
|
59
|
+
grandTotalPositionColumn?: 'before' | 'after';
|
|
60
|
+
subtotalLabel?: string;
|
|
61
|
+
freezeField?: string;
|
|
62
|
+
freezeHeader?: boolean;
|
|
63
|
+
freezeGrandTotal?: boolean;
|
|
64
|
+
replaceZeroValue?: string;
|
|
65
|
+
gridHeight?: number;
|
|
66
|
+
allowSelection?: boolean;
|
|
67
|
+
actionColumn?: boolean;
|
|
68
|
+
actionColumnPosition?: 'before' | 'after';
|
|
69
|
+
designMode?: boolean;
|
|
70
|
+
}
|
|
71
|
+
interface GridStyles {
|
|
72
|
+
subTotalStyle?: 'bold' | 'italic' | 'highlighted';
|
|
73
|
+
grandTotalStyle?: 'bold' | 'italic' | 'highlighted';
|
|
74
|
+
}
|
|
75
|
+
interface GridTokens {
|
|
76
|
+
[key: string]: string;
|
|
77
|
+
}
|
|
78
|
+
interface GridConfiguration {
|
|
79
|
+
mode: GridMode;
|
|
80
|
+
config: GridFeatures;
|
|
81
|
+
fields: Field[];
|
|
82
|
+
styles?: GridStyles;
|
|
83
|
+
tokens?: GridTokens;
|
|
84
|
+
pivot?: PivotConfiguration;
|
|
85
|
+
data?: any[];
|
|
86
|
+
columnConstraints?: {
|
|
87
|
+
global?: ColumnWidthConstraints;
|
|
88
|
+
byDatatype?: Partial<Record<DataTypes, ColumnWidthConstraints>>;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
interface Field {
|
|
92
|
+
name: string;
|
|
93
|
+
label: string;
|
|
94
|
+
datatype: DataTypes;
|
|
95
|
+
field_size: number;
|
|
96
|
+
grid_index: number;
|
|
97
|
+
required?: boolean;
|
|
98
|
+
mandatory?: boolean;
|
|
99
|
+
minWidth?: number;
|
|
100
|
+
maxWidth?: number;
|
|
101
|
+
symbol?: string;
|
|
102
|
+
options?: any[];
|
|
103
|
+
option_type?: 'STATIC' | 'API' | 'ENTITY_DATA';
|
|
104
|
+
entity_name?: string;
|
|
105
|
+
api_field?: string;
|
|
106
|
+
api_name?: string;
|
|
107
|
+
field_name?: string;
|
|
108
|
+
decimal?: number;
|
|
109
|
+
num_val?: number;
|
|
110
|
+
num_val_check?: 'MAX' | 'MIN';
|
|
111
|
+
seperator?: 'thousands' | 'millions' | 'none';
|
|
112
|
+
isLeaf?: boolean;
|
|
113
|
+
parentPath?: string[];
|
|
114
|
+
children?: Field[];
|
|
115
|
+
level?: number;
|
|
116
|
+
colspan?: number;
|
|
117
|
+
rowspan?: number;
|
|
118
|
+
showSubtotals?: boolean;
|
|
119
|
+
aggregationFunction?: AggregationFunction;
|
|
120
|
+
enableDrilldown?: boolean;
|
|
121
|
+
}
|
|
122
|
+
type DataTypes = 'number' | 'textbox' | 'currency' | 'date' | 'datetime' | 'duration' | 'dropdown_single_select' | 'dropdown_multi_select' | 'location' | 'email' | 'people' | 'checkbox' | 'phone' | 'priority' | 'status' | 'progress' | 'attachment' | 'tags';
|
|
123
|
+
type AggregationFunction = 'sum' | 'count' | 'avg' | 'min' | 'max';
|
|
124
|
+
interface PivotColumnGroupState {
|
|
125
|
+
[groupKey: string]: {
|
|
126
|
+
isExpanded: boolean;
|
|
127
|
+
level: number;
|
|
128
|
+
childGroups?: string[];
|
|
129
|
+
parentGroup?: string;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
interface PivotConfiguration {
|
|
133
|
+
rows: string[];
|
|
134
|
+
cols: string[];
|
|
135
|
+
aggregations: Field[];
|
|
136
|
+
clientSideThreshold?: number;
|
|
137
|
+
}
|
|
138
|
+
interface PivotMetadata {
|
|
139
|
+
totalRows: number;
|
|
140
|
+
totalColumns: number;
|
|
141
|
+
processingTime?: number;
|
|
142
|
+
memoryUsed?: number;
|
|
143
|
+
dataSize: number;
|
|
144
|
+
}
|
|
145
|
+
interface PivotRow {
|
|
146
|
+
[key: string]: any;
|
|
147
|
+
_rowKey: string;
|
|
148
|
+
_sourceCount: number;
|
|
149
|
+
_isSubtotal?: boolean;
|
|
150
|
+
_isGrandTotal?: boolean;
|
|
151
|
+
_subtotalLevel?: number;
|
|
152
|
+
_subtotalLabel?: string;
|
|
153
|
+
}
|
|
154
|
+
interface PivotColumnHeader {
|
|
155
|
+
label: string;
|
|
156
|
+
name: string;
|
|
157
|
+
children?: PivotColumnHeader[];
|
|
158
|
+
leafColumns?: string[];
|
|
159
|
+
level: number;
|
|
160
|
+
colspan: number;
|
|
161
|
+
rowspan: number;
|
|
162
|
+
dataType: DataTypes;
|
|
163
|
+
isSubtotal?: boolean;
|
|
164
|
+
isGrandTotal?: boolean;
|
|
165
|
+
subtotalLevel?: number;
|
|
166
|
+
parentValue?: string;
|
|
167
|
+
isCollapsible?: boolean;
|
|
168
|
+
isExpanded?: boolean;
|
|
169
|
+
groupKey?: string;
|
|
170
|
+
parentGroupKey?: string;
|
|
171
|
+
collapsedValue?: any;
|
|
172
|
+
collapsedDisplayMode?: 'subtotal' | 'aggregated' | 'first-value' | 'count';
|
|
173
|
+
enableDrilldown?: boolean;
|
|
174
|
+
}
|
|
175
|
+
interface PivotHeaderStructure {
|
|
176
|
+
maxDepth: number;
|
|
177
|
+
headerRows: PivotColumnHeader[][];
|
|
178
|
+
leafColumns: Field[];
|
|
179
|
+
}
|
|
180
|
+
interface PivotResult {
|
|
181
|
+
data: PivotRow[];
|
|
182
|
+
columnDefinitions: Field[];
|
|
183
|
+
rowCount: number;
|
|
184
|
+
metadata: PivotMetadata;
|
|
185
|
+
configuration: PivotConfiguration;
|
|
186
|
+
headerStructure?: PivotHeaderStructure;
|
|
187
|
+
columnGroupState?: PivotColumnGroupState;
|
|
188
|
+
}
|
|
189
|
+
interface Drilldown {
|
|
190
|
+
frozenGrandTotalCell: boolean;
|
|
191
|
+
columnName: string;
|
|
192
|
+
rowId: string;
|
|
193
|
+
rowData?: any;
|
|
194
|
+
columnValue: any;
|
|
195
|
+
}
|
|
196
|
+
interface ActionClick {
|
|
197
|
+
rowId: string;
|
|
198
|
+
rowData?: any;
|
|
199
|
+
}
|
|
200
|
+
interface RowDataRequest {
|
|
201
|
+
groupId: string;
|
|
202
|
+
page: number;
|
|
203
|
+
pageSize: number;
|
|
204
|
+
timestamp: number;
|
|
205
|
+
groupTitle?: string;
|
|
206
|
+
groupKey?: string;
|
|
207
|
+
}
|
|
208
|
+
interface RowDataResponse {
|
|
209
|
+
groupId: string;
|
|
210
|
+
rows: Row[];
|
|
211
|
+
hasMore: boolean;
|
|
212
|
+
totalCount?: number;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
declare class PivotTransformService {
|
|
216
|
+
private columnGroupState;
|
|
217
|
+
/**
|
|
218
|
+
* Main method to transform flat data into pivot table
|
|
219
|
+
*/
|
|
220
|
+
transformData(sourceData: any[], configuration: PivotConfiguration, gridConfiguration?: GridConfiguration): PivotResult;
|
|
221
|
+
/**
|
|
222
|
+
* Group data by row dimensions and collect unique column dimension values
|
|
223
|
+
*/
|
|
224
|
+
private groupByDimensions;
|
|
225
|
+
/**
|
|
226
|
+
* Sort grouped data hierarchically so parent dimensions appear with their children grouped together
|
|
227
|
+
*/
|
|
228
|
+
private sortGroupsHierarchically;
|
|
229
|
+
/**
|
|
230
|
+
* Natural sort that handles numbers properly
|
|
231
|
+
*/
|
|
232
|
+
private naturalSort;
|
|
233
|
+
/**
|
|
234
|
+
* Convert string to title case
|
|
235
|
+
*/
|
|
236
|
+
private toTitleCase;
|
|
237
|
+
/**
|
|
238
|
+
* Generate unique pivot column values from pre-collected dimension value sets
|
|
239
|
+
*/
|
|
240
|
+
private generatePivotColumnsFromSets;
|
|
241
|
+
/**
|
|
242
|
+
* Create pivot rows with aggregated data (PERFORMANCE OPTIMIZED)
|
|
243
|
+
*/
|
|
244
|
+
private createPivotRows;
|
|
245
|
+
/**
|
|
246
|
+
* Calculate aggregation for a field (PERFORMANCE OPTIMIZED)
|
|
247
|
+
*/
|
|
248
|
+
private calculateAggregationOptimized;
|
|
249
|
+
/**
|
|
250
|
+
* Calculate aggregation for a field (ORIGINAL - kept for compatibility)
|
|
251
|
+
*/
|
|
252
|
+
private calculateAggregation;
|
|
253
|
+
/**
|
|
254
|
+
* Generate column definitions for the pivot table
|
|
255
|
+
*/
|
|
256
|
+
private generateColumnDefinitions;
|
|
257
|
+
/**
|
|
258
|
+
* Format column label for display
|
|
259
|
+
*/
|
|
260
|
+
private formatColumnLabel;
|
|
261
|
+
/**
|
|
262
|
+
* Get appropriate data type for aggregation function
|
|
263
|
+
*/
|
|
264
|
+
private getAggregationDataType;
|
|
265
|
+
/**
|
|
266
|
+
* Optimize data for large datasets by processing in chunks
|
|
267
|
+
*/
|
|
268
|
+
transformDataAsync(sourceData: any[], configuration: PivotConfiguration, chunkSize?: number): Promise<PivotResult>;
|
|
269
|
+
/**
|
|
270
|
+
* Split array into chunks
|
|
271
|
+
*/
|
|
272
|
+
private chunkArray;
|
|
273
|
+
/**
|
|
274
|
+
* Generate nested header structure with collapsible support
|
|
275
|
+
*/
|
|
276
|
+
private generateNestedHeaderStructure;
|
|
277
|
+
/**
|
|
278
|
+
* Build nested column headers recursively - generates complete cartesian product structure
|
|
279
|
+
*/
|
|
280
|
+
private buildNestedHeaders;
|
|
281
|
+
/**
|
|
282
|
+
* Calculate colspan for a header at given level - GENERIC VERSION
|
|
283
|
+
*/
|
|
284
|
+
private calculateColspan;
|
|
285
|
+
/**
|
|
286
|
+
* Generate leaf columns for the actual data with collapsible support
|
|
287
|
+
*/
|
|
288
|
+
private generateLeafColumnsWithCollapsible;
|
|
289
|
+
/**
|
|
290
|
+
* Get collapsed levels for a combination path
|
|
291
|
+
*/
|
|
292
|
+
private getCollapsedLevels;
|
|
293
|
+
/**
|
|
294
|
+
* Generate leaf columns for the actual data
|
|
295
|
+
*/
|
|
296
|
+
private generateLeafColumns;
|
|
297
|
+
/**
|
|
298
|
+
* Generate all combinations of dimension values
|
|
299
|
+
*/
|
|
300
|
+
private generateCombinations;
|
|
301
|
+
/**
|
|
302
|
+
* Generate flat header structure for single dimension
|
|
303
|
+
*/
|
|
304
|
+
private generateFlatHeaderStructure;
|
|
305
|
+
/**
|
|
306
|
+
* Add subtotals to pivot data based on configuration
|
|
307
|
+
*/
|
|
308
|
+
private addSubtotals;
|
|
309
|
+
/**
|
|
310
|
+
* Add subtotal rows for row dimensions
|
|
311
|
+
*/
|
|
312
|
+
private addRowSubtotals;
|
|
313
|
+
/**
|
|
314
|
+
* Add column subtotals as new columns
|
|
315
|
+
*/
|
|
316
|
+
private addColumnSubtotals;
|
|
317
|
+
/**
|
|
318
|
+
* Generate all possible subtotal combinations for hierarchical column dimensions
|
|
319
|
+
*/
|
|
320
|
+
private generateSubtotalCombinations;
|
|
321
|
+
/**
|
|
322
|
+
* Generate all possible dimension paths at a specific level
|
|
323
|
+
*/
|
|
324
|
+
private generateCombinationsAtLevel;
|
|
325
|
+
/**
|
|
326
|
+
* Generate columns with properly positioned subtotal columns
|
|
327
|
+
*/
|
|
328
|
+
private generateColumnsWithInterleavedSubtotals;
|
|
329
|
+
/**
|
|
330
|
+
* Group combinations by dimension levels for subtotal insertion
|
|
331
|
+
*/
|
|
332
|
+
private groupCombinationsByDimensions;
|
|
333
|
+
/**
|
|
334
|
+
* Add interleaved subtotals within column groups
|
|
335
|
+
*/
|
|
336
|
+
private addInterleavedSubtotals;
|
|
337
|
+
/**
|
|
338
|
+
* Group pivot columns by dimension prefixes for subtotal insertion
|
|
339
|
+
*/
|
|
340
|
+
private groupPivotColumnsByDimensions;
|
|
341
|
+
/**
|
|
342
|
+
* Create a subtotal column for a specific dimension prefix
|
|
343
|
+
*/
|
|
344
|
+
private createSubtotalColumn;
|
|
345
|
+
/**
|
|
346
|
+
* Add grand total row
|
|
347
|
+
*/
|
|
348
|
+
private addGrandTotalRow;
|
|
349
|
+
/**
|
|
350
|
+
* Add column grand totals as new columns
|
|
351
|
+
*/
|
|
352
|
+
private addColumnGrandTotals;
|
|
353
|
+
/**
|
|
354
|
+
* Calculate grand total values for all rows (ignores showSubtotals flag)
|
|
355
|
+
*/
|
|
356
|
+
private calculateGrandTotalRow;
|
|
357
|
+
/**
|
|
358
|
+
* Calculate subtotal values for a group of rows
|
|
359
|
+
*/
|
|
360
|
+
private calculateSubtotalRow;
|
|
361
|
+
/**
|
|
362
|
+
* Apply aggregation function to array of values
|
|
363
|
+
*/
|
|
364
|
+
private applyAggregationFunction;
|
|
365
|
+
/**
|
|
366
|
+
* Group rows by dimension values
|
|
367
|
+
*/
|
|
368
|
+
private groupRowsByDimensions;
|
|
369
|
+
/**
|
|
370
|
+
* Initialize column group state based on configuration
|
|
371
|
+
*/
|
|
372
|
+
/**
|
|
373
|
+
* Generate unique key for column group
|
|
374
|
+
*/
|
|
375
|
+
private generateColumnGroupKey;
|
|
376
|
+
/**
|
|
377
|
+
* Toggle collapse/expand state of a column group
|
|
378
|
+
*/
|
|
379
|
+
toggleColumnGroup(groupKey: string, configuration: PivotConfiguration): void;
|
|
380
|
+
/**
|
|
381
|
+
* Check if a column group is expanded
|
|
382
|
+
*/
|
|
383
|
+
isColumnGroupExpanded(groupKey: string): boolean;
|
|
384
|
+
/**
|
|
385
|
+
* Get collapsed value for a column group
|
|
386
|
+
*/
|
|
387
|
+
/**
|
|
388
|
+
* Calculate subtotal for a column group
|
|
389
|
+
*/
|
|
390
|
+
private calculateGroupSubtotal;
|
|
391
|
+
/**
|
|
392
|
+
* Calculate aggregated value for a column group
|
|
393
|
+
*/
|
|
394
|
+
private calculateGroupAggregation;
|
|
395
|
+
/**
|
|
396
|
+
* Get column keys that belong to a specific group
|
|
397
|
+
*/
|
|
398
|
+
private getGroupColumnKeys;
|
|
399
|
+
/**
|
|
400
|
+
* Get first child value for a column group
|
|
401
|
+
*/
|
|
402
|
+
private getFirstChildValue;
|
|
403
|
+
/**
|
|
404
|
+
* Get count of non-null values in a column group
|
|
405
|
+
*/
|
|
406
|
+
private getGroupValueCount;
|
|
407
|
+
/**
|
|
408
|
+
* Get current column group state
|
|
409
|
+
*/
|
|
410
|
+
getColumnGroupState(): PivotColumnGroupState;
|
|
411
|
+
/**
|
|
412
|
+
* Set column group state (for restoring state)
|
|
413
|
+
*/
|
|
414
|
+
setColumnGroupState(state: PivotColumnGroupState): void;
|
|
415
|
+
/**
|
|
416
|
+
* Calculate rowspan information for pivot rows to merge cells with same values
|
|
417
|
+
* in earlier dimensions
|
|
418
|
+
*/
|
|
419
|
+
calculateRowspanInfo(pivotRows: PivotRow[], rowDimensions: string[]): Map<string, {
|
|
420
|
+
rowspan: number;
|
|
421
|
+
skip: boolean;
|
|
422
|
+
parentSpan: number;
|
|
423
|
+
}>;
|
|
424
|
+
/**
|
|
425
|
+
* Insert column subtotal headers at the correct positions within each priority group
|
|
426
|
+
*/
|
|
427
|
+
private insertColumnSubtotalHeaders;
|
|
428
|
+
/**
|
|
429
|
+
* Add subtotal headers at their correct row levels
|
|
430
|
+
*/
|
|
431
|
+
private addSubtotalHeadersAtCorrectLevels;
|
|
432
|
+
/**
|
|
433
|
+
* Rearrange headers in each row to match the leaf column order
|
|
434
|
+
*/
|
|
435
|
+
private rearrangeHeadersToMatchLeafColumns;
|
|
436
|
+
/**
|
|
437
|
+
* Reorder headers by hierarchy to match leaf column interleaved positioning - GENERIC VERSION
|
|
438
|
+
*/
|
|
439
|
+
private reorderHeadersByHierarchy;
|
|
440
|
+
/**
|
|
441
|
+
* Extract unique values for a specific column dimension from source data
|
|
442
|
+
*/
|
|
443
|
+
private extractDimensionValues;
|
|
444
|
+
/**
|
|
445
|
+
* Extract all dimension values arrays from headers or source data
|
|
446
|
+
*/
|
|
447
|
+
private extractAllDimensionValues;
|
|
448
|
+
/**
|
|
449
|
+
* Group rating headers by their priority parent - GENERIC VERSION
|
|
450
|
+
*/
|
|
451
|
+
private groupRatingHeadersByPriority;
|
|
452
|
+
/**
|
|
453
|
+
* Group subtotals by their priority
|
|
454
|
+
*/
|
|
455
|
+
private groupSubtotalsByPriority;
|
|
456
|
+
/**
|
|
457
|
+
* Group status headers by their rating parent (combination) - GENERIC VERSION
|
|
458
|
+
*/
|
|
459
|
+
private groupStatusHeadersByRating;
|
|
460
|
+
/**
|
|
461
|
+
* Group subtotals by their rating (Priority+Rating combination)
|
|
462
|
+
*/
|
|
463
|
+
private groupSubtotalsByRating;
|
|
464
|
+
/**
|
|
465
|
+
* Add parent group keys to headers based on their position and row level - GENERIC VERSION
|
|
466
|
+
*/
|
|
467
|
+
private addParentGroupKeysToHeaders;
|
|
468
|
+
/**
|
|
469
|
+
* Group headers by their parentGroupKey
|
|
470
|
+
*/
|
|
471
|
+
private groupHeadersByParentKey;
|
|
472
|
+
/**
|
|
473
|
+
* Group subtotals by their parentGroupKey
|
|
474
|
+
*/
|
|
475
|
+
private groupSubtotalsByParentKey;
|
|
476
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PivotTransformService, never>;
|
|
477
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PivotTransformService>;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
declare class EruGridStore {
|
|
481
|
+
private readonly gridConfigService;
|
|
482
|
+
private readonly pivotTransformService;
|
|
483
|
+
private readonly columnConstraintsService;
|
|
484
|
+
private readonly _columns;
|
|
485
|
+
private readonly _groups;
|
|
486
|
+
private readonly _rows;
|
|
487
|
+
private _groupRows;
|
|
488
|
+
private readonly _selectedRowIds;
|
|
489
|
+
private readonly _rowGrandTotal;
|
|
490
|
+
private readonly _dynamicDataRequest;
|
|
491
|
+
private readonly _dynamicData;
|
|
492
|
+
private readonly _configuration;
|
|
493
|
+
private readonly _isLoading;
|
|
494
|
+
private readonly _error;
|
|
495
|
+
private readonly _activeCell;
|
|
496
|
+
private readonly _pivotConfiguration;
|
|
497
|
+
private readonly _pivotResult;
|
|
498
|
+
private readonly _drilldown;
|
|
499
|
+
private readonly _actionClick;
|
|
500
|
+
private readonly _dataRequest;
|
|
501
|
+
private readonly _requestQueue;
|
|
502
|
+
readonly columns: _angular_core.Signal<Field[]>;
|
|
503
|
+
readonly groups: _angular_core.Signal<RowGroup[]>;
|
|
504
|
+
readonly rows: _angular_core.Signal<Row[]>;
|
|
505
|
+
readonly groupRows: _angular_core.Signal<Map<string, Row[]>>;
|
|
506
|
+
readonly selectedRowIds: _angular_core.Signal<Set<string>>;
|
|
507
|
+
readonly configuration: _angular_core.Signal<GridConfiguration>;
|
|
508
|
+
readonly isLoading: _angular_core.Signal<boolean>;
|
|
509
|
+
readonly requestQueue: _angular_core.Signal<RowDataRequest[]>;
|
|
510
|
+
readonly error: _angular_core.Signal<string | null>;
|
|
511
|
+
readonly activeCell: _angular_core.Signal<any>;
|
|
512
|
+
readonly rowGrandTotal: _angular_core.Signal<RowGrandTotal | null>;
|
|
513
|
+
readonly pivotConfiguration: _angular_core.Signal<PivotConfiguration | null>;
|
|
514
|
+
readonly pivotResult: _angular_core.Signal<PivotResult | null>;
|
|
515
|
+
readonly drilldown: _angular_core.Signal<Drilldown | null>;
|
|
516
|
+
readonly actionClick: _angular_core.Signal<ActionClick | null>;
|
|
517
|
+
readonly dataRequest: _angular_core.Signal<RowDataRequest | null>;
|
|
518
|
+
readonly dynamicDataRequest: _angular_core.Signal<string[] | null>;
|
|
519
|
+
readonly dynamicData: _angular_core.Signal<Map<string, any> | null>;
|
|
520
|
+
readonly selectedRows: _angular_core.Signal<Row[]>;
|
|
521
|
+
readonly totalSelectedCount: _angular_core.Signal<number>;
|
|
522
|
+
readonly hasSelection: _angular_core.Signal<boolean>;
|
|
523
|
+
readonly expandedGroups: _angular_core.Signal<RowGroup[]>;
|
|
524
|
+
readonly visibleColumns: _angular_core.Signal<Field[]>;
|
|
525
|
+
readonly currentMode: _angular_core.Signal<GridMode>;
|
|
526
|
+
readonly isPivotMode: _angular_core.Signal<boolean>;
|
|
527
|
+
readonly isEditingEnabled: _angular_core.Signal<boolean>;
|
|
528
|
+
readonly displayColumns: _angular_core.Signal<Field[]>;
|
|
529
|
+
readonly displayData: _angular_core.Signal<PivotRow[] | Row[]>;
|
|
530
|
+
readonly pivotGrandTotalData: _angular_core.Signal<PivotRow[]>;
|
|
531
|
+
readonly pivotDisplayData: _angular_core.Signal<PivotRow[]>;
|
|
532
|
+
readonly tableDisplayData: _angular_core.Signal<Row[]>;
|
|
533
|
+
setColumns(columns: Field[]): void;
|
|
534
|
+
/**
|
|
535
|
+
* Detect which columns are used for grouping by analyzing row data
|
|
536
|
+
* A column is considered grouped if all rows within each group have the same value
|
|
537
|
+
*/
|
|
538
|
+
private detectGroupedColumns;
|
|
539
|
+
/**
|
|
540
|
+
* Get column value from a row
|
|
541
|
+
*/
|
|
542
|
+
private getRowColumnValue;
|
|
543
|
+
/**
|
|
544
|
+
* Compare two values for equality, handling null/undefined
|
|
545
|
+
*/
|
|
546
|
+
private compareValues;
|
|
547
|
+
getConfiguration(): GridConfiguration;
|
|
548
|
+
reorderColumns(fromIndex: number, toIndex: number): void;
|
|
549
|
+
updateColumnRequired(columnName: string, required: boolean): void;
|
|
550
|
+
updateColumnWidth(columnName: string, field_size: number): void;
|
|
551
|
+
setGroups(groups: RowGroup[]): void;
|
|
552
|
+
toggleGroupExpansion(groupId: string): void;
|
|
553
|
+
updateGroupLoadingState(groupId: string, isLoading: boolean): void;
|
|
554
|
+
updateGroupAfterLoading(groupId: string, loadedCount: number, fullyExhausted?: boolean): void;
|
|
555
|
+
setRows(rows: Row[]): void;
|
|
556
|
+
addRows(newRows: Row[]): void;
|
|
557
|
+
updateRow(rowId: string, updates: Partial<Row>): void;
|
|
558
|
+
selectRow(rowId: string): void;
|
|
559
|
+
deselectRow(rowId: string): void;
|
|
560
|
+
toggleRowSelection(rowId: string): void;
|
|
561
|
+
selectAllRowsInGroup(groupId: string): void;
|
|
562
|
+
deselectAllRowsInGroup(groupId: string): void;
|
|
563
|
+
clearSelection(): void;
|
|
564
|
+
setConfiguration(configuration: GridConfiguration): void;
|
|
565
|
+
/**
|
|
566
|
+
* Validates and enforces rules for grid configuration
|
|
567
|
+
*/
|
|
568
|
+
validateAndEnforceConfiguration(config: GridConfiguration): GridConfiguration;
|
|
569
|
+
/**
|
|
570
|
+
* Update specific configuration properties
|
|
571
|
+
* This method ensures proper signal updates for nested properties
|
|
572
|
+
*/
|
|
573
|
+
updateConfigurationProperties(updates: Partial<GridConfiguration['config']>): void;
|
|
574
|
+
/**
|
|
575
|
+
* Update grid lines configuration
|
|
576
|
+
* This method specifically handles grid lines updates
|
|
577
|
+
*/
|
|
578
|
+
updateGridLines(showColumnLines?: boolean, showRowLines?: boolean): void;
|
|
579
|
+
gridConfiguration(): GridConfiguration;
|
|
580
|
+
setActiveCell(activeCell: any): void;
|
|
581
|
+
setLoading(isLoading: boolean): void;
|
|
582
|
+
setError(error: string | null): void;
|
|
583
|
+
isRowSelected(rowId: string): boolean;
|
|
584
|
+
isGroupSelected(groupId: string): boolean;
|
|
585
|
+
getRowsForGroup(groupId: string): Row[];
|
|
586
|
+
setGridMode(mode: GridMode): void;
|
|
587
|
+
updateGridConfiguration(updates: Partial<GridConfiguration>): void;
|
|
588
|
+
setPivotConfiguration(pivotConfig: PivotConfiguration): void;
|
|
589
|
+
setSourceData(data: any[]): void;
|
|
590
|
+
private transformToPivot;
|
|
591
|
+
clearPivot(): void;
|
|
592
|
+
forceRefreshPivot(): void;
|
|
593
|
+
validatePivotConfiguration(config: PivotConfiguration): {
|
|
594
|
+
isValid: boolean;
|
|
595
|
+
errors: string[];
|
|
596
|
+
};
|
|
597
|
+
isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean;
|
|
598
|
+
/**
|
|
599
|
+
* Get access to the PivotTransformService for external manipulation
|
|
600
|
+
*/
|
|
601
|
+
getPivotTransformService(): PivotTransformService;
|
|
602
|
+
/**
|
|
603
|
+
* Regenerate pivot data (useful after column group state changes)
|
|
604
|
+
*/
|
|
605
|
+
regeneratePivotData(): void;
|
|
606
|
+
/**
|
|
607
|
+
* Update pivot configuration and regenerate if needed
|
|
608
|
+
*/
|
|
609
|
+
updatePivotConfiguration(updates: Partial<PivotConfiguration>): void;
|
|
610
|
+
/**
|
|
611
|
+
* Check if freeze is enabled and valid for current mode
|
|
612
|
+
*/
|
|
613
|
+
isFreezeEnabled(): boolean;
|
|
614
|
+
/**
|
|
615
|
+
* Validate freeze field for pivot mode
|
|
616
|
+
*/
|
|
617
|
+
private isValidPivotFreezeField;
|
|
618
|
+
/**
|
|
619
|
+
* Get the freeze field name
|
|
620
|
+
*/
|
|
621
|
+
getFreezeField(): string | null;
|
|
622
|
+
/**
|
|
623
|
+
* Check if freeze header is enabled
|
|
624
|
+
*/
|
|
625
|
+
isFreezeHeaderEnabled(): boolean;
|
|
626
|
+
/**
|
|
627
|
+
* Check if freeze grand total is enabled
|
|
628
|
+
*/
|
|
629
|
+
isFreezeGrandTotalEnabled(): boolean;
|
|
630
|
+
setDrilldown(drilldown: Drilldown, columnValues: string): void;
|
|
631
|
+
clearPivotDrilldown(): void;
|
|
632
|
+
setActionClick(actionClick: ActionClick): void;
|
|
633
|
+
clearActionClick(): void;
|
|
634
|
+
/**
|
|
635
|
+
* Emit a data request signal (called by grid component)
|
|
636
|
+
*/
|
|
637
|
+
setDataRequest(request: RowDataRequest): void;
|
|
638
|
+
/**
|
|
639
|
+
* Add request to queue (for handling multiple simultaneous requests)
|
|
640
|
+
*/
|
|
641
|
+
addToRequestQueue(request: RowDataRequest): void;
|
|
642
|
+
/**
|
|
643
|
+
* Remove request from queue (called by consumer after handling)
|
|
644
|
+
*/
|
|
645
|
+
removeFromRequestQueue(requestId: string): void;
|
|
646
|
+
/**
|
|
647
|
+
* Clear all requests from queue
|
|
648
|
+
*/
|
|
649
|
+
clearRequestQueue(): void;
|
|
650
|
+
/**
|
|
651
|
+
* Clear the data request signal (called by consumer after handling)
|
|
652
|
+
*/
|
|
653
|
+
clearDataRequest(): void;
|
|
654
|
+
/**
|
|
655
|
+
* Mark a group as loading (called by grid component before requesting)
|
|
656
|
+
*/
|
|
657
|
+
startGroupLoading(groupId: string): void;
|
|
658
|
+
/**
|
|
659
|
+
* Complete loading for a group (called by consumer after data received)
|
|
660
|
+
*/
|
|
661
|
+
completeGroupLoading(groupId: string): void;
|
|
662
|
+
/**
|
|
663
|
+
* Add rows for a specific group (called by consumer with API data)
|
|
664
|
+
*/
|
|
665
|
+
addRowsForGroup(groupId: string, rows: Row[], hasMore: boolean): void;
|
|
666
|
+
/**
|
|
667
|
+
* Handle error for data request (called by consumer when API fails)
|
|
668
|
+
*/
|
|
669
|
+
handleDataRequestError(groupId: string, error: any): void;
|
|
670
|
+
/**
|
|
671
|
+
* Set the row grand total for table mode
|
|
672
|
+
*/
|
|
673
|
+
setRowGrandTotal(grandTotal: RowGrandTotal | null): void;
|
|
674
|
+
/**
|
|
675
|
+
* Get the row grand total for table mode
|
|
676
|
+
*/
|
|
677
|
+
getRowGrandTotal(): RowGrandTotal | null;
|
|
678
|
+
/**
|
|
679
|
+
* Set the dynamic data request
|
|
680
|
+
*/
|
|
681
|
+
setDynamicDataRequest(request: string): void;
|
|
682
|
+
/**
|
|
683
|
+
* Get the dynamic data request
|
|
684
|
+
*/
|
|
685
|
+
getDynamicDataRequest(): string[] | null;
|
|
686
|
+
removeDynamicDataRequest(key: string): void;
|
|
687
|
+
/**
|
|
688
|
+
* Set the dynamic data
|
|
689
|
+
*/
|
|
690
|
+
setDynamicData(key: string, data: any): void;
|
|
691
|
+
/**
|
|
692
|
+
* Get the dynamic data for a specific API key
|
|
693
|
+
*/
|
|
694
|
+
getDynamicData(key: string): any | null;
|
|
695
|
+
removeDynamicData(key: string): void;
|
|
696
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EruGridStore, never>;
|
|
697
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<EruGridStore>;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
type Theme = 'light' | 'dark' | 'high-contrast' | 'auto';
|
|
701
|
+
declare class ThemeService {
|
|
702
|
+
private document;
|
|
703
|
+
private readonly storageKey;
|
|
704
|
+
private readonly _currentTheme;
|
|
705
|
+
private readonly _systemTheme;
|
|
706
|
+
readonly currentTheme: _angular_core.Signal<Theme>;
|
|
707
|
+
readonly systemTheme: _angular_core.Signal<"light" | "dark">;
|
|
708
|
+
readonly effectiveTheme: _angular_core.WritableSignal<"light" | "dark" | "high-contrast">;
|
|
709
|
+
constructor();
|
|
710
|
+
private initializeTheme;
|
|
711
|
+
private setupSystemThemeListener;
|
|
712
|
+
private applyTheme;
|
|
713
|
+
private updateCSSVariables;
|
|
714
|
+
setTheme(theme: Theme): void;
|
|
715
|
+
toggleTheme(): void;
|
|
716
|
+
getAvailableThemes(): Array<{
|
|
717
|
+
value: Theme;
|
|
718
|
+
label: string;
|
|
719
|
+
}>;
|
|
720
|
+
isLightTheme(): boolean;
|
|
721
|
+
isDarkTheme(): boolean;
|
|
722
|
+
isHighContrastTheme(): boolean;
|
|
723
|
+
isAutoTheme(): boolean;
|
|
724
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeService, never>;
|
|
725
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeService>;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
declare class ColumnConstraintsService {
|
|
729
|
+
private readonly DATATYPE_DEFAULTS;
|
|
730
|
+
/**
|
|
731
|
+
* Get effective constraints for a column, considering all override levels
|
|
732
|
+
*/
|
|
733
|
+
getColumnConstraints(column: Field | undefined, gridConfig?: GridConfiguration): ColumnWidthConstraints;
|
|
734
|
+
/**
|
|
735
|
+
* Validate and constrain a width value for a column
|
|
736
|
+
*/
|
|
737
|
+
constrainWidth(width: number, column: Field | undefined, gridConfig?: GridConfiguration): number;
|
|
738
|
+
/**
|
|
739
|
+
* Get all datatype defaults (for documentation/debugging)
|
|
740
|
+
*/
|
|
741
|
+
getDatatypeDefaults(): Record<DataTypes, ColumnWidthConstraints>;
|
|
742
|
+
/**
|
|
743
|
+
* Get default field_size for a column following fallback hierarchy
|
|
744
|
+
* Priority: column.field_size > datatype config minWidth > global config minWidth > datatype default minWidth > 150
|
|
745
|
+
*/
|
|
746
|
+
getDefaultFieldSize(column: Field | undefined, gridConfig?: GridConfiguration): number;
|
|
747
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnConstraintsService, never>;
|
|
748
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ColumnConstraintsService>;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
declare class EruGridService {
|
|
752
|
+
private eruGridStore;
|
|
753
|
+
private themeService;
|
|
754
|
+
private columnConstraintsService;
|
|
755
|
+
constructor(eruGridStore: EruGridStore, themeService: ThemeService, columnConstraintsService: ColumnConstraintsService);
|
|
756
|
+
set_table_configuration(data: GridConfiguration): void;
|
|
757
|
+
get columns(): _angular_core.Signal<Field[]>;
|
|
758
|
+
get groups(): _angular_core.Signal<RowGroup[]>;
|
|
759
|
+
get rows(): _angular_core.Signal<eru_grid.Row[]>;
|
|
760
|
+
get selectedRowIds(): _angular_core.Signal<Set<string>>;
|
|
761
|
+
get hasSelection(): _angular_core.Signal<boolean>;
|
|
762
|
+
get theme(): ThemeService;
|
|
763
|
+
getColumnConstraints(column: Field | undefined): eru_grid.ColumnWidthConstraints;
|
|
764
|
+
constrainColumnWidth(width: number, column: Field | undefined): number;
|
|
765
|
+
getDatatypeDefaults(): Record<DataTypes, eru_grid.ColumnWidthConstraints>;
|
|
766
|
+
/**
|
|
767
|
+
* Configure the grid for pivot mode with pivot configuration
|
|
768
|
+
*/
|
|
769
|
+
set_pivot_configuration(pivotConfig: PivotConfiguration, sourceData?: any[]): void;
|
|
770
|
+
/**
|
|
771
|
+
* Switch grid to table mode or pivot mode
|
|
772
|
+
*/
|
|
773
|
+
set_grid_mode(mode: GridMode): void;
|
|
774
|
+
/**
|
|
775
|
+
* Update grid configuration with new settings
|
|
776
|
+
*/
|
|
777
|
+
update_grid_configuration(updates: Partial<GridConfiguration>): void;
|
|
778
|
+
/**
|
|
779
|
+
* Enable or disable specific grid features
|
|
780
|
+
*/
|
|
781
|
+
set_grid_features(features: Partial<GridFeatures>): void;
|
|
782
|
+
/**
|
|
783
|
+
* Clear pivot configuration and return to table mode
|
|
784
|
+
*/
|
|
785
|
+
clear_pivot(): void;
|
|
786
|
+
/**
|
|
787
|
+
* Validate pivot configuration
|
|
788
|
+
*/
|
|
789
|
+
validate_pivot_configuration(config: PivotConfiguration): {
|
|
790
|
+
isValid: boolean;
|
|
791
|
+
errors: string[];
|
|
792
|
+
};
|
|
793
|
+
get currentMode(): _angular_core.Signal<GridMode>;
|
|
794
|
+
get isPivotMode(): _angular_core.Signal<boolean>;
|
|
795
|
+
get pivotConfiguration(): _angular_core.Signal<PivotConfiguration | null>;
|
|
796
|
+
get pivotResult(): _angular_core.Signal<eru_grid.PivotResult | null>;
|
|
797
|
+
get displayColumns(): _angular_core.Signal<Field[]>;
|
|
798
|
+
get displayData(): _angular_core.Signal<eru_grid.PivotRow[] | eru_grid.Row[]>;
|
|
799
|
+
get isEditingEnabled(): _angular_core.Signal<boolean>;
|
|
800
|
+
get configuration(): _angular_core.Signal<GridConfiguration>;
|
|
801
|
+
get isLoading(): _angular_core.Signal<boolean>;
|
|
802
|
+
get error(): _angular_core.Signal<string | null>;
|
|
803
|
+
/**
|
|
804
|
+
* Check if a specific feature is enabled
|
|
805
|
+
*/
|
|
806
|
+
isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean;
|
|
807
|
+
/**
|
|
808
|
+
* Get direct access to grid store (for debugging purposes)
|
|
809
|
+
*/
|
|
810
|
+
getGridStore(): EruGridStore;
|
|
811
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EruGridService, never>;
|
|
812
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<EruGridService>;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/**
|
|
816
|
+
* Custom virtual scroll strategy optimized for catching every scroll event
|
|
817
|
+
* Uses smaller buffer sizes (minBufferPx: 50, maxBufferPx: 150) to ensure
|
|
818
|
+
* more frequent scroll detection, especially important when you have 4 grids
|
|
819
|
+
* and need to catch every scroll event.
|
|
820
|
+
*
|
|
821
|
+
* The itemSize is set dynamically via the viewport's [itemSize] input binding
|
|
822
|
+
* which uses averageGroupHeight(). The strategy's itemSize parameter here is
|
|
823
|
+
* just a fallback default.
|
|
824
|
+
*/
|
|
825
|
+
declare class CustomVirtualScrollStrategy extends FixedSizeVirtualScrollStrategy {
|
|
826
|
+
constructor();
|
|
827
|
+
}
|
|
828
|
+
declare class EruGridComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
829
|
+
private changeDetectorRef;
|
|
830
|
+
gridService: EruGridService;
|
|
831
|
+
gridStore: EruGridStore;
|
|
832
|
+
private elementRef;
|
|
833
|
+
private resizeObserver;
|
|
834
|
+
isColumnReordering: _angular_core.WritableSignal<boolean>;
|
|
835
|
+
firstTr: number | null;
|
|
836
|
+
allViewports?: QueryList<CdkVirtualScrollViewport>;
|
|
837
|
+
rowContainer?: ElementRef;
|
|
838
|
+
headerScroller: ElementRef<HTMLDivElement>;
|
|
839
|
+
headerScrollers?: QueryList<ElementRef<HTMLDivElement>>;
|
|
840
|
+
gtScroller: ElementRef<HTMLDivElement>;
|
|
841
|
+
gridConfig: GridConfiguration | undefined;
|
|
842
|
+
initialMinHeight: number;
|
|
843
|
+
initialTotalWidth: number;
|
|
844
|
+
viewport: CdkVirtualScrollViewport;
|
|
845
|
+
groupsViewport: CdkVirtualScrollViewport;
|
|
846
|
+
previousOffset: _angular_core.WritableSignal<number>;
|
|
847
|
+
groups: _angular_core.Signal<RowGroup[]>;
|
|
848
|
+
ghostRows: _angular_core.WritableSignal<number>;
|
|
849
|
+
groupedRows: _angular_core.Signal<GroupItem[]>;
|
|
850
|
+
columns: _angular_core.Signal<Field[]>;
|
|
851
|
+
selectedRowIds: _angular_core.Signal<Set<string>>;
|
|
852
|
+
totalRowCount: _angular_core.Signal<number>;
|
|
853
|
+
averageGroupHeight: _angular_core.Signal<number>;
|
|
854
|
+
currentPivotScrollIndex: _angular_core.WritableSignal<number>;
|
|
855
|
+
firstDataRowIndex: _angular_core.WritableSignal<number>;
|
|
856
|
+
private ngZone;
|
|
857
|
+
groupContentHeightsMap: _angular_core.Signal<Map<string, number>>;
|
|
858
|
+
private _virtualRowspanCache;
|
|
859
|
+
mode: _angular_core.Signal<eru_grid.GridMode>;
|
|
860
|
+
isResizable: _angular_core.Signal<boolean>;
|
|
861
|
+
isEditable: _angular_core.Signal<boolean>;
|
|
862
|
+
gridHeight: _angular_core.Signal<number>;
|
|
863
|
+
showColumnLines: _angular_core.Signal<boolean>;
|
|
864
|
+
showRowLines: _angular_core.Signal<boolean>;
|
|
865
|
+
maxDepth: _angular_core.Signal<number>;
|
|
866
|
+
subTotalStyle: _angular_core.Signal<"bold" | "italic" | "highlighted">;
|
|
867
|
+
grandTotalStyle: _angular_core.Signal<"bold" | "italic" | "highlighted">;
|
|
868
|
+
freezeHeader: _angular_core.Signal<boolean>;
|
|
869
|
+
freezeGrandTotal: _angular_core.Signal<boolean>;
|
|
870
|
+
grandTotalPosition: _angular_core.Signal<"before" | "after">;
|
|
871
|
+
grandTotalPositionColumn: _angular_core.Signal<"before" | "after">;
|
|
872
|
+
enableColumnGrandTotal: _angular_core.Signal<boolean>;
|
|
873
|
+
enableColumnSubtotals: _angular_core.Signal<boolean>;
|
|
874
|
+
subtotalPositionColumn: _angular_core.Signal<"before" | "after">;
|
|
875
|
+
subtotalLabel: _angular_core.Signal<string>;
|
|
876
|
+
/**
|
|
877
|
+
* Check if a group has subtotal data
|
|
878
|
+
* @param group The group to check
|
|
879
|
+
* @returns true if the group has subtotal data
|
|
880
|
+
*/
|
|
881
|
+
hasSubtotalData(group: RowGroup): boolean;
|
|
882
|
+
/**
|
|
883
|
+
* Get subtotal value for a column in a group
|
|
884
|
+
* @param group The group containing the subtotal
|
|
885
|
+
* @param columnName The column name to get the subtotal for
|
|
886
|
+
* @returns The subtotal value or null if not available
|
|
887
|
+
*/
|
|
888
|
+
getSubtotalValue(group: RowGroup, columnName: string): number | null;
|
|
889
|
+
/**
|
|
890
|
+
* Check if grand total data is available (computed signal for reactivity)
|
|
891
|
+
*/
|
|
892
|
+
hasGrandTotalData: _angular_core.Signal<boolean>;
|
|
893
|
+
/**
|
|
894
|
+
* Get grand total value for a column
|
|
895
|
+
* @param columnName The column name to get the grand total for
|
|
896
|
+
* @returns The grand total value or null if not available
|
|
897
|
+
*/
|
|
898
|
+
getGrandTotalValue(columnName: string): number | null;
|
|
899
|
+
/**
|
|
900
|
+
* Check if a row is the first visible row in the pivot viewport
|
|
901
|
+
* @param rowIndex The index of the row in the virtual scroll
|
|
902
|
+
* @returns true if this is the first visible row
|
|
903
|
+
*/
|
|
904
|
+
isFirstVisiblePivotRow(rowIndex: number): boolean;
|
|
905
|
+
/**
|
|
906
|
+
* Handle scroll events for pivot mode
|
|
907
|
+
* @param scrollIndex The current scroll index
|
|
908
|
+
*/
|
|
909
|
+
onPivotScroll(scrollIndex: number): void;
|
|
910
|
+
getTotalTableWidth(): number;
|
|
911
|
+
getMinHeightPx(): number;
|
|
912
|
+
adjustScrollWidth(): boolean;
|
|
913
|
+
/**
|
|
914
|
+
* Get the rendered range (what's in the DOM including buffer)
|
|
915
|
+
* @returns Object with start, end, and count of rendered items
|
|
916
|
+
*/
|
|
917
|
+
private readonly ROWS_PER_PAGE;
|
|
918
|
+
private readonly SCROLL_THRESHOLD;
|
|
919
|
+
private lastLoadedGroupIds;
|
|
920
|
+
private requestedGroupIds;
|
|
921
|
+
private columnsInitialized;
|
|
922
|
+
/**
|
|
923
|
+
* Get content height for a specific group from the computed signal
|
|
924
|
+
* This is efficient as it uses the cached computed signal instead of recalculating
|
|
925
|
+
*/
|
|
926
|
+
getGroupContentHeight(groupId: string): number;
|
|
927
|
+
/**
|
|
928
|
+
* Calculate total height of a group including header and content
|
|
929
|
+
* This is used for the outer groups virtual scroll viewport
|
|
930
|
+
*/
|
|
931
|
+
protected getTotalGroupHeight(group: RowGroup): number;
|
|
932
|
+
/**
|
|
933
|
+
* Calculate average group height for the outer virtual scroll viewport itemSize
|
|
934
|
+
* Uses getMinHeightPx() to ensure proper height calculation
|
|
935
|
+
*/
|
|
936
|
+
constructor(changeDetectorRef: ChangeDetectorRef);
|
|
937
|
+
applyTokens(): void;
|
|
938
|
+
ngOnInit(): void;
|
|
939
|
+
ngAfterViewInit(): void;
|
|
940
|
+
ngOnDestroy(): void;
|
|
941
|
+
set_table_group(data: RowGroup[]): void;
|
|
942
|
+
getInitialMinHeightPx(): number;
|
|
943
|
+
getInitialTotalWidth(): number;
|
|
944
|
+
applyCdkWidth(): boolean;
|
|
945
|
+
private createGroupedRows;
|
|
946
|
+
initializeGroups(): void;
|
|
947
|
+
private fetchInitialRows;
|
|
948
|
+
/**
|
|
949
|
+
* Fetch data for currently visible groups that haven't been requested yet
|
|
950
|
+
* This is called on initial load and when groups become visible during scrolling
|
|
951
|
+
*/
|
|
952
|
+
private fetchDataForVisibleGroups;
|
|
953
|
+
private updateViewportSize;
|
|
954
|
+
addRowsForGroup(groupId: string, rows: Row[], hasMore: boolean): void;
|
|
955
|
+
onScroll(scrollIndex: number, group: RowGroup): void;
|
|
956
|
+
/**
|
|
957
|
+
* Get viewport by group ID using the data-group-id attribute
|
|
958
|
+
*/
|
|
959
|
+
private getViewportByGroupId;
|
|
960
|
+
protected getVisibleGroups(): RowGroup[];
|
|
961
|
+
private getGroupItemAtIndex;
|
|
962
|
+
private checkAndLoadMoreRows;
|
|
963
|
+
private intelligentGroupLoading;
|
|
964
|
+
/**
|
|
965
|
+
* Request rows for a specific group via signal
|
|
966
|
+
*/
|
|
967
|
+
private requestRowsForGroup;
|
|
968
|
+
shouldShowRequiredToggleRow(): boolean;
|
|
969
|
+
onColumnRequiredChange(columnName: string, required: boolean): void;
|
|
970
|
+
trackByColumnFn(index: number, column: Field): string;
|
|
971
|
+
trackByGroupItemFn(index: number, groupItem: GroupItem): string;
|
|
972
|
+
trackByPivotRowFn(index: number, pivotRow: PivotRow): string;
|
|
973
|
+
trackByRowFn(index: number, row: any): string;
|
|
974
|
+
trackByGroupFn(index: number, group: RowGroup): string;
|
|
975
|
+
getRowsForGroup(groupId: string): Row[];
|
|
976
|
+
getRowsForGroupSignal(groupId: string): _angular_core.Signal<Row[]>;
|
|
977
|
+
trackByHeaderFn(index: number, header: any): string;
|
|
978
|
+
hasNestedHeaders(): boolean;
|
|
979
|
+
getHeaderRows(): any[][];
|
|
980
|
+
getLeafColumns(): Field[];
|
|
981
|
+
isRowDimensionHeader(header: any): boolean;
|
|
982
|
+
/**
|
|
983
|
+
* Get the Field corresponding to a PivotColumnHeader
|
|
984
|
+
* For nested headers, finds the first matching leaf column
|
|
985
|
+
*/
|
|
986
|
+
getFieldForPivotHeader(header: any): Field | undefined;
|
|
987
|
+
getPivotGridColumns(): string;
|
|
988
|
+
private initializeColumnWidths;
|
|
989
|
+
toggleRowSelection(event: Event, row: any): void;
|
|
990
|
+
toggleGroupSelection(event: Event, groupId: string): void;
|
|
991
|
+
onActionClick(event: Event, row: any): void;
|
|
992
|
+
/**
|
|
993
|
+
* Check if action column is enabled
|
|
994
|
+
* @returns true if actionColumn is enabled, false otherwise (default: false)
|
|
995
|
+
*/
|
|
996
|
+
isActionColumnEnabled: _angular_core.Signal<boolean>;
|
|
997
|
+
/**
|
|
998
|
+
* Get action column position
|
|
999
|
+
* @returns 'before' | 'after' (default: 'after')
|
|
1000
|
+
*/
|
|
1001
|
+
getActionColumnPosition: _angular_core.Signal<"before" | "after">;
|
|
1002
|
+
/**
|
|
1003
|
+
* Check if action column should be shown at a specific position
|
|
1004
|
+
* @param position The position to check ('before' | 'after')
|
|
1005
|
+
* @returns true if action column is enabled and matches the position
|
|
1006
|
+
*/
|
|
1007
|
+
shouldShowActionColumn(position: 'before' | 'after'): boolean;
|
|
1008
|
+
toggleAllGroups(event: Event): void;
|
|
1009
|
+
isRowSelected(rowId?: string): boolean;
|
|
1010
|
+
isGroupSelected(groupId: string): boolean;
|
|
1011
|
+
isAllGroupsSelected(): boolean;
|
|
1012
|
+
getSelectedRows(): any[];
|
|
1013
|
+
toggleGroupExpansion(groupId: string): void;
|
|
1014
|
+
/**
|
|
1015
|
+
* Toggle collapse/expand state of a column group
|
|
1016
|
+
*/
|
|
1017
|
+
toggleColumnGroup(groupKey: string): void;
|
|
1018
|
+
/**
|
|
1019
|
+
* Check if a column group is expanded
|
|
1020
|
+
*/
|
|
1021
|
+
isColumnGroupExpanded(groupKey: string): boolean;
|
|
1022
|
+
/**
|
|
1023
|
+
* Get rowspan information for pivot table cells
|
|
1024
|
+
*/
|
|
1025
|
+
private _rowspanInfo;
|
|
1026
|
+
/**
|
|
1027
|
+
* Debug counter for sticky column debugging
|
|
1028
|
+
*/
|
|
1029
|
+
private _stickyDebugCount;
|
|
1030
|
+
getRowspanInfo(): Map<string, {
|
|
1031
|
+
rowspan: number;
|
|
1032
|
+
skip: boolean;
|
|
1033
|
+
parentSpan: number;
|
|
1034
|
+
}>;
|
|
1035
|
+
/**
|
|
1036
|
+
* Get the effective rowspan for a cell in virtual scrolling context
|
|
1037
|
+
* This method ensures proper rowspan continuity when scrolling
|
|
1038
|
+
*/
|
|
1039
|
+
getEffectiveRowspan(visibleRowIndex: number, columnName: string): number | null;
|
|
1040
|
+
/**
|
|
1041
|
+
* Check if a cell should be skipped (hidden due to rowspan) - ENHANCED FOR VIRTUAL SCROLLING
|
|
1042
|
+
*/
|
|
1043
|
+
shouldSkipCell(rowIndex: number, columnName: string): boolean;
|
|
1044
|
+
/**
|
|
1045
|
+
* Get the effective cell value, considering virtual parents for virtual scrolling
|
|
1046
|
+
*/
|
|
1047
|
+
getEffectiveCellValue(index: number, columnName: string, pivotRow: any): any;
|
|
1048
|
+
/**
|
|
1049
|
+
* Get rowspan value for a specific cell - VIRTUAL SCROLLING COMPATIBLE
|
|
1050
|
+
* This is a compatibility wrapper around getEffectiveRowspan
|
|
1051
|
+
*/
|
|
1052
|
+
/**
|
|
1053
|
+
* Get columns that should be frozen on the left (all row dimensions up to and including freezeField)
|
|
1054
|
+
*/
|
|
1055
|
+
/**
|
|
1056
|
+
* Get columns that should be scrollable on the right (all except frozen fields)
|
|
1057
|
+
*/
|
|
1058
|
+
/**
|
|
1059
|
+
* Get headers that should be frozen (all row dimension headers up to and including freezeField)
|
|
1060
|
+
*/
|
|
1061
|
+
/**
|
|
1062
|
+
* Get headers that should be scrollable (all except frozen fields)
|
|
1063
|
+
*/
|
|
1064
|
+
/**
|
|
1065
|
+
* Check if a column should be sticky (frozen on the left)
|
|
1066
|
+
*/
|
|
1067
|
+
isStickyColumn(columnName: string, colIndex: number): boolean;
|
|
1068
|
+
/**
|
|
1069
|
+
* Get the left position for sticky columns (CSS left value)
|
|
1070
|
+
*/
|
|
1071
|
+
getStickyColumnLeft(columnName: string, colIndex: number): number;
|
|
1072
|
+
/**
|
|
1073
|
+
* Check if a column is a row dimension column
|
|
1074
|
+
*/
|
|
1075
|
+
isRowDimensionColumn(columnName: string): boolean;
|
|
1076
|
+
/**
|
|
1077
|
+
* Handle body scroll to synchronize header and grand total horizontal scroll
|
|
1078
|
+
*/
|
|
1079
|
+
/**
|
|
1080
|
+
* Handle scroll events on the groups viewport
|
|
1081
|
+
* This detects when new groups become visible and fetches their data
|
|
1082
|
+
* Can be called with either Event (from scroll event) or number (from scrolledIndexChange)
|
|
1083
|
+
*/
|
|
1084
|
+
onGroupsViewportScroll(event: Event | number): void;
|
|
1085
|
+
private groupsScrollTimeout;
|
|
1086
|
+
onTableBodyScroll(event: Event): void;
|
|
1087
|
+
onBodyScroll(event: Event): void;
|
|
1088
|
+
/**
|
|
1089
|
+
* Handle header scroll to synchronize body horizontal scroll
|
|
1090
|
+
*/
|
|
1091
|
+
onHeaderScroll(event: Event): void;
|
|
1092
|
+
toggleGroupCollapse(groupId: string): void;
|
|
1093
|
+
/**
|
|
1094
|
+
* Manually trigger scrollbar compensation recalculation (for testing)
|
|
1095
|
+
*/
|
|
1096
|
+
recalculateScrollbarCompensation(): void;
|
|
1097
|
+
/**
|
|
1098
|
+
* Adjust header padding to compensate for body table scrollbar width
|
|
1099
|
+
* This ensures perfect column alignment between header and body tables
|
|
1100
|
+
*/
|
|
1101
|
+
private adjustHeaderScrollbarCompensation;
|
|
1102
|
+
groupSeperatorColSpan(): number;
|
|
1103
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EruGridComponent, never>;
|
|
1104
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EruGridComponent, "eru-grid", never, { "gridConfig": { "alias": "gridConfig"; "required": false; }; }, {}, never, never, true, never>;
|
|
1105
|
+
}
|
|
1106
|
+
interface GroupItem {
|
|
1107
|
+
type: 'header' | 'row' | 'table-header' | 'row-place-holder' | 'ghost-loading';
|
|
1108
|
+
group?: RowGroup;
|
|
1109
|
+
row?: Row;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
declare class ThemeToggleComponent {
|
|
1113
|
+
private themeService;
|
|
1114
|
+
availableThemes: {
|
|
1115
|
+
value: Theme;
|
|
1116
|
+
label: string;
|
|
1117
|
+
}[];
|
|
1118
|
+
getCurrentThemeLabel(): string;
|
|
1119
|
+
getCurrentThemeIcon(): string;
|
|
1120
|
+
getThemeIcon(theme: Theme): string;
|
|
1121
|
+
isActiveTheme(theme: Theme): boolean;
|
|
1122
|
+
setTheme(theme: Theme): void;
|
|
1123
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeToggleComponent, never>;
|
|
1124
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThemeToggleComponent, "eru-theme-toggle", never, {}, {}, never, never, true, never>;
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
declare class HelloWorldComponent {
|
|
1128
|
+
constructor();
|
|
1129
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<HelloWorldComponent, never>;
|
|
1130
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<HelloWorldComponent, "eru-hello-world", never, {}, {}, never, never, true, never>;
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
interface CurrencyValidationResult {
|
|
1134
|
+
isValid: boolean;
|
|
1135
|
+
error?: string;
|
|
1136
|
+
}
|
|
1137
|
+
declare class CurrencyComponent {
|
|
1138
|
+
private el;
|
|
1139
|
+
value: _angular_core.InputSignal<string | number | null>;
|
|
1140
|
+
config: _angular_core.InputSignal<Field | null>;
|
|
1141
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1142
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1143
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1144
|
+
replaceZeroValue: _angular_core.InputSignal<string | undefined>;
|
|
1145
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
1146
|
+
valueChange: EventEmitter<string | number | null>;
|
|
1147
|
+
blur: EventEmitter<string | number | null>;
|
|
1148
|
+
focus: EventEmitter<void>;
|
|
1149
|
+
drilldownClick: EventEmitter<string | number | null>;
|
|
1150
|
+
validationError: EventEmitter<string>;
|
|
1151
|
+
editModeChange: EventEmitter<boolean>;
|
|
1152
|
+
currentValue: _angular_core.WritableSignal<string | number | null>;
|
|
1153
|
+
error: _angular_core.WritableSignal<string>;
|
|
1154
|
+
constructor();
|
|
1155
|
+
formatNumberSignal: _angular_core.Signal<string | undefined>;
|
|
1156
|
+
onActivate(): void;
|
|
1157
|
+
onBlur(): void;
|
|
1158
|
+
onValueChange(event: any): void;
|
|
1159
|
+
onDrillableClick(event: Event): void;
|
|
1160
|
+
private validateField;
|
|
1161
|
+
private focusAndPositionCursor;
|
|
1162
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CurrencyComponent, never>;
|
|
1163
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CurrencyComponent, "eru-currency", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "replaceZeroValue": { "alias": "replaceZeroValue"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "validationError": "validationError"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
interface NumberValidationResult {
|
|
1167
|
+
isValid: boolean;
|
|
1168
|
+
error?: string;
|
|
1169
|
+
}
|
|
1170
|
+
declare class NumberComponent {
|
|
1171
|
+
private el;
|
|
1172
|
+
value: _angular_core.InputSignal<string | number | null>;
|
|
1173
|
+
config: _angular_core.InputSignal<Field | null>;
|
|
1174
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1175
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1176
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1177
|
+
replaceZeroValue: _angular_core.InputSignal<string | undefined>;
|
|
1178
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
1179
|
+
valueChange: EventEmitter<string | number | null>;
|
|
1180
|
+
blur: EventEmitter<string | number | null>;
|
|
1181
|
+
focus: EventEmitter<void>;
|
|
1182
|
+
drilldownClick: EventEmitter<string | number | null>;
|
|
1183
|
+
validationError: EventEmitter<string>;
|
|
1184
|
+
editModeChange: EventEmitter<boolean>;
|
|
1185
|
+
currentValue: _angular_core.WritableSignal<string | number | null>;
|
|
1186
|
+
error: _angular_core.WritableSignal<string>;
|
|
1187
|
+
constructor();
|
|
1188
|
+
formatNumberSignal: _angular_core.Signal<string | undefined>;
|
|
1189
|
+
onActivate(): void;
|
|
1190
|
+
onBlur(): void;
|
|
1191
|
+
onValueChange(event: any): void;
|
|
1192
|
+
onDrillableClick(event: Event): void;
|
|
1193
|
+
private validateField;
|
|
1194
|
+
private focusAndPositionCursor;
|
|
1195
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NumberComponent, never>;
|
|
1196
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NumberComponent, "eru-number", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "replaceZeroValue": { "alias": "replaceZeroValue"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "validationError": "validationError"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
interface TextboxValidationResult {
|
|
1200
|
+
isValid: boolean;
|
|
1201
|
+
error?: string;
|
|
1202
|
+
}
|
|
1203
|
+
declare class TextboxComponent implements OnInit {
|
|
1204
|
+
private el;
|
|
1205
|
+
value: _angular_core.InputSignal<string | null>;
|
|
1206
|
+
config: _angular_core.InputSignal<Field | null>;
|
|
1207
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1208
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1209
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1210
|
+
columnWidth: _angular_core.InputSignal<number>;
|
|
1211
|
+
fieldSize: _angular_core.InputSignal<number>;
|
|
1212
|
+
eruGridStore: _angular_core.InputSignal<EruGridStore | null>;
|
|
1213
|
+
externalError: _angular_core.InputSignal<string>;
|
|
1214
|
+
valueChange: EventEmitter<string | null>;
|
|
1215
|
+
blur: EventEmitter<string | null>;
|
|
1216
|
+
focus: EventEmitter<void>;
|
|
1217
|
+
drilldownClick: EventEmitter<string | null>;
|
|
1218
|
+
validationError: EventEmitter<string>;
|
|
1219
|
+
editModeChange: EventEmitter<boolean>;
|
|
1220
|
+
currentValue: _angular_core.WritableSignal<string | null>;
|
|
1221
|
+
internalError: _angular_core.WritableSignal<string>;
|
|
1222
|
+
error: _angular_core.Signal<string>;
|
|
1223
|
+
constructor();
|
|
1224
|
+
ngOnInit(): void;
|
|
1225
|
+
getProperty(property: string): any;
|
|
1226
|
+
hasRequiredValidation(): boolean;
|
|
1227
|
+
onActivate(): void;
|
|
1228
|
+
onBlur(event: FocusEvent): void;
|
|
1229
|
+
onValueChange(event: any): void;
|
|
1230
|
+
onDrillableClick(event: Event): void;
|
|
1231
|
+
private validateField;
|
|
1232
|
+
private focusAndPositionCursor;
|
|
1233
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextboxComponent, never>;
|
|
1234
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextboxComponent, "eru-textbox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "fieldSize": { "alias": "fieldSize"; "required": false; "isSignal": true; }; "eruGridStore": { "alias": "eruGridStore"; "required": false; "isSignal": true; }; "externalError": { "alias": "externalError"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "validationError": "validationError"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
interface EmailValidationResult {
|
|
1238
|
+
isValid: boolean;
|
|
1239
|
+
error?: string;
|
|
1240
|
+
}
|
|
1241
|
+
declare class EmailComponent implements OnInit {
|
|
1242
|
+
private el;
|
|
1243
|
+
value: _angular_core.InputSignal<string | null>;
|
|
1244
|
+
config: _angular_core.InputSignal<Field | null>;
|
|
1245
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1246
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1247
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1248
|
+
columnWidth: _angular_core.InputSignal<number>;
|
|
1249
|
+
fieldSize: _angular_core.InputSignal<number>;
|
|
1250
|
+
eruGridStore: _angular_core.InputSignal<EruGridStore | null>;
|
|
1251
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
1252
|
+
externalError: _angular_core.InputSignal<string>;
|
|
1253
|
+
valueChange: EventEmitter<string | null>;
|
|
1254
|
+
blur: EventEmitter<string | null>;
|
|
1255
|
+
focus: EventEmitter<void>;
|
|
1256
|
+
drilldownClick: EventEmitter<string | null>;
|
|
1257
|
+
validationError: EventEmitter<string>;
|
|
1258
|
+
editModeChange: EventEmitter<boolean>;
|
|
1259
|
+
currentValue: _angular_core.WritableSignal<string | null>;
|
|
1260
|
+
internalError: _angular_core.WritableSignal<string>;
|
|
1261
|
+
error: _angular_core.Signal<string>;
|
|
1262
|
+
constructor();
|
|
1263
|
+
ngOnInit(): void;
|
|
1264
|
+
getProperty(property: string): any;
|
|
1265
|
+
hasRequiredValidation(): boolean;
|
|
1266
|
+
onActivate(): void;
|
|
1267
|
+
onBlur(event: FocusEvent): void;
|
|
1268
|
+
onValueChange(event: any): void;
|
|
1269
|
+
onDrillableClick(event: Event): void;
|
|
1270
|
+
private validateField;
|
|
1271
|
+
private focusAndPositionCursor;
|
|
1272
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmailComponent, never>;
|
|
1273
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EmailComponent, "eru-email", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "fieldSize": { "alias": "fieldSize"; "required": false; "isSignal": true; }; "eruGridStore": { "alias": "eruGridStore"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "externalError": { "alias": "externalError"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "validationError": "validationError"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
declare global {
|
|
1277
|
+
interface Window {
|
|
1278
|
+
google: typeof google;
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
declare var google: {
|
|
1282
|
+
maps: {
|
|
1283
|
+
places: {
|
|
1284
|
+
Autocomplete: new (input: HTMLInputElement, options?: any) => {
|
|
1285
|
+
getPlace: () => any;
|
|
1286
|
+
addListener: (event: string, callback: () => void) => void;
|
|
1287
|
+
};
|
|
1288
|
+
AutocompleteOptions: any;
|
|
1289
|
+
};
|
|
1290
|
+
};
|
|
1291
|
+
};
|
|
1292
|
+
interface LocationConfig {
|
|
1293
|
+
required?: boolean;
|
|
1294
|
+
maxLength?: number;
|
|
1295
|
+
googleApiKey?: string;
|
|
1296
|
+
enableAutocomplete?: boolean;
|
|
1297
|
+
}
|
|
1298
|
+
interface LocationValidationResult {
|
|
1299
|
+
isValid: boolean;
|
|
1300
|
+
error?: string;
|
|
1301
|
+
}
|
|
1302
|
+
declare class LocationComponent implements OnInit, AfterViewInit {
|
|
1303
|
+
private el;
|
|
1304
|
+
locationInput?: ElementRef<HTMLInputElement>;
|
|
1305
|
+
value: _angular_core.InputSignal<string | null>;
|
|
1306
|
+
config: _angular_core.InputSignal<Field | null>;
|
|
1307
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1308
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1309
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1310
|
+
columnWidth: _angular_core.InputSignal<number>;
|
|
1311
|
+
fieldSize: _angular_core.InputSignal<number>;
|
|
1312
|
+
eruGridStore: _angular_core.InputSignal<EruGridStore | null>;
|
|
1313
|
+
externalError: _angular_core.InputSignal<string>;
|
|
1314
|
+
valueChange: EventEmitter<string | null>;
|
|
1315
|
+
blur: EventEmitter<string | null>;
|
|
1316
|
+
focus: EventEmitter<void>;
|
|
1317
|
+
drilldownClick: EventEmitter<string | null>;
|
|
1318
|
+
validationError: EventEmitter<string>;
|
|
1319
|
+
editModeChange: EventEmitter<boolean>;
|
|
1320
|
+
currentValue: _angular_core.WritableSignal<string | null>;
|
|
1321
|
+
internalError: _angular_core.WritableSignal<string>;
|
|
1322
|
+
autocomplete: any;
|
|
1323
|
+
error: _angular_core.Signal<string>;
|
|
1324
|
+
constructor();
|
|
1325
|
+
ngOnInit(): void;
|
|
1326
|
+
ngAfterViewInit(): void;
|
|
1327
|
+
getProperty(property: string): any;
|
|
1328
|
+
hasRequiredValidation(): boolean;
|
|
1329
|
+
shouldEnableAutocomplete(): boolean;
|
|
1330
|
+
private initializeAutocomplete;
|
|
1331
|
+
private loadGoogleMapsScript;
|
|
1332
|
+
private setupAutocomplete;
|
|
1333
|
+
onActivate(): void;
|
|
1334
|
+
onBlur(event: FocusEvent): void;
|
|
1335
|
+
onValueChange(event: any): void;
|
|
1336
|
+
onDrillableClick(event: Event): void;
|
|
1337
|
+
private validateField;
|
|
1338
|
+
private focusAndPositionCursor;
|
|
1339
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LocationComponent, never>;
|
|
1340
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LocationComponent, "eru-location", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "fieldSize": { "alias": "fieldSize"; "required": false; "isSignal": true; }; "eruGridStore": { "alias": "eruGridStore"; "required": false; "isSignal": true; }; "externalError": { "alias": "externalError"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "validationError": "validationError"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
declare class CheckboxComponent {
|
|
1344
|
+
value: _angular_core.InputSignal<boolean>;
|
|
1345
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1346
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1347
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1348
|
+
label: _angular_core.InputSignal<string>;
|
|
1349
|
+
valueChange: EventEmitter<boolean>;
|
|
1350
|
+
change: EventEmitter<boolean>;
|
|
1351
|
+
blur: EventEmitter<boolean>;
|
|
1352
|
+
focus: EventEmitter<void>;
|
|
1353
|
+
drilldownClick: EventEmitter<boolean>;
|
|
1354
|
+
editModeChange: EventEmitter<boolean>;
|
|
1355
|
+
currentValue: _angular_core.WritableSignal<boolean>;
|
|
1356
|
+
constructor();
|
|
1357
|
+
onValueChange(event: boolean): void;
|
|
1358
|
+
onActivate(): void;
|
|
1359
|
+
onBlur(): void;
|
|
1360
|
+
onDrillableClick(event: Event): void;
|
|
1361
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
|
|
1362
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "eru-checkbox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "change": "change"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
declare class DateComponent {
|
|
1366
|
+
private el;
|
|
1367
|
+
datepicker: MatDatepicker<Date>;
|
|
1368
|
+
value: _angular_core.InputSignal<string | Date | null>;
|
|
1369
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1370
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1371
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1372
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
1373
|
+
valueChange: EventEmitter<string | null>;
|
|
1374
|
+
dateChange: EventEmitter<string | null>;
|
|
1375
|
+
drilldownClick: EventEmitter<string | null>;
|
|
1376
|
+
editModeChange: EventEmitter<boolean>;
|
|
1377
|
+
currentValue: _angular_core.WritableSignal<Date | null>;
|
|
1378
|
+
private shouldOpenPicker;
|
|
1379
|
+
constructor();
|
|
1380
|
+
onActivate(): void;
|
|
1381
|
+
onDateChange(date: Date | null): void;
|
|
1382
|
+
onDrillableClick(event: Event): void;
|
|
1383
|
+
formatDate(date: Date | null): string;
|
|
1384
|
+
parseDateString(dateString: string): Date | null;
|
|
1385
|
+
getDisplayValue(): string;
|
|
1386
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateComponent, never>;
|
|
1387
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateComponent, "eru-date", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "dateChange": "dateChange"; "drilldownClick": "drilldownClick"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
interface CountryCode {
|
|
1391
|
+
name: string;
|
|
1392
|
+
code: string;
|
|
1393
|
+
dial_code: string;
|
|
1394
|
+
flag: string;
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
declare class PhoneComponent implements OnInit, AfterViewInit {
|
|
1398
|
+
private el;
|
|
1399
|
+
phoneContainer: ElementRef<HTMLElement>;
|
|
1400
|
+
value: _angular_core.InputSignal<string | null>;
|
|
1401
|
+
defaultCountry: _angular_core.InputSignal<string>;
|
|
1402
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1403
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1404
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1405
|
+
columnWidth: _angular_core.InputSignal<number>;
|
|
1406
|
+
fieldSize: _angular_core.InputSignal<number>;
|
|
1407
|
+
valueChange: EventEmitter<string | null>;
|
|
1408
|
+
blur: EventEmitter<string | null>;
|
|
1409
|
+
focus: EventEmitter<void>;
|
|
1410
|
+
drilldownClick: EventEmitter<string | null>;
|
|
1411
|
+
editModeChange: EventEmitter<boolean>;
|
|
1412
|
+
countryCodes: _angular_core.WritableSignal<CountryCode[]>;
|
|
1413
|
+
selectedCountry: _angular_core.WritableSignal<CountryCode>;
|
|
1414
|
+
countrySearchText: _angular_core.WritableSignal<string>;
|
|
1415
|
+
phoneNumber: _angular_core.WritableSignal<string>;
|
|
1416
|
+
currentValue: _angular_core.WritableSignal<string | null>;
|
|
1417
|
+
isInputFocused: _angular_core.WritableSignal<boolean>;
|
|
1418
|
+
isDropdownOpen: _angular_core.WritableSignal<boolean>;
|
|
1419
|
+
filteredCountries: _angular_core.Signal<CountryCode[]>;
|
|
1420
|
+
isFocused: _angular_core.Signal<boolean>;
|
|
1421
|
+
readonly fullPhoneValue: _angular_core.Signal<string>;
|
|
1422
|
+
constructor();
|
|
1423
|
+
ngOnInit(): void;
|
|
1424
|
+
ngAfterViewInit(): void;
|
|
1425
|
+
onActivate(): void;
|
|
1426
|
+
onInputFocus(event: FocusEvent): void;
|
|
1427
|
+
onInputBlur(event: FocusEvent): void;
|
|
1428
|
+
onDrillableClick(event: Event): void;
|
|
1429
|
+
/**
|
|
1430
|
+
* Get the flag emoji for display
|
|
1431
|
+
* @returns The flag emoji string
|
|
1432
|
+
*/
|
|
1433
|
+
getDisplayFlag(): string;
|
|
1434
|
+
/**
|
|
1435
|
+
* Get the dial code and phone number together (without flag)
|
|
1436
|
+
* @returns The dial code and phone number formatted as "dialCode phoneNumber"
|
|
1437
|
+
*/
|
|
1438
|
+
getDisplayPhoneNumber(): string;
|
|
1439
|
+
/**
|
|
1440
|
+
* Format the complete display value (flag + dial code + number)
|
|
1441
|
+
* @returns The complete formatted phone number with flag
|
|
1442
|
+
*/
|
|
1443
|
+
formatDisplayValue(): string;
|
|
1444
|
+
selectCountry(countryCode: string): void;
|
|
1445
|
+
onCountryChange(countryCode: string): void;
|
|
1446
|
+
onCountrySelectOpenedChange(opened: boolean): void;
|
|
1447
|
+
onCountrySearchChange(searchValue: string): void;
|
|
1448
|
+
displayFlag(country?: CountryCode): string;
|
|
1449
|
+
onPhoneNumberInput(event: Event): void;
|
|
1450
|
+
private emitValueChange;
|
|
1451
|
+
private focusAndPositionCursor;
|
|
1452
|
+
private parseAndSetValue;
|
|
1453
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PhoneComponent, never>;
|
|
1454
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PhoneComponent, "eru-phone", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultCountry": { "alias": "defaultCountry"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "fieldSize": { "alias": "fieldSize"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
declare class ProgressComponent implements OnInit {
|
|
1458
|
+
private el;
|
|
1459
|
+
value: _angular_core.InputSignal<number | null>;
|
|
1460
|
+
config: _angular_core.InputSignal<Field | null>;
|
|
1461
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1462
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1463
|
+
isDrillable: _angular_core.InputSignal<boolean>;
|
|
1464
|
+
columnWidth: _angular_core.InputSignal<number>;
|
|
1465
|
+
fieldSize: _angular_core.InputSignal<number>;
|
|
1466
|
+
eruGridStore: _angular_core.InputSignal<EruGridStore | null>;
|
|
1467
|
+
valueChange: EventEmitter<number>;
|
|
1468
|
+
blur: EventEmitter<number | null>;
|
|
1469
|
+
focus: EventEmitter<void>;
|
|
1470
|
+
drilldownClick: EventEmitter<number | null>;
|
|
1471
|
+
editModeChange: EventEmitter<boolean>;
|
|
1472
|
+
currentValue: _angular_core.WritableSignal<number>;
|
|
1473
|
+
displayValue: _angular_core.Signal<number>;
|
|
1474
|
+
constructor();
|
|
1475
|
+
ngOnInit(): void;
|
|
1476
|
+
onActivate(): void;
|
|
1477
|
+
onBlur(): void;
|
|
1478
|
+
onValueChange(value: number): void;
|
|
1479
|
+
onDrillableClick(event: Event): void;
|
|
1480
|
+
getProperty(property: string): any;
|
|
1481
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressComponent, never>;
|
|
1482
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressComponent, "eru-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; "isDrillable": { "alias": "isDrillable"; "required": false; "isSignal": true; }; "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "fieldSize": { "alias": "fieldSize"; "required": false; "isSignal": true; }; "eruGridStore": { "alias": "eruGridStore"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "drilldownClick": "drilldownClick"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
interface RatingConfig {
|
|
1486
|
+
startValue?: number;
|
|
1487
|
+
endValue?: number;
|
|
1488
|
+
emojiValue?: 'star' | 'smile' | 'heart';
|
|
1489
|
+
}
|
|
1490
|
+
declare class RatingComponent {
|
|
1491
|
+
value: _angular_core.InputSignal<number>;
|
|
1492
|
+
config: _angular_core.InputSignal<RatingConfig>;
|
|
1493
|
+
isEditable: _angular_core.InputSignal<boolean>;
|
|
1494
|
+
isActive: _angular_core.InputSignal<boolean>;
|
|
1495
|
+
valueChange: EventEmitter<number>;
|
|
1496
|
+
editModeChange: EventEmitter<boolean>;
|
|
1497
|
+
currentValue: _angular_core.WritableSignal<number>;
|
|
1498
|
+
hoverRating: _angular_core.WritableSignal<number>;
|
|
1499
|
+
constructor();
|
|
1500
|
+
getRatingStars: _angular_core.Signal<number[]>;
|
|
1501
|
+
getEmoji(star: number): string;
|
|
1502
|
+
onActivate(): void;
|
|
1503
|
+
setRating(value: number): void;
|
|
1504
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RatingComponent, never>;
|
|
1505
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RatingComponent, "eru-rating", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "isActive": { "alias": "isActive"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "editModeChange": "editModeChange"; }, never, never, true, never>;
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
declare const MATERIAL_PROVIDERS: Provider[];
|
|
1509
|
+
declare const MATERIAL_MODULES: (typeof MatCommonModule)[];
|
|
1510
|
+
|
|
1511
|
+
export { CheckboxComponent, ColumnConstraintsService, CurrencyComponent, CustomVirtualScrollStrategy, DateComponent, EmailComponent, EruGridComponent, EruGridService, EruGridStore, HelloWorldComponent, LocationComponent, MATERIAL_MODULES, MATERIAL_PROVIDERS, NumberComponent, PhoneComponent, ProgressComponent, RatingComponent, TextboxComponent, ThemeService, ThemeToggleComponent };
|
|
1512
|
+
export type { ActionClick, AggregationFunction, ColumnWidthConstraints, CurrencyValidationResult, DataTypes, Drilldown, EmailValidationResult, Field, GridConfiguration, GridFeatures, GridMode, GridStyles, GridTokens, GroupItem$1 as GroupItem, LocationConfig, LocationValidationResult, NumberValidationResult, PivotColumnGroupState, PivotColumnHeader, PivotConfiguration, PivotHeaderStructure, PivotMetadata, PivotResult, PivotRow, RatingConfig, Row, RowDataRequest, RowDataResponse, RowGrandTotal, RowGroup, TextboxValidationResult, Theme };
|