eru-grid 0.0.25 → 0.0.26
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 +545 -397
- package/fesm2022/eru-grid.mjs.map +1 -1
- package/package.json +1 -1
- package/types/eru-grid.d.ts +688 -110
package/fesm2022/eru-grid.mjs
CHANGED
|
@@ -10,28 +10,30 @@ import * as i1$2 from '@angular/material/button';
|
|
|
10
10
|
import { MatButtonModule } from '@angular/material/button';
|
|
11
11
|
import * as i4$1 from '@angular/material/checkbox';
|
|
12
12
|
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
13
|
-
import * as i2$
|
|
13
|
+
import * as i2$3 from '@angular/material/slider';
|
|
14
14
|
import { MatSliderModule } from '@angular/material/slider';
|
|
15
|
-
import * as
|
|
15
|
+
import * as i2$1 from '@angular/material/icon';
|
|
16
16
|
import { MatIconModule } from '@angular/material/icon';
|
|
17
|
-
import * as i2$
|
|
17
|
+
import * as i2$4 from '@angular/common';
|
|
18
18
|
import { DatePipe, CommonModule } from '@angular/common';
|
|
19
19
|
import * as i4$2 from '@angular/material/datepicker';
|
|
20
20
|
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
21
21
|
import * as i1$1 from '@angular/material/core';
|
|
22
22
|
import { NativeDateAdapter, DateAdapter, MAT_DATE_FORMATS, MatNativeDateModule, MatOptionModule } from '@angular/material/core';
|
|
23
23
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
24
|
-
import * as
|
|
24
|
+
import * as i4$3 from '@angular/cdk/overlay';
|
|
25
25
|
import { OverlayModule } from '@angular/cdk/overlay';
|
|
26
26
|
import * as i4 from '@angular/material/tooltip';
|
|
27
27
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
28
28
|
import * as i4$4 from '@angular/material/tabs';
|
|
29
29
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
30
|
-
import * as i2$
|
|
30
|
+
import * as i2$2 from '@angular/material/select';
|
|
31
31
|
import { MatSelectModule } from '@angular/material/select';
|
|
32
32
|
import { polyfillCountryFlagEmojis } from 'country-flag-emoji-polyfill';
|
|
33
33
|
import { MatChipsModule } from '@angular/material/chips';
|
|
34
34
|
import { FixedSizeVirtualScrollStrategy, ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
35
|
+
import * as i1$3 from '@angular/material/card';
|
|
36
|
+
import { MatCardModule } from '@angular/material/card';
|
|
35
37
|
import * as i3$1 from '@angular/material/menu';
|
|
36
38
|
import { MatMenuModule } from '@angular/material/menu';
|
|
37
39
|
|
|
@@ -139,15 +141,6 @@ class PivotTransformService {
|
|
|
139
141
|
processingTime: endTime - startTime,
|
|
140
142
|
dataSize: sourceData.length
|
|
141
143
|
};
|
|
142
|
-
console.log({
|
|
143
|
-
data: pivotRows,
|
|
144
|
-
columnDefinitions,
|
|
145
|
-
rowCount: pivotRows.length,
|
|
146
|
-
metadata,
|
|
147
|
-
configuration,
|
|
148
|
-
headerStructure,
|
|
149
|
-
columnGroupState: this.columnGroupState
|
|
150
|
-
});
|
|
151
144
|
return {
|
|
152
145
|
data: pivotRows,
|
|
153
146
|
columnDefinitions,
|
|
@@ -161,20 +154,36 @@ class PivotTransformService {
|
|
|
161
154
|
/**
|
|
162
155
|
* Group data by row dimensions and collect unique column dimension values
|
|
163
156
|
*/
|
|
157
|
+
/**
|
|
158
|
+
* Resolve a field value from a row, supporting both flat objects and
|
|
159
|
+
* the API row shape { entity_id, entity_data: { ... } }.
|
|
160
|
+
*/
|
|
161
|
+
getFieldValue(row, fieldName) {
|
|
162
|
+
if (row == null)
|
|
163
|
+
return null;
|
|
164
|
+
const direct = row[fieldName];
|
|
165
|
+
if (direct != null)
|
|
166
|
+
return direct;
|
|
167
|
+
return row.entity_data?.[fieldName] ?? null;
|
|
168
|
+
}
|
|
164
169
|
groupByDimensions(data, rowDimensions, columnDimensions = []) {
|
|
165
170
|
const groups = new Map();
|
|
166
171
|
const columnDimensionValues = columnDimensions.map(() => new Set());
|
|
167
172
|
data.forEach(row => {
|
|
168
173
|
// Create a key from row dimension values
|
|
169
174
|
// Use null/undefined check to preserve boolean false values
|
|
170
|
-
const key = rowDimensions.map(dim =>
|
|
175
|
+
const key = rowDimensions.map(dim => {
|
|
176
|
+
const v = this.getFieldValue(row, dim);
|
|
177
|
+
return v != null ? String(v) : '';
|
|
178
|
+
}).join('|');
|
|
171
179
|
if (!groups.has(key)) {
|
|
172
180
|
groups.set(key, []);
|
|
173
181
|
}
|
|
174
182
|
groups.get(key).push(row);
|
|
175
183
|
// Collect unique column dimension values while iterating
|
|
176
184
|
columnDimensions.forEach((dimension, index) => {
|
|
177
|
-
const
|
|
185
|
+
const v = this.getFieldValue(row, dimension);
|
|
186
|
+
const value = v != null ? String(v) : '';
|
|
178
187
|
columnDimensionValues[index].add(value);
|
|
179
188
|
});
|
|
180
189
|
});
|
|
@@ -273,8 +282,10 @@ class PivotTransformService {
|
|
|
273
282
|
// Group row data by column dimensions
|
|
274
283
|
rowData.forEach(row => {
|
|
275
284
|
const rowColumnKey = configuration.cols.length > 0
|
|
276
|
-
? configuration.cols
|
|
277
|
-
|
|
285
|
+
? configuration.cols.map(fieldName => {
|
|
286
|
+
const v = this.getFieldValue(row, fieldName);
|
|
287
|
+
return v != null ? String(v) : '';
|
|
288
|
+
}).join('|')
|
|
278
289
|
: '_default';
|
|
279
290
|
if (!columnMapping.has(rowColumnKey)) {
|
|
280
291
|
columnMapping.set(rowColumnKey, []);
|
|
@@ -328,7 +339,7 @@ class PivotTransformService {
|
|
|
328
339
|
let max = Number.MIN_VALUE;
|
|
329
340
|
let validCount = 0;
|
|
330
341
|
for (const row of data) {
|
|
331
|
-
const rawValue = row
|
|
342
|
+
const rawValue = this.getFieldValue(row, field);
|
|
332
343
|
if (rawValue !== null && rawValue !== undefined && rawValue !== '') {
|
|
333
344
|
const numValue = Number(rawValue);
|
|
334
345
|
if (!isNaN(numValue)) {
|
|
@@ -384,7 +395,6 @@ class PivotTransformService {
|
|
|
384
395
|
enableDrilldown: field?.enableDrilldown || false
|
|
385
396
|
});
|
|
386
397
|
});
|
|
387
|
-
console.log(columns);
|
|
388
398
|
// Check if column subtotals and grand totals are enabled
|
|
389
399
|
const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;
|
|
390
400
|
const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;
|
|
@@ -592,8 +602,9 @@ class PivotTransformService {
|
|
|
592
602
|
const dimensionValues = columnDimensions.map(dimension => {
|
|
593
603
|
const values = new Set();
|
|
594
604
|
sourceData.forEach(row => {
|
|
595
|
-
const
|
|
596
|
-
|
|
605
|
+
const v = this.getFieldValue(row, dimension);
|
|
606
|
+
const value = v != null ? String(v) : '';
|
|
607
|
+
values.add(value);
|
|
597
608
|
});
|
|
598
609
|
return Array.from(values).sort();
|
|
599
610
|
});
|
|
@@ -1073,7 +1084,6 @@ class PivotTransformService {
|
|
|
1073
1084
|
combinations.push([value, ...restCombo]);
|
|
1074
1085
|
});
|
|
1075
1086
|
});
|
|
1076
|
-
console.log(combinations);
|
|
1077
1087
|
return combinations;
|
|
1078
1088
|
}
|
|
1079
1089
|
/**
|
|
@@ -1114,8 +1124,9 @@ class PivotTransformService {
|
|
|
1114
1124
|
return [];
|
|
1115
1125
|
const values = new Set();
|
|
1116
1126
|
sourceData.forEach(row => {
|
|
1117
|
-
const
|
|
1118
|
-
|
|
1127
|
+
const v = this.getFieldValue(row, dimension);
|
|
1128
|
+
const value = v != null ? String(v) : '';
|
|
1129
|
+
values.add(value);
|
|
1119
1130
|
});
|
|
1120
1131
|
return Array.from(values).sort();
|
|
1121
1132
|
});
|
|
@@ -2082,8 +2093,9 @@ class PivotTransformService {
|
|
|
2082
2093
|
const values = new Set();
|
|
2083
2094
|
if (sourceData && sourceData.length > 0) {
|
|
2084
2095
|
sourceData.forEach(row => {
|
|
2085
|
-
const
|
|
2086
|
-
|
|
2096
|
+
const v = this.getFieldValue(row, dimension);
|
|
2097
|
+
const value = v != null ? String(v) : undefined;
|
|
2098
|
+
if (value !== undefined) {
|
|
2087
2099
|
values.add(value);
|
|
2088
2100
|
}
|
|
2089
2101
|
});
|
|
@@ -2187,7 +2199,6 @@ class PivotTransformService {
|
|
|
2187
2199
|
this.addParentGroupKeysToHeaders(pivotHeaders, rowIndex, sourceData, columnDimensions);
|
|
2188
2200
|
const statusGroups = this.groupHeadersByParentKey(pivotHeaders);
|
|
2189
2201
|
const ratingSubtotals = this.groupSubtotalsByParentKey(subtotalHeaders);
|
|
2190
|
-
console.log(`DEBUG: Status groups with parentKey: ${Object.keys(statusGroups).length}, Rating subtotals: ${Object.keys(ratingSubtotals).length}`);
|
|
2191
2202
|
// Process each dimension combination dynamically
|
|
2192
2203
|
const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);
|
|
2193
2204
|
const secondDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[1]);
|
|
@@ -2217,8 +2228,9 @@ class PivotTransformService {
|
|
|
2217
2228
|
extractDimensionValues(sourceData, dimension) {
|
|
2218
2229
|
const values = new Set();
|
|
2219
2230
|
sourceData.forEach(row => {
|
|
2220
|
-
const
|
|
2221
|
-
|
|
2231
|
+
const v = this.getFieldValue(row, dimension);
|
|
2232
|
+
const value = v != null ? String(v) : '';
|
|
2233
|
+
values.add(value);
|
|
2222
2234
|
});
|
|
2223
2235
|
return Array.from(values).sort();
|
|
2224
2236
|
}
|
|
@@ -2389,14 +2401,16 @@ class ColumnConstraintsService {
|
|
|
2389
2401
|
duration: { minWidth: 100, maxWidth: 180 },
|
|
2390
2402
|
dropdown_single_select: { minWidth: 80, maxWidth: 200 },
|
|
2391
2403
|
dropdown_multi_select: { minWidth: 100, maxWidth: 250 },
|
|
2392
|
-
checkbox: { minWidth: 40, maxWidth:
|
|
2404
|
+
checkbox: { minWidth: 40, maxWidth: 100 },
|
|
2393
2405
|
people: { minWidth: 100, maxWidth: 200 },
|
|
2394
2406
|
phone: { minWidth: 120, maxWidth: 180 },
|
|
2395
2407
|
priority: { minWidth: 80, maxWidth: 150 },
|
|
2396
2408
|
status: { minWidth: 80, maxWidth: 150 },
|
|
2397
2409
|
progress: { minWidth: 100, maxWidth: 200 },
|
|
2398
2410
|
attachment: { minWidth: 60, maxWidth: 100 },
|
|
2399
|
-
|
|
2411
|
+
tag: { minWidth: 100, maxWidth: 150 },
|
|
2412
|
+
rating: { minWidth: 150, maxWidth: 150 },
|
|
2413
|
+
website: { minWidth: 100, maxWidth: 250 }
|
|
2400
2414
|
};
|
|
2401
2415
|
/**
|
|
2402
2416
|
* Get effective constraints for a column, considering all override levels
|
|
@@ -2405,8 +2419,7 @@ class ColumnConstraintsService {
|
|
|
2405
2419
|
// Start with datatype defaults (fallback to generic if column is undefined)
|
|
2406
2420
|
const datatype = column?.datatype;
|
|
2407
2421
|
const datatypeDefaults = datatype && datatype in this.DATATYPE_DEFAULTS ?
|
|
2408
|
-
this.DATATYPE_DEFAULTS[datatype] :
|
|
2409
|
-
{ minWidth: 60, maxWidth: 300 };
|
|
2422
|
+
this.DATATYPE_DEFAULTS[datatype] : {};
|
|
2410
2423
|
// Apply global config overrides
|
|
2411
2424
|
const globalConstraints = gridConfig?.columnConstraints?.global || {};
|
|
2412
2425
|
// Apply datatype-specific config overrides
|
|
@@ -2422,12 +2435,12 @@ class ColumnConstraintsService {
|
|
|
2422
2435
|
return {
|
|
2423
2436
|
minWidth: columnSpecificConstraints.minWidth ??
|
|
2424
2437
|
datatypeConfigConstraints.minWidth ??
|
|
2425
|
-
|
|
2426
|
-
|
|
2438
|
+
datatypeDefaults.minWidth ??
|
|
2439
|
+
globalConstraints.minWidth,
|
|
2427
2440
|
maxWidth: columnSpecificConstraints.maxWidth ??
|
|
2428
2441
|
datatypeConfigConstraints.maxWidth ??
|
|
2429
|
-
|
|
2430
|
-
|
|
2442
|
+
datatypeDefaults.maxWidth ??
|
|
2443
|
+
globalConstraints.maxWidth
|
|
2431
2444
|
};
|
|
2432
2445
|
}
|
|
2433
2446
|
/**
|
|
@@ -2443,12 +2456,6 @@ class ColumnConstraintsService {
|
|
|
2443
2456
|
}
|
|
2444
2457
|
return width;
|
|
2445
2458
|
}
|
|
2446
|
-
/**
|
|
2447
|
-
* Get all datatype defaults (for documentation/debugging)
|
|
2448
|
-
*/
|
|
2449
|
-
getDatatypeDefaults() {
|
|
2450
|
-
return { ...this.DATATYPE_DEFAULTS };
|
|
2451
|
-
}
|
|
2452
2459
|
/**
|
|
2453
2460
|
* Get default field_size for a column following fallback hierarchy
|
|
2454
2461
|
* Priority: column.field_size > datatype config minWidth > global config minWidth > datatype default minWidth > 150
|
|
@@ -2522,6 +2529,9 @@ class EruGridStore {
|
|
|
2522
2529
|
_pivotResult = signal(null, ...(ngDevMode ? [{ debugName: "_pivotResult" }] : []));
|
|
2523
2530
|
_drilldown = signal(null, ...(ngDevMode ? [{ debugName: "_drilldown" }] : []));
|
|
2524
2531
|
_actionClick = signal(null, ...(ngDevMode ? [{ debugName: "_actionClick" }] : []));
|
|
2532
|
+
_columnResize = signal(null, ...(ngDevMode ? [{ debugName: "_columnResize" }] : []));
|
|
2533
|
+
_columnReorder = signal(null, ...(ngDevMode ? [{ debugName: "_columnReorder" }] : []));
|
|
2534
|
+
_cellValueChange = signal(null, ...(ngDevMode ? [{ debugName: "_cellValueChange" }] : []));
|
|
2525
2535
|
// Data request signal for virtual scrolling pagination
|
|
2526
2536
|
_dataRequest = signal(null, ...(ngDevMode ? [{ debugName: "_dataRequest" }] : []));
|
|
2527
2537
|
// Request queue to handle multiple simultaneous requests
|
|
@@ -2543,6 +2553,9 @@ class EruGridStore {
|
|
|
2543
2553
|
pivotResult = this._pivotResult.asReadonly();
|
|
2544
2554
|
drilldown = this._drilldown.asReadonly();
|
|
2545
2555
|
actionClick = this._actionClick.asReadonly();
|
|
2556
|
+
columnResize = this._columnResize.asReadonly();
|
|
2557
|
+
columnReorder = this._columnReorder.asReadonly();
|
|
2558
|
+
cellValueChange = this._cellValueChange.asReadonly();
|
|
2546
2559
|
// Data request readonly signal (exposed to consumers)
|
|
2547
2560
|
dataRequest = this._dataRequest.asReadonly();
|
|
2548
2561
|
// Dynamic data readonly signals
|
|
@@ -2631,7 +2644,7 @@ class EruGridStore {
|
|
|
2631
2644
|
const config = this.configuration();
|
|
2632
2645
|
const normalizedColumns = columns.map(column => ({
|
|
2633
2646
|
...column,
|
|
2634
|
-
field_size:
|
|
2647
|
+
field_size: this.columnConstraintsService.getDefaultFieldSize(column, config)
|
|
2635
2648
|
}));
|
|
2636
2649
|
// Sort columns by grid_index to ensure proper order in table mode
|
|
2637
2650
|
// Handles missing/gapped grid_index values correctly (e.g., 1, 4, 5 instead of 1, 2, 3)
|
|
@@ -2645,7 +2658,6 @@ class EruGridStore {
|
|
|
2645
2658
|
// Secondary sort: by column name (alphabetically) when grid_index is the same
|
|
2646
2659
|
return (a.name || '').localeCompare(b.name || '');
|
|
2647
2660
|
});
|
|
2648
|
-
console.log('Sorted columns', sortedColumns);
|
|
2649
2661
|
this._columns.set(sortedColumns);
|
|
2650
2662
|
}
|
|
2651
2663
|
/**
|
|
@@ -2730,31 +2742,23 @@ class EruGridStore {
|
|
|
2730
2742
|
console.error('Invalid column indices', { fromIndex, toIndex });
|
|
2731
2743
|
return;
|
|
2732
2744
|
}
|
|
2733
|
-
//
|
|
2734
|
-
//
|
|
2735
|
-
let adjustedToIndex = toIndex;
|
|
2736
|
-
// When dragging from left to right (forward), after removing the source column,
|
|
2737
|
-
// all columns to the right shift left by 1, so the target index also shifts left
|
|
2738
|
-
if (fromIndex < toIndex) {
|
|
2739
|
-
adjustedToIndex = toIndex - 1;
|
|
2740
|
-
}
|
|
2741
|
-
// When dragging from right to left (backward), indices remain the same
|
|
2742
|
-
// because we're inserting before columns that haven't been shifted yet
|
|
2745
|
+
// Move logic: remove from source and insert at destination
|
|
2746
|
+
// Array.splice handles the shifting of subsequent elements automatically
|
|
2743
2747
|
const [removedColumn] = currentColumns.splice(fromIndex, 1);
|
|
2744
|
-
currentColumns.splice(
|
|
2748
|
+
currentColumns.splice(toIndex, 0, removedColumn);
|
|
2745
2749
|
// Update grid_index values to reflect new order
|
|
2746
2750
|
// grid_index starts from 1 (1-based), so position 0 = grid_index 1
|
|
2747
2751
|
const reorderedColumns = currentColumns.map((col, index) => ({
|
|
2748
2752
|
...col,
|
|
2749
2753
|
grid_index: index + 1 // grid_index typically starts from 1
|
|
2750
2754
|
}));
|
|
2751
|
-
|
|
2755
|
+
this._columns.set(reorderedColumns);
|
|
2756
|
+
// Set reorder signal
|
|
2757
|
+
this._columnReorder.set({
|
|
2752
2758
|
fromIndex,
|
|
2753
2759
|
toIndex,
|
|
2754
|
-
|
|
2755
|
-
finalOrder: reorderedColumns.map((col, idx) => ({ name: col.name, position: idx, grid_index: col.grid_index }))
|
|
2760
|
+
newColumns: reorderedColumns
|
|
2756
2761
|
});
|
|
2757
|
-
this._columns.set(reorderedColumns);
|
|
2758
2762
|
}
|
|
2759
2763
|
updateColumnRequired(columnName, required) {
|
|
2760
2764
|
const columns = this.columns().map(col => col.name === columnName ? { ...col, required } : col);
|
|
@@ -2764,9 +2768,11 @@ class EruGridStore {
|
|
|
2764
2768
|
const columns = this.columns().map(col => col.name === columnName ? { ...col, field_size: field_size } : col);
|
|
2765
2769
|
this._columns.set(columns);
|
|
2766
2770
|
}
|
|
2771
|
+
setCellValueChange(change) {
|
|
2772
|
+
this._cellValueChange.set(change);
|
|
2773
|
+
}
|
|
2767
2774
|
// Group methods
|
|
2768
2775
|
setGroups(groups) {
|
|
2769
|
-
console.log("setGroups from grid.store", groups);
|
|
2770
2776
|
this._groups.set(groups);
|
|
2771
2777
|
}
|
|
2772
2778
|
toggleGroupExpansion(groupId) {
|
|
@@ -2774,7 +2780,6 @@ class EruGridStore {
|
|
|
2774
2780
|
? { ...group, isExpanded: !group.isExpanded }
|
|
2775
2781
|
: group);
|
|
2776
2782
|
this._groups.set(groups);
|
|
2777
|
-
console.log("toggleGroupExpansion completed");
|
|
2778
2783
|
}
|
|
2779
2784
|
updateGroupLoadingState(groupId, isLoading) {
|
|
2780
2785
|
const groups = this.groups().map(group => group.id === groupId ? { ...group, isLoading } : group);
|
|
@@ -2861,6 +2866,10 @@ class EruGridStore {
|
|
|
2861
2866
|
};
|
|
2862
2867
|
this._configuration.set(this.validateAndEnforceConfiguration(newConfiguration));
|
|
2863
2868
|
this.setColumns(configuration.fields);
|
|
2869
|
+
// Sync _pivotConfiguration when mode is pivot so transformToPivot() can read it
|
|
2870
|
+
if (configuration.mode === 'pivot' && configuration.pivot) {
|
|
2871
|
+
this._pivotConfiguration.set(configuration.pivot);
|
|
2872
|
+
}
|
|
2864
2873
|
}
|
|
2865
2874
|
/**
|
|
2866
2875
|
* Validates and enforces rules for grid configuration
|
|
@@ -2950,9 +2959,8 @@ class EruGridStore {
|
|
|
2950
2959
|
groupRows.every(row => this.selectedRowIds().has(row.entity_id));
|
|
2951
2960
|
}
|
|
2952
2961
|
getRowsForGroup(groupId) {
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
return this.groupRows().get(groupId) || [];
|
|
2962
|
+
const key = groupId ?? '';
|
|
2963
|
+
return this.groupRows().get(key) || [];
|
|
2956
2964
|
}
|
|
2957
2965
|
// Pivot methods
|
|
2958
2966
|
setGridMode(mode) {
|
|
@@ -2990,7 +2998,6 @@ class EruGridStore {
|
|
|
2990
2998
|
this._configuration.set(this.validateAndEnforceConfiguration(mergedConfig));
|
|
2991
2999
|
}
|
|
2992
3000
|
setPivotConfiguration(pivotConfig) {
|
|
2993
|
-
console.log('🔄 SET PIVOT CONFIGURATION: Setting pivot configuration', pivotConfig);
|
|
2994
3001
|
this._pivotConfiguration.set(pivotConfig);
|
|
2995
3002
|
// Also store in the main configuration for consistency
|
|
2996
3003
|
this.updateGridConfiguration({ pivot: pivotConfig });
|
|
@@ -3012,10 +3019,16 @@ class EruGridStore {
|
|
|
3012
3019
|
}
|
|
3013
3020
|
}
|
|
3014
3021
|
transformToPivot() {
|
|
3015
|
-
|
|
3016
|
-
const
|
|
3022
|
+
// Prefer explicit pivot configuration signal, fall back to configuration().pivot
|
|
3023
|
+
const pivotConfig = this.pivotConfiguration() || this.configuration().pivot;
|
|
3024
|
+
// Prefer explicit source data, fall back to all loaded group rows
|
|
3025
|
+
let sourceData = this.configuration().data || [];
|
|
3026
|
+
if (sourceData.length === 0) {
|
|
3027
|
+
const allGroupRows = [];
|
|
3028
|
+
this._groupRows().forEach(rows => allGroupRows.push(...rows));
|
|
3029
|
+
sourceData = allGroupRows;
|
|
3030
|
+
}
|
|
3017
3031
|
if (!pivotConfig || sourceData.length === 0) {
|
|
3018
|
-
console.log('🔄 TRANSFORM DEBUG: Skipping transformation - no config or data');
|
|
3019
3032
|
return;
|
|
3020
3033
|
}
|
|
3021
3034
|
this.setLoading(true);
|
|
@@ -3042,7 +3055,6 @@ class EruGridStore {
|
|
|
3042
3055
|
}
|
|
3043
3056
|
// Force refresh pivot transformation (for debugging)
|
|
3044
3057
|
forceRefreshPivot() {
|
|
3045
|
-
console.log('🔄 FORCE REFRESH: Clearing pivot result and re-transforming');
|
|
3046
3058
|
this._pivotResult.set(null);
|
|
3047
3059
|
this.transformToPivot();
|
|
3048
3060
|
}
|
|
@@ -3147,7 +3159,6 @@ class EruGridStore {
|
|
|
3147
3159
|
columnValuesArray.forEach((value, index) => {
|
|
3148
3160
|
drilldown.rowData[cols[index]] = value;
|
|
3149
3161
|
});
|
|
3150
|
-
console.log('🔄 SET DRILLDOWN: Drilldown', drilldown);
|
|
3151
3162
|
this._drilldown.set(drilldown);
|
|
3152
3163
|
}
|
|
3153
3164
|
clearPivotDrilldown() {
|
|
@@ -3165,9 +3176,11 @@ class EruGridStore {
|
|
|
3165
3176
|
actionClick.rowData = row || this.rows()[parseInt(actionClick.rowId) - 2];
|
|
3166
3177
|
}
|
|
3167
3178
|
}
|
|
3168
|
-
console.log('🔄 SET ACTION CLICK: ActionClick', actionClick);
|
|
3169
3179
|
this._actionClick.set(actionClick);
|
|
3170
3180
|
}
|
|
3181
|
+
setColumnResize(columnResize) {
|
|
3182
|
+
this._columnResize.set(columnResize);
|
|
3183
|
+
}
|
|
3171
3184
|
clearActionClick() {
|
|
3172
3185
|
this._actionClick.set(null);
|
|
3173
3186
|
}
|
|
@@ -3176,7 +3189,6 @@ class EruGridStore {
|
|
|
3176
3189
|
* Emit a data request signal (called by grid component)
|
|
3177
3190
|
*/
|
|
3178
3191
|
setDataRequest(request) {
|
|
3179
|
-
console.log('📤 Grid Store: Emitting data request', request);
|
|
3180
3192
|
this._dataRequest.set(request);
|
|
3181
3193
|
}
|
|
3182
3194
|
/**
|
|
@@ -3217,17 +3229,27 @@ class EruGridStore {
|
|
|
3217
3229
|
completeGroupLoading(groupId) {
|
|
3218
3230
|
this.updateGroupLoadingState(groupId, false);
|
|
3219
3231
|
}
|
|
3232
|
+
resetGroupRows() {
|
|
3233
|
+
console.log('resetGroupRows');
|
|
3234
|
+
this._groupRows.set(new Map());
|
|
3235
|
+
}
|
|
3220
3236
|
/**
|
|
3221
3237
|
* Add rows for a specific group (called by consumer with API data)
|
|
3222
3238
|
*/
|
|
3223
3239
|
addRowsForGroup(groupId, rows, hasMore) {
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3240
|
+
// Normalize null → '' so all template/computed lookups (which use `group.id || ''`) find the data
|
|
3241
|
+
const key = groupId ?? '';
|
|
3242
|
+
const currentMap = this._groupRows();
|
|
3243
|
+
const newMap = new Map(currentMap);
|
|
3244
|
+
const existingRows = newMap.get(key) || [];
|
|
3245
|
+
newMap.set(key, [...existingRows, ...rows]);
|
|
3246
|
+
this._groupRows.set(newMap);
|
|
3229
3247
|
// Update group metadata
|
|
3230
3248
|
this.updateGroupAfterLoading(groupId, rows.length, !hasMore);
|
|
3249
|
+
// In pivot mode, re-run transform so new rows are reflected immediately
|
|
3250
|
+
if (this.isPivotMode()) {
|
|
3251
|
+
this.transformToPivot();
|
|
3252
|
+
}
|
|
3231
3253
|
}
|
|
3232
3254
|
/**
|
|
3233
3255
|
* Handle error for data request (called by consumer when API fails)
|
|
@@ -3435,7 +3457,6 @@ class EruGridService {
|
|
|
3435
3457
|
this.gridStore.setColumns(data);
|
|
3436
3458
|
} */
|
|
3437
3459
|
/* set_table_group(data: RowGroup[]) {
|
|
3438
|
-
console.log("set_table_group from eru-grid.service", data);
|
|
3439
3460
|
this.eruGridStore.setGroups(data);
|
|
3440
3461
|
} */
|
|
3441
3462
|
// Expose additional methods for external use
|
|
@@ -3458,16 +3479,9 @@ class EruGridService {
|
|
|
3458
3479
|
get theme() {
|
|
3459
3480
|
return this.themeService;
|
|
3460
3481
|
}
|
|
3461
|
-
// Column constraints management
|
|
3462
|
-
getColumnConstraints(column) {
|
|
3463
|
-
return this.columnConstraintsService.getColumnConstraints(column, this.eruGridStore.gridConfiguration());
|
|
3464
|
-
}
|
|
3465
3482
|
constrainColumnWidth(width, column) {
|
|
3466
3483
|
return this.columnConstraintsService.constrainWidth(width, column, this.eruGridStore.gridConfiguration());
|
|
3467
3484
|
}
|
|
3468
|
-
getDatatypeDefaults() {
|
|
3469
|
-
return this.columnConstraintsService.getDatatypeDefaults();
|
|
3470
|
-
}
|
|
3471
3485
|
// Pivot functionality methods
|
|
3472
3486
|
/**
|
|
3473
3487
|
* Configure the grid for pivot mode with pivot configuration
|
|
@@ -3496,14 +3510,12 @@ class EruGridService {
|
|
|
3496
3510
|
* Update grid configuration with new settings
|
|
3497
3511
|
*/
|
|
3498
3512
|
update_grid_configuration(updates) {
|
|
3499
|
-
console.log('🔄 update_grid_configuration from service:', updates);
|
|
3500
3513
|
this.eruGridStore.updateGridConfiguration(updates);
|
|
3501
3514
|
}
|
|
3502
3515
|
/**
|
|
3503
3516
|
* Enable or disable specific grid features
|
|
3504
3517
|
*/
|
|
3505
3518
|
set_grid_features(features) {
|
|
3506
|
-
console.log('🔄 set_grid_features from service:', features);
|
|
3507
3519
|
const currentConfig = this.eruGridStore.configuration();
|
|
3508
3520
|
this.eruGridStore.updateGridConfiguration({
|
|
3509
3521
|
config: {
|
|
@@ -3842,7 +3854,6 @@ class CurrencyComponent {
|
|
|
3842
3854
|
matInput.setSelectionRange(0, 0);
|
|
3843
3855
|
}
|
|
3844
3856
|
catch (error) {
|
|
3845
|
-
console.log("Could not set cursor position:", error);
|
|
3846
3857
|
}
|
|
3847
3858
|
}
|
|
3848
3859
|
else if (attempts < maxAttempts) {
|
|
@@ -4015,7 +4026,6 @@ class NumberComponent {
|
|
|
4015
4026
|
matInput.setSelectionRange(0, 0);
|
|
4016
4027
|
}
|
|
4017
4028
|
catch (error) {
|
|
4018
|
-
console.log("Could not set cursor position:", error);
|
|
4019
4029
|
}
|
|
4020
4030
|
}
|
|
4021
4031
|
else if (attempts < maxAttempts) {
|
|
@@ -4187,7 +4197,6 @@ class TextboxComponent {
|
|
|
4187
4197
|
matInput.setSelectionRange(0, 0);
|
|
4188
4198
|
}
|
|
4189
4199
|
catch (error) {
|
|
4190
|
-
console.log("Could not set cursor position:", error);
|
|
4191
4200
|
}
|
|
4192
4201
|
}
|
|
4193
4202
|
else if (attempts < maxAttempts) {
|
|
@@ -4345,7 +4354,6 @@ class EmailComponent {
|
|
|
4345
4354
|
matInput.setSelectionRange(0, 0);
|
|
4346
4355
|
}
|
|
4347
4356
|
catch (error) {
|
|
4348
|
-
console.log("Could not set cursor position:", error);
|
|
4349
4357
|
}
|
|
4350
4358
|
}
|
|
4351
4359
|
else if (attempts < maxAttempts) {
|
|
@@ -4542,7 +4550,6 @@ class TextareaComponent {
|
|
|
4542
4550
|
matTextarea.setSelectionRange(0, 0);
|
|
4543
4551
|
}
|
|
4544
4552
|
catch (error) {
|
|
4545
|
-
console.log("Could not set cursor position:", error);
|
|
4546
4553
|
}
|
|
4547
4554
|
}
|
|
4548
4555
|
else if (attempts < maxAttempts) {
|
|
@@ -4740,7 +4747,6 @@ class WebsiteComponent {
|
|
|
4740
4747
|
matInput.setSelectionRange(0, 0);
|
|
4741
4748
|
}
|
|
4742
4749
|
catch (error) {
|
|
4743
|
-
console.log("Could not set cursor position:", error);
|
|
4744
4750
|
}
|
|
4745
4751
|
}
|
|
4746
4752
|
else if (attempts < maxAttempts) {
|
|
@@ -4914,7 +4920,6 @@ class LocationComponent {
|
|
|
4914
4920
|
this.internalError.set('');
|
|
4915
4921
|
}
|
|
4916
4922
|
});
|
|
4917
|
-
console.log('Google Places Autocomplete initialized successfully');
|
|
4918
4923
|
}
|
|
4919
4924
|
catch (error) {
|
|
4920
4925
|
console.error('Error setting up Google Places Autocomplete:', error);
|
|
@@ -4999,7 +5004,6 @@ class LocationComponent {
|
|
|
4999
5004
|
matInput.setSelectionRange(0, 0);
|
|
5000
5005
|
}
|
|
5001
5006
|
catch (error) {
|
|
5002
|
-
console.log("Could not set cursor position:", error);
|
|
5003
5007
|
}
|
|
5004
5008
|
}
|
|
5005
5009
|
else if (attempts < maxAttempts) {
|
|
@@ -5115,7 +5119,12 @@ class CustomDateAdapter extends NativeDateAdapter {
|
|
|
5115
5119
|
pad(n) {
|
|
5116
5120
|
return n < 10 ? '0' + n : n.toString();
|
|
5117
5121
|
}
|
|
5122
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CustomDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
5123
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CustomDateAdapter });
|
|
5118
5124
|
}
|
|
5125
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CustomDateAdapter, decorators: [{
|
|
5126
|
+
type: Injectable
|
|
5127
|
+
}] });
|
|
5119
5128
|
class CustomDatePickerDirective {
|
|
5120
5129
|
el;
|
|
5121
5130
|
renderer;
|
|
@@ -5366,7 +5375,7 @@ class TimePickerPanelComponent {
|
|
|
5366
5375
|
return String(num).padStart(2, '0');
|
|
5367
5376
|
}
|
|
5368
5377
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TimePickerPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5369
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: TimePickerPanelComponent, isStandalone: true, selector: "eru-time-picker-panel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, hour: { classPropertyName: "hour", publicName: "hour", isSignal: true, isRequired: false, transformFunction: null }, minute: { classPropertyName: "minute", publicName: "minute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { timeSelected: "timeSelected", close: "close" }, ngImport: i0, template: "<div class=\"time-picker-panel\">\n <div class=\"time-picker-header\">\n <span class=\"time-picker-title\">Select Time</span>\n <button mat-icon-button class=\"close-button\" (click)=\"onClose()\" type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n \n <div class=\"time-picker-content\">\n <div class=\"time-column\">\n <div class=\"time-column-header\">Hour</div>\n <div class=\"time-scroll-container\">\n @for (hour of hours; track hour) {\n <button\n type=\"button\"\n class=\"time-option\"\n [class.selected]=\"isHourSelected(hour)\"\n (click)=\"onHourSelect(hour)\">\n {{formatNumber(hour)}}\n </button>\n }\n </div>\n </div>\n \n <div class=\"time-column\">\n <div class=\"time-column-header\">Minute</div>\n <div class=\"time-scroll-container\">\n @for (minute of minutes; track minute) {\n <button\n type=\"button\"\n class=\"time-option\"\n [class.selected]=\"isMinuteSelected(minute)\"\n (click)=\"onMinuteSelect(minute)\">\n {{formatNumber(minute)}}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n\n", styles: [".time-picker-panel{background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:200px;max-width:300px;display:flex;flex-direction:column;overflow:hidden}.time-picker-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid rgba(0,0,0,.12);background-color:#00000005}.time-picker-title{font-size:14px;font-weight:500;color:#000000de}.close-button{width:32px;height:32px;line-height:32px}.close-button mat-icon{font-size:18px;width:18px;height:18px}.time-picker-content{display:flex;max-height:300px;overflow:hidden}.time-column{flex:1;display:flex;flex-direction:column;border-right:1px solid rgba(0,0,0,.12)}.time-column:last-child{border-right:none}.time-column-header{padding:8px 12px;font-size:12px;font-weight:500;color:#0009;text-align:center;background-color:#00000005;border-bottom:1px solid rgba(0,0,0,.12)}.time-scroll-container{flex:1;overflow-y:auto;padding:4px 0}.time-scroll-container::-webkit-scrollbar{width:6px}.time-scroll-container::-webkit-scrollbar-track{background:transparent}.time-scroll-container::-webkit-scrollbar-thumb{background:#0003;border-radius:3px}.time-scroll-container::-webkit-scrollbar-thumb:hover{background:#0000004d}.time-option{width:100%;padding:8px 12px;border:none;background:transparent;cursor:pointer;font-size:14px;color:#000000de;text-align:center;transition:background-color .2s ease}.time-option:hover{background-color:#0000000a}.time-option.selected{background-color:var(--grid-primary, #6750a4);color:#fff;font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type:
|
|
5378
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: TimePickerPanelComponent, isStandalone: true, selector: "eru-time-picker-panel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, hour: { classPropertyName: "hour", publicName: "hour", isSignal: true, isRequired: false, transformFunction: null }, minute: { classPropertyName: "minute", publicName: "minute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { timeSelected: "timeSelected", close: "close" }, ngImport: i0, template: "<div class=\"time-picker-panel\">\n <div class=\"time-picker-header\">\n <span class=\"time-picker-title\">Select Time</span>\n <button mat-icon-button class=\"close-button\" (click)=\"onClose()\" type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n \n <div class=\"time-picker-content\">\n <div class=\"time-column\">\n <div class=\"time-column-header\">Hour</div>\n <div class=\"time-scroll-container\">\n @for (hour of hours; track hour) {\n <button\n type=\"button\"\n class=\"time-option\"\n [class.selected]=\"isHourSelected(hour)\"\n (click)=\"onHourSelect(hour)\">\n {{formatNumber(hour)}}\n </button>\n }\n </div>\n </div>\n \n <div class=\"time-column\">\n <div class=\"time-column-header\">Minute</div>\n <div class=\"time-scroll-container\">\n @for (minute of minutes; track minute) {\n <button\n type=\"button\"\n class=\"time-option\"\n [class.selected]=\"isMinuteSelected(minute)\"\n (click)=\"onMinuteSelect(minute)\">\n {{formatNumber(minute)}}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n\n", styles: [".time-picker-panel{background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:200px;max-width:300px;display:flex;flex-direction:column;overflow:hidden}.time-picker-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid rgba(0,0,0,.12);background-color:#00000005}.time-picker-title{font-size:14px;font-weight:500;color:#000000de}.close-button{width:32px;height:32px;line-height:32px}.close-button mat-icon{font-size:18px;width:18px;height:18px}.time-picker-content{display:flex;max-height:300px;overflow:hidden}.time-column{flex:1;display:flex;flex-direction:column;border-right:1px solid rgba(0,0,0,.12)}.time-column:last-child{border-right:none}.time-column-header{padding:8px 12px;font-size:12px;font-weight:500;color:#0009;text-align:center;background-color:#00000005;border-bottom:1px solid rgba(0,0,0,.12)}.time-scroll-container{flex:1;overflow-y:auto;padding:4px 0}.time-scroll-container::-webkit-scrollbar{width:6px}.time-scroll-container::-webkit-scrollbar-track{background:transparent}.time-scroll-container::-webkit-scrollbar-thumb{background:#0003;border-radius:3px}.time-scroll-container::-webkit-scrollbar-thumb:hover{background:#0000004d}.time-option{width:100%;padding:8px 12px;border:none;background:transparent;cursor:pointer;font-size:14px;color:#000000de;text-align:center;transition:background-color .2s ease}.time-option:hover{background-color:#0000000a}.time-option.selected{background-color:var(--grid-primary, #6750a4);color:#fff;font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
5370
5379
|
}
|
|
5371
5380
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TimePickerPanelComponent, decorators: [{
|
|
5372
5381
|
type: Component,
|
|
@@ -5426,7 +5435,7 @@ class TimePickerComponent {
|
|
|
5426
5435
|
event.stopPropagation();
|
|
5427
5436
|
}
|
|
5428
5437
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5429
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: TimePickerComponent, isStandalone: true, selector: "eru-time-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "timeInput", first: true, predicate: ["timeInput"], descendants: true }], ngImport: i0, template: "<div class=\"time-picker-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field appearance=\"outline\" class=\"time-picker-field\">\n @if (label()) {\n <mat-label>{{label()}}</mat-label>\n }\n <input \n matInput \n type=\"text\"\n #timeInput\n [value]=\"value()\" \n (click)=\"onInputClick($event)\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n readonly>\n <mat-icon matSuffix (click)=\"onIconClick($event)\" class=\"time-picker-icon\">access_time</mat-icon>\n </mat-form-field>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"timeInput\"\n [cdkConnectedOverlayOpen]=\"isPanelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'time-picker-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick($event)\">\n <div \n class=\"time-picker-overlay\" \n (click)=\"onOverlayClick($event)\"\n (mousedown)=\"onOverlayClick($event)\">\n <eru-time-picker-panel\n [value]=\"value()\"\n (timeSelected)=\"onTimeSelected($event)\"\n (close)=\"onPanelClose()\">\n </eru-time-picker-panel>\n </div>\n </ng-template>\n</div>\n\n", styles: [":host{display:block;width:100%}.time-picker-container{width:100%;position:relative}.time-picker-field{width:100%}.time-picker-field .mat-mdc-form-field-subscript-wrapper{display:none}.time-picker-field input[type=text]{cursor:pointer}.time-picker-field .time-picker-icon{cursor:pointer;pointer-events:auto;-webkit-user-select:none;user-select:none;font-size:14px!important;width:14px!important;height:14px!important;line-height:14px!important;display:inline-flex;align-items:center;justify-content:center}.time-picker-field .time-picker-icon:hover{color:var(--grid-primary, #6750a4)}.time-picker-backdrop{background:transparent;pointer-events:auto}.time-picker-overlay{position:relative;z-index:1001;pointer-events:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type:
|
|
5438
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: TimePickerComponent, isStandalone: true, selector: "eru-time-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "timeInput", first: true, predicate: ["timeInput"], descendants: true }], ngImport: i0, template: "<div class=\"time-picker-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field appearance=\"outline\" class=\"time-picker-field\">\n @if (label()) {\n <mat-label>{{label()}}</mat-label>\n }\n <input \n matInput \n type=\"text\"\n #timeInput\n [value]=\"value()\" \n (click)=\"onInputClick($event)\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n readonly>\n <mat-icon matSuffix (click)=\"onIconClick($event)\" class=\"time-picker-icon\">access_time</mat-icon>\n </mat-form-field>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"timeInput\"\n [cdkConnectedOverlayOpen]=\"isPanelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'time-picker-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick($event)\">\n <div \n class=\"time-picker-overlay\" \n (click)=\"onOverlayClick($event)\"\n (mousedown)=\"onOverlayClick($event)\">\n <eru-time-picker-panel\n [value]=\"value()\"\n (timeSelected)=\"onTimeSelected($event)\"\n (close)=\"onPanelClose()\">\n </eru-time-picker-panel>\n </div>\n </ng-template>\n</div>\n\n", styles: [":host{display:block;width:100%}.time-picker-container{width:100%;position:relative}.time-picker-field{width:100%}.time-picker-field .mat-mdc-form-field-subscript-wrapper{display:none}.time-picker-field input[type=text]{cursor:pointer}.time-picker-field .time-picker-icon{cursor:pointer;pointer-events:auto;-webkit-user-select:none;user-select:none;font-size:14px!important;width:14px!important;height:14px!important;line-height:14px!important;display:inline-flex;align-items:center;justify-content:center}.time-picker-field .time-picker-icon:hover{color:var(--grid-primary, #6750a4)}.time-picker-backdrop{background:transparent;pointer-events:auto}.time-picker-overlay{position:relative;z-index:1001;pointer-events:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4$3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: TimePickerPanelComponent, selector: "eru-time-picker-panel", inputs: ["value", "hour", "minute"], outputs: ["timeSelected", "close"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
5430
5439
|
}
|
|
5431
5440
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TimePickerComponent, decorators: [{
|
|
5432
5441
|
type: Component,
|
|
@@ -5829,7 +5838,7 @@ class DurationComponent {
|
|
|
5829
5838
|
return num < 10 ? `0${num}` : `${num}`;
|
|
5830
5839
|
}
|
|
5831
5840
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DurationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5832
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: DurationComponent, isStandalone: true, selector: "eru-duration", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, ngImport: i0, template: "<div class=\"duration-overlay-container\">\n <div \n class=\"duration-cell-wrapper\"\n cdkOverlayOrigin \n #durationTrigger=\"cdkOverlayOrigin\"\n [class.duration-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n <div class=\"duration-display\">\n @if (isDrillable() && !isActive()) {\n <span class=\"duration-drillable\" (click)=\"onDrillableClick($event)\">{{getDisplayValue()}}</span>\n } @else {\n {{getDisplayValue()}}\n }\n </div>\n </div>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"durationTrigger\"\n [cdkConnectedOverlayOpen]=\"isOverlayOpen() && isActive()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'duration-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick()\">\n <div \n class=\"duration-editor\" \n (click)=\"onOverlayClick($event)\">\n <mat-tab-group \n [selectedIndex]=\"selectedTab()\" \n (selectedIndexChange)=\"onTabChange($event)\"\n class=\"duration-tabs\">\n <mat-tab label=\"Manual\">\n <div class=\"duration-tab-content\">\n <mat-form-field appearance=\"outline\" class=\"duration-input-field\">\n <mat-label>Minutes</mat-label>\n <input \n matInput \n type=\"number\" \n [ngModel]=\"manualMinutes()\" \n (ngModelChange)=\"onManualMinutesChange($event)\"\n [placeholder]=\"placeholder()\"\n min=\"0\">\n </mat-form-field>\n <div class=\"duration-preview\">\n {{formatDuration(manualMinutes())}}\n </div>\n </div>\n </mat-tab>\n \n <mat-tab label=\"Range\">\n <div class=\"duration-tab-content\">\n <div class=\"time-range-container\" (click)=\"$event.stopPropagation()\">\n <eru-time-picker\n [value]=\"startTime()\"\n [label]=\"'Start Time'\"\n (valueChange)=\"onStartTimeChange($event)\"\n class=\"time-picker-wrapper\">\n </eru-time-picker>\n \n <span class=\"time-separator\">-</span>\n \n <eru-time-picker\n [value]=\"endTime()\"\n [label]=\"'End Time'\"\n (valueChange)=\"onEndTimeChange($event)\"\n class=\"time-picker-wrapper\">\n </eru-time-picker>\n </div>\n <div class=\"duration-preview\">\n Duration: {{formatDuration(manualMinutes())}}\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </ng-template>\n</div>\n\n", styles: [":host{display:block;height:100%;width:100%}.duration-overlay-container{width:100%;height:100%}.duration-cell-wrapper{display:flex;align-items:center;justify-content:flex-start;height:100%;width:100%;padding:4px 8px;cursor:default}.duration-cell-wrapper.duration-display-editable{cursor:pointer}.duration-cell-wrapper.duration-display-editable:hover{background-color:#0000000a}.duration-display{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%}.duration-drillable{cursor:pointer;color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.duration-drillable:hover{color:var(--grid-primary, #6750a4);opacity:.8}.duration-backdrop{background:transparent}.duration-editor{background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:300px;padding:16px;position:relative;z-index:1000}.duration-tabs{margin-bottom:16px}.duration-tabs .mat-mdc-tab-header{border-bottom:1px solid rgba(0,0,0,.12)}.duration-tabs .mat-mdc-tab-label{min-width:80px}.duration-tab-content{padding:16px 0 8px;display:flex;flex-direction:column;gap:16px}.duration-input-field{width:100%}.duration-input-field .mat-mdc-form-field-subscript-wrapper{display:none}.time-range-container{display:flex;align-items:center;gap:12px;width:100%}.time-picker-wrapper{flex:1;min-width:0}.time-separator{font-size:18px;font-weight:500;color:#0009;flex-shrink:0}.duration-preview{padding:8px 12px;background-color:#0000000a;border-radius:4px;font-size:var(--grid-font-size-body, 12px);font-weight:500;color:#000000de;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i4$4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i4$4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type:
|
|
5841
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: DurationComponent, isStandalone: true, selector: "eru-duration", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, ngImport: i0, template: "<div class=\"duration-overlay-container\">\n <div \n class=\"duration-cell-wrapper\"\n cdkOverlayOrigin \n #durationTrigger=\"cdkOverlayOrigin\"\n [class.duration-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n <div class=\"duration-display\">\n @if (isDrillable() && !isActive()) {\n <span class=\"duration-drillable\" (click)=\"onDrillableClick($event)\">{{getDisplayValue()}}</span>\n } @else {\n {{getDisplayValue()}}\n }\n </div>\n </div>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"durationTrigger\"\n [cdkConnectedOverlayOpen]=\"isOverlayOpen() && isActive()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'duration-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick()\">\n <div \n class=\"duration-editor\" \n (click)=\"onOverlayClick($event)\">\n <mat-tab-group \n [selectedIndex]=\"selectedTab()\" \n (selectedIndexChange)=\"onTabChange($event)\"\n class=\"duration-tabs\">\n <mat-tab label=\"Manual\">\n <div class=\"duration-tab-content\">\n <mat-form-field appearance=\"outline\" class=\"duration-input-field\">\n <mat-label>Minutes</mat-label>\n <input \n matInput \n type=\"number\" \n [ngModel]=\"manualMinutes()\" \n (ngModelChange)=\"onManualMinutesChange($event)\"\n [placeholder]=\"placeholder()\"\n min=\"0\">\n </mat-form-field>\n <div class=\"duration-preview\">\n {{formatDuration(manualMinutes())}}\n </div>\n </div>\n </mat-tab>\n \n <mat-tab label=\"Range\">\n <div class=\"duration-tab-content\">\n <div class=\"time-range-container\" (click)=\"$event.stopPropagation()\">\n <eru-time-picker\n [value]=\"startTime()\"\n [label]=\"'Start Time'\"\n (valueChange)=\"onStartTimeChange($event)\"\n class=\"time-picker-wrapper\">\n </eru-time-picker>\n \n <span class=\"time-separator\">-</span>\n \n <eru-time-picker\n [value]=\"endTime()\"\n [label]=\"'End Time'\"\n (valueChange)=\"onEndTimeChange($event)\"\n class=\"time-picker-wrapper\">\n </eru-time-picker>\n </div>\n <div class=\"duration-preview\">\n Duration: {{formatDuration(manualMinutes())}}\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </ng-template>\n</div>\n\n", styles: [":host{display:block;height:100%;width:100%}.duration-overlay-container{width:100%;height:100%}.duration-cell-wrapper{display:flex;align-items:center;justify-content:flex-start;height:100%;width:100%;padding:4px 8px;cursor:default}.duration-cell-wrapper.duration-display-editable{cursor:pointer}.duration-cell-wrapper.duration-display-editable:hover{background-color:#0000000a}.duration-display{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%}.duration-drillable{cursor:pointer;color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.duration-drillable:hover{color:var(--grid-primary, #6750a4);opacity:.8}.duration-backdrop{background:transparent}.duration-editor{background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:300px;padding:16px;position:relative;z-index:1000}.duration-tabs{margin-bottom:16px}.duration-tabs .mat-mdc-tab-header{border-bottom:1px solid rgba(0,0,0,.12)}.duration-tabs .mat-mdc-tab-label{min-width:80px}.duration-tab-content{padding:16px 0 8px;display:flex;flex-direction:column;gap:16px}.duration-input-field{width:100%}.duration-input-field .mat-mdc-form-field-subscript-wrapper{display:none}.time-range-container{display:flex;align-items:center;gap:12px;width:100%}.time-picker-wrapper{flex:1;min-width:0}.time-separator{font-size:18px;font-weight:500;color:#0009;flex-shrink:0}.duration-preview{padding:8px 12px;background-color:#0000000a;border-radius:4px;font-size:var(--grid-font-size-body, 12px);font-weight:500;color:#000000de;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i4$4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i4$4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4$3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4$3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: TimePickerComponent, selector: "eru-time-picker", inputs: ["value", "label", "placeholder", "disabled"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
5833
5842
|
}
|
|
5834
5843
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DurationComponent, decorators: [{
|
|
5835
5844
|
type: Component,
|
|
@@ -6078,7 +6087,6 @@ class PhoneComponent {
|
|
|
6078
6087
|
const country = this.countryCodes().find(c => c.code === countryCode);
|
|
6079
6088
|
if (country) {
|
|
6080
6089
|
this.selectedCountry.set(country);
|
|
6081
|
-
console.log('selectedCountry', this.selectedCountry());
|
|
6082
6090
|
this.countrySearchText.set('');
|
|
6083
6091
|
// Update the value when country changes
|
|
6084
6092
|
const phoneNum = this.phoneNumber();
|
|
@@ -6142,7 +6150,6 @@ class PhoneComponent {
|
|
|
6142
6150
|
phoneInput.setSelectionRange(0, 0);
|
|
6143
6151
|
}
|
|
6144
6152
|
catch (error) {
|
|
6145
|
-
console.log("Could not set cursor position:", error);
|
|
6146
6153
|
}
|
|
6147
6154
|
}
|
|
6148
6155
|
else if (attempts < maxAttempts) {
|
|
@@ -6173,7 +6180,7 @@ class PhoneComponent {
|
|
|
6173
6180
|
}
|
|
6174
6181
|
}
|
|
6175
6182
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PhoneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6176
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PhoneComponent, isStandalone: true, selector: "eru-phone", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultCountry: { classPropertyName: "defaultCountry", publicName: "defaultCountry", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "phoneContainer", first: true, predicate: ["phoneContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field\n appearance=\"outline\"\n class=\"phone-form-field\"\n [class.phone-form-field-focused]=\"isFocused()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div class=\"phone-input-container\" #phoneContainer>\n <mat-select\n class=\"country-select\"\n panelClass=\"country-select-panel\"\n [value]=\"selectedCountry().code\"\n [disabled]=\"!isEditable()\"\n (selectionChange)=\"onCountryChange($event.value)\"\n (openedChange)=\"onCountrySelectOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n <mat-select-trigger>\n <span class=\"country-option\">\n <span class=\"country-flag\">{{ displayFlag(selectedCountry()) }}</span>\n <span class=\"country-dial-code\">{{ selectedCountry().dial_code }}</span>\n </span>\n </mat-select-trigger>\n <mat-option disabled class=\"search-option\">\n <mat-form-field\n [appearance]=\"'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"countrySearchText()\"\n (input)=\"onCountrySearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n @for (country of filteredCountries(); track country.code) {\n <mat-option [value]=\"country.code\">\n <span class=\"country-option\">\n <span class=\"country-flag\">{{ displayFlag(country) }}</span>\n <span class=\"country-dial-code\">{{ country.dial_code }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n <input\n matInput\n type=\"tel\"\n class=\"phone-input\"\n placeholder=\"\"\n [value]=\"phoneNumber()\"\n (input)=\"onPhoneNumberInput($event)\"\n (focus)=\"onInputFocus($event)\"\n (blur)=\"onInputBlur($event)\"\n (click)=\"$event.stopPropagation()\">\n </div>\n </mat-form-field>\n} @else {\n <div class=\"phone-display\" \n [class.phone-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"phone-drillable\" (click)=\"onDrillableClick($event)\"><div class=\"phone-display-content\">\n <span class=\"phone-flag-display\">{{getDisplayFlag()}}</span> \n <span class=\"phone-number-display\">{{getDisplayPhoneNumber()}}</span>\n </div></span>\n } @else {\n <div class=\"phone-display-content\">\n <span class=\"phone-flag-display\">{{getDisplayFlag()}}</span> \n <span class=\"phone-number-display\">{{getDisplayPhoneNumber()}}</span>\n </div>\n }\n </div>\n}\n\n", styles: [":host{display:block;height:100%;width:100%}.phone-form-field{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.phone-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__leading,.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__trailing{border-color:var(--grid-primary, #6750a4)!important;border-width:2px!important}.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch{border-right:none!important;border-left:none!important}.phone-form-field.phone-form-field-focused .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__leading,.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__trailing,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__leading,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__trailing{border-color:var(--grid-primary, #6750a4)!important;border-width:2px!important}.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch{border-right:none!important;border-left:none!important}.phone-input-container{display:flex;align-items:center;gap:8px;width:100%}.country-select{min-width:60px;max-width:60px;width:60px}.country-option{display:flex;align-items:center;gap:2px}mat-option .country-option{display:flex;align-items:center}mat-option .country-option{display:flex!important;align-items:center!important;gap:8px!important}.country-flag{font-size:var(--grid-font-size-body, 12px)!important;display:inline-block;line-height:1;padding-left:2px;vertical-align:middle;font-family:var(--flag-font-stack)!important;unicode-bidi:isolate;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:normal;font-variant-emoji:emoji;isolation:isolate}.country-dial-code{font-weight:500}.phone-input{flex:1}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mdc-list-item__primary-text{opacity:1!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-input::placeholder{color:#0009}[dir=rtl] .search-input::placeholder{color:#0009}.phone-number-display{font-family:var(--grid-font-family, \"Poppins\")!important}.phone-display{width:100%!important;height:100%!important;min-height:20px!important;display:block!important;padding:4px 8px!important;font-family:var(--flag-font-stack, --grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;color:var(--grid-on-surface, #1d1b20)!important;background:transparent!important;border:none!important;outline:none!important;text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;box-sizing:border-box!important;transition:background-color .2s ease!important;line-height:1.4!important;text-align:left!important}.phone-display>.phone-drillable{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.phone-display-content{display:flex!important;align-items:center!important;gap:4px!important;width:100%!important;overflow:hidden!important}.phone-display-content .phone-flag-display{flex-shrink:0!important;display:inline-block!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:1!important;vertical-align:middle!important;font-family:var(--flag-font-stack)!important;unicode-bidi:isolate!important;text-rendering:optimizeLegibility!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;font-feature-settings:normal!important;font-variant-emoji:emoji!important;isolation:isolate!important}.phone-display-content .phone-number-display{flex:1!important;min-width:0!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;font-family:var(--grid-font-family, \"Poppins\")!important}.phone-display-editable{cursor:pointer!important}.phone-drillable{color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease;cursor:pointer;padding:4px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i2$1.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i2$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6183
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PhoneComponent, isStandalone: true, selector: "eru-phone", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultCountry: { classPropertyName: "defaultCountry", publicName: "defaultCountry", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "phoneContainer", first: true, predicate: ["phoneContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field\n appearance=\"outline\"\n class=\"phone-form-field\"\n [class.phone-form-field-focused]=\"isFocused()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div class=\"phone-input-container\" #phoneContainer>\n <mat-select\n class=\"country-select\"\n panelClass=\"country-select-panel\"\n [value]=\"selectedCountry().code\"\n [disabled]=\"!isEditable()\"\n (selectionChange)=\"onCountryChange($event.value)\"\n (openedChange)=\"onCountrySelectOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n <mat-select-trigger>\n <span class=\"country-option\">\n <span class=\"country-flag\">{{ displayFlag(selectedCountry()) }}</span>\n <span class=\"country-dial-code\">{{ selectedCountry().dial_code }}</span>\n </span>\n </mat-select-trigger>\n <mat-option disabled class=\"search-option\">\n <mat-form-field\n [appearance]=\"'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"countrySearchText()\"\n (input)=\"onCountrySearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n @for (country of filteredCountries(); track country.code) {\n <mat-option [value]=\"country.code\">\n <span class=\"country-option\">\n <span class=\"country-flag\">{{ displayFlag(country) }}</span>\n <span class=\"country-dial-code\">{{ country.dial_code }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n <input\n matInput\n type=\"tel\"\n class=\"phone-input\"\n placeholder=\"\"\n [value]=\"phoneNumber()\"\n (input)=\"onPhoneNumberInput($event)\"\n (focus)=\"onInputFocus($event)\"\n (blur)=\"onInputBlur($event)\"\n (click)=\"$event.stopPropagation()\">\n </div>\n </mat-form-field>\n} @else {\n <div class=\"phone-display\" \n [class.phone-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"phone-drillable\" (click)=\"onDrillableClick($event)\"><div class=\"phone-display-content\">\n <span class=\"phone-flag-display\">{{getDisplayFlag()}}</span> \n <span class=\"phone-number-display\">{{getDisplayPhoneNumber()}}</span>\n </div></span>\n } @else {\n <div class=\"phone-display-content\">\n <span class=\"phone-flag-display\">{{getDisplayFlag()}}</span> \n <span class=\"phone-number-display\">{{getDisplayPhoneNumber()}}</span>\n </div>\n }\n </div>\n}\n\n", styles: [":host{display:block;height:100%;width:100%}.phone-form-field{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.phone-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__leading,.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__trailing{border-color:var(--grid-primary, #6750a4)!important;border-width:2px!important}.phone-form-field.phone-form-field-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch{border-right:none!important;border-left:none!important}.phone-form-field.phone-form-field-focused .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__leading,.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__trailing,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__leading,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__trailing{border-color:var(--grid-primary, #6750a4)!important;border-width:2px!important}.phone-form-field.mat-focused .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch,.phone-form-field.mat-form-field-should-float .mat-mdc-text-field-wrapper .mdc-notched-outline .mdc-notched-outline__notch{border-right:none!important;border-left:none!important}.phone-input-container{display:flex;align-items:center;gap:8px;width:100%}.country-select{min-width:60px;max-width:60px;width:60px}.country-option{display:flex;align-items:center;gap:2px}mat-option .country-option{display:flex;align-items:center}mat-option .country-option{display:flex!important;align-items:center!important;gap:8px!important}.country-flag{font-size:var(--grid-font-size-body, 12px)!important;display:inline-block;line-height:1;padding-left:2px;vertical-align:middle;font-family:var(--flag-font-stack)!important;unicode-bidi:isolate;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:normal;font-variant-emoji:emoji;isolation:isolate}.country-dial-code{font-weight:500}.phone-input{flex:1}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mdc-list-item__primary-text{opacity:1!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-input::placeholder{color:#0009}[dir=rtl] .search-input::placeholder{color:#0009}.phone-number-display{font-family:var(--grid-font-family, \"Poppins\")!important}.phone-display{width:100%!important;height:100%!important;min-height:20px!important;display:block!important;padding:4px 8px!important;font-family:var(--flag-font-stack, --grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;color:var(--grid-on-surface, #1d1b20)!important;background:transparent!important;border:none!important;outline:none!important;text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;box-sizing:border-box!important;transition:background-color .2s ease!important;line-height:1.4!important;text-align:left!important}.phone-display>.phone-drillable{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.phone-display-content{display:flex!important;align-items:center!important;gap:4px!important;width:100%!important;overflow:hidden!important}.phone-display-content .phone-flag-display{flex-shrink:0!important;display:inline-block!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:1!important;vertical-align:middle!important;font-family:var(--flag-font-stack)!important;unicode-bidi:isolate!important;text-rendering:optimizeLegibility!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;font-feature-settings:normal!important;font-variant-emoji:emoji!important;isolation:isolate!important}.phone-display-content .phone-number-display{flex:1!important;min-width:0!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;font-family:var(--grid-font-family, \"Poppins\")!important}.phone-display-editable{cursor:pointer!important}.phone-drillable{color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease;cursor:pointer;padding:4px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i2$2.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6177
6184
|
}
|
|
6178
6185
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PhoneComponent, decorators: [{
|
|
6179
6186
|
type: Component,
|
|
@@ -6284,11 +6291,11 @@ class ProgressComponent {
|
|
|
6284
6291
|
return cfg[property];
|
|
6285
6292
|
}
|
|
6286
6293
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6287
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.2", type: ProgressComponent, isStandalone: true, selector: "eru-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, ngImport: i0, template: "<div class=\"progress-input-container\" [class.disabled]=\"!isActive()\" (dblclick)=\"onActivate(); $event.stopPropagation()\">\n <span class=\"progress-value\">{{displayValue()}}%</span>\n <mat-slider \n class=\"progress-slider\" \n [min]=\"0\" \n [max]=\"100\" \n [step]=\"1\" \n [discrete]=\"true\" \n [showTickMarks]=\"true\"\n [disabled]=\"!isActive()\">\n <input \n matSliderThumb \n [ngModel]=\"displayValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n (blur)=\"onBlur()\"\n [disabled]=\"!isActive()\">\n </mat-slider>\n</div>\n\n", styles: [":root{--mat-slider-with-overlap-handle-outline-color: var(--grid-primary, #6750a4) !important;--mat-slider-with-tick-marks-active-container-color: var(--grid-primary, #6750a4) !important;--mat-slider-handle-height: 12px;--mat-slider-handle-width: 12px;--mat-slider-disabled-active-track-color: var(--grid-primary, #6750a4);--mat-slider-active-track-color: var(--grid-primary, #6750a4)}:host{display:block;height:100%;width:100%}.progress-bar-container{width:100%;height:100%;min-height:30px;position:relative;background:#e0e0e0;border-radius:4px;cursor:pointer}.progress-bar{height:100%;background:var(--grid-primary, #6750a4);transition:width .3s;border-radius:4px}.progress-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);pointer-events:none;z-index:1}.drillable-value{color:inherit;text-decoration:underline;cursor:pointer;pointer-events:auto}.drillable-value:hover{opacity:.8}.progress-input-container{display:flex;flex-direction:row-reverse;align-items:center;padding:4px;width:100%;box-sizing:border-box;overflow:visible}.progress-input-container.disabled{cursor:pointer}.progress-input-container.disabled .progress-slider{pointer-events:none}.progress-value{font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);flex:0 0 auto;min-width:35px;text-align:right;white-space:nowrap;flex-shrink:0}.progress-slider{flex:1 1 0%;min-width:0!important;max-width:100%!important;overflow:visible}.progress-slider .mdc-slider__track{left:0!important}.progress-slider .mdc-slider{padding-left:0!important;margin-left:0!important}.progress-slider .mdc-slider__value-indicator,.progress-slider .mdc-slider__value-indicator-container{display:none!important;visibility:hidden!important}.progress-slider .mdc-slider__thumb:before,.progress-slider .mdc-slider__thumb:after{display:none!important;content:none!important}.progress-slider .mdc-slider__thumb-knob:before,.progress-slider .mdc-slider__thumb-knob:after{display:none!important;content:none!important}.progress-slider [class*=value-indicator],.progress-slider [class*=tooltip]{display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i2$
|
|
6294
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.2", type: ProgressComponent, isStandalone: true, selector: "eru-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, ngImport: i0, template: "<div class=\"progress-input-container\" [class.disabled]=\"!isActive()\" (dblclick)=\"onActivate(); $event.stopPropagation()\">\n <span class=\"progress-value\">{{displayValue()}}%</span>\n <mat-slider \n class=\"progress-slider\" \n [min]=\"0\" \n [max]=\"100\" \n [step]=\"1\" \n [discrete]=\"true\" \n [showTickMarks]=\"true\"\n [disabled]=\"!isActive()\">\n <input \n matSliderThumb \n [ngModel]=\"displayValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n (blur)=\"onBlur()\"\n [disabled]=\"!isActive()\">\n </mat-slider>\n</div>\n\n", styles: [":root{--mat-slider-with-overlap-handle-outline-color: var(--grid-primary, #6750a4) !important;--mat-slider-with-tick-marks-active-container-color: var(--grid-primary, #6750a4) !important;--mat-slider-handle-height: 12px;--mat-slider-handle-width: 12px;--mat-slider-disabled-active-track-color: var(--grid-primary, #6750a4);--mat-slider-active-track-color: var(--grid-primary, #6750a4)}:host{display:block;height:100%;width:100%}.progress-bar-container{width:100%;height:100%;min-height:30px;position:relative;background:#e0e0e0;border-radius:4px;cursor:pointer}.progress-bar{height:100%;background:var(--grid-primary, #6750a4);transition:width .3s;border-radius:4px}.progress-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);pointer-events:none;z-index:1}.drillable-value{color:inherit;text-decoration:underline;cursor:pointer;pointer-events:auto}.drillable-value:hover{opacity:.8}.progress-input-container{display:flex;flex-direction:row-reverse;align-items:center;padding:4px;width:100%;box-sizing:border-box;overflow:visible;max-height:30px}.progress-input-container.disabled{cursor:pointer}.progress-input-container.disabled .progress-slider{pointer-events:none}.progress-value{font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);flex:0 0 auto;min-width:35px;text-align:right;white-space:nowrap;flex-shrink:0}.progress-slider{flex:1 1 0%;min-width:0!important;max-width:100%!important;overflow:visible}.progress-slider .mdc-slider__track{left:0!important}.progress-slider .mdc-slider{padding-left:0!important;margin-left:0!important}.progress-slider .mdc-slider__value-indicator,.progress-slider .mdc-slider__value-indicator-container{display:none!important;visibility:hidden!important}.progress-slider .mdc-slider__thumb:before,.progress-slider .mdc-slider__thumb:after{display:none!important;content:none!important}.progress-slider .mdc-slider__thumb-knob:before,.progress-slider .mdc-slider__thumb-knob:after{display:none!important;content:none!important}.progress-slider [class*=value-indicator],.progress-slider [class*=tooltip]{display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i2$3.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i2$3.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6288
6295
|
}
|
|
6289
6296
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ProgressComponent, decorators: [{
|
|
6290
6297
|
type: Component,
|
|
6291
|
-
args: [{ selector: 'eru-progress', standalone: true, imports: [FormsModule, MatSliderModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"progress-input-container\" [class.disabled]=\"!isActive()\" (dblclick)=\"onActivate(); $event.stopPropagation()\">\n <span class=\"progress-value\">{{displayValue()}}%</span>\n <mat-slider \n class=\"progress-slider\" \n [min]=\"0\" \n [max]=\"100\" \n [step]=\"1\" \n [discrete]=\"true\" \n [showTickMarks]=\"true\"\n [disabled]=\"!isActive()\">\n <input \n matSliderThumb \n [ngModel]=\"displayValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n (blur)=\"onBlur()\"\n [disabled]=\"!isActive()\">\n </mat-slider>\n</div>\n\n", styles: [":root{--mat-slider-with-overlap-handle-outline-color: var(--grid-primary, #6750a4) !important;--mat-slider-with-tick-marks-active-container-color: var(--grid-primary, #6750a4) !important;--mat-slider-handle-height: 12px;--mat-slider-handle-width: 12px;--mat-slider-disabled-active-track-color: var(--grid-primary, #6750a4);--mat-slider-active-track-color: var(--grid-primary, #6750a4)}:host{display:block;height:100%;width:100%}.progress-bar-container{width:100%;height:100%;min-height:30px;position:relative;background:#e0e0e0;border-radius:4px;cursor:pointer}.progress-bar{height:100%;background:var(--grid-primary, #6750a4);transition:width .3s;border-radius:4px}.progress-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);pointer-events:none;z-index:1}.drillable-value{color:inherit;text-decoration:underline;cursor:pointer;pointer-events:auto}.drillable-value:hover{opacity:.8}.progress-input-container{display:flex;flex-direction:row-reverse;align-items:center;padding:4px;width:100%;box-sizing:border-box;overflow:visible}.progress-input-container.disabled{cursor:pointer}.progress-input-container.disabled .progress-slider{pointer-events:none}.progress-value{font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);flex:0 0 auto;min-width:35px;text-align:right;white-space:nowrap;flex-shrink:0}.progress-slider{flex:1 1 0%;min-width:0!important;max-width:100%!important;overflow:visible}.progress-slider .mdc-slider__track{left:0!important}.progress-slider .mdc-slider{padding-left:0!important;margin-left:0!important}.progress-slider .mdc-slider__value-indicator,.progress-slider .mdc-slider__value-indicator-container{display:none!important;visibility:hidden!important}.progress-slider .mdc-slider__thumb:before,.progress-slider .mdc-slider__thumb:after{display:none!important;content:none!important}.progress-slider .mdc-slider__thumb-knob:before,.progress-slider .mdc-slider__thumb-knob:after{display:none!important;content:none!important}.progress-slider [class*=value-indicator],.progress-slider [class*=tooltip]{display:none!important}\n"] }]
|
|
6298
|
+
args: [{ selector: 'eru-progress', standalone: true, imports: [FormsModule, MatSliderModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"progress-input-container\" [class.disabled]=\"!isActive()\" (dblclick)=\"onActivate(); $event.stopPropagation()\">\n <span class=\"progress-value\">{{displayValue()}}%</span>\n <mat-slider \n class=\"progress-slider\" \n [min]=\"0\" \n [max]=\"100\" \n [step]=\"1\" \n [discrete]=\"true\" \n [showTickMarks]=\"true\"\n [disabled]=\"!isActive()\">\n <input \n matSliderThumb \n [ngModel]=\"displayValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n (blur)=\"onBlur()\"\n [disabled]=\"!isActive()\">\n </mat-slider>\n</div>\n\n", styles: [":root{--mat-slider-with-overlap-handle-outline-color: var(--grid-primary, #6750a4) !important;--mat-slider-with-tick-marks-active-container-color: var(--grid-primary, #6750a4) !important;--mat-slider-handle-height: 12px;--mat-slider-handle-width: 12px;--mat-slider-disabled-active-track-color: var(--grid-primary, #6750a4);--mat-slider-active-track-color: var(--grid-primary, #6750a4)}:host{display:block;height:100%;width:100%}.progress-bar-container{width:100%;height:100%;min-height:30px;position:relative;background:#e0e0e0;border-radius:4px;cursor:pointer}.progress-bar{height:100%;background:var(--grid-primary, #6750a4);transition:width .3s;border-radius:4px}.progress-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);pointer-events:none;z-index:1}.drillable-value{color:inherit;text-decoration:underline;cursor:pointer;pointer-events:auto}.drillable-value:hover{opacity:.8}.progress-input-container{display:flex;flex-direction:row-reverse;align-items:center;padding:4px;width:100%;box-sizing:border-box;overflow:visible;max-height:30px}.progress-input-container.disabled{cursor:pointer}.progress-input-container.disabled .progress-slider{pointer-events:none}.progress-value{font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1d1b20);flex:0 0 auto;min-width:35px;text-align:right;white-space:nowrap;flex-shrink:0}.progress-slider{flex:1 1 0%;min-width:0!important;max-width:100%!important;overflow:visible}.progress-slider .mdc-slider__track{left:0!important}.progress-slider .mdc-slider{padding-left:0!important;margin-left:0!important}.progress-slider .mdc-slider__value-indicator,.progress-slider .mdc-slider__value-indicator-container{display:none!important;visibility:hidden!important}.progress-slider .mdc-slider__thumb:before,.progress-slider .mdc-slider__thumb:after{display:none!important;content:none!important}.progress-slider .mdc-slider__thumb-knob:before,.progress-slider .mdc-slider__thumb-knob:after{display:none!important;content:none!important}.progress-slider [class*=value-indicator],.progress-slider [class*=tooltip]{display:none!important}\n"] }]
|
|
6292
6299
|
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], isEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isEditable", required: false }] }], isActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "isActive", required: false }] }], isDrillable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDrillable", required: false }] }], columnWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnWidth", required: false }] }], fieldSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldSize", required: false }] }], eruGridStore: [{ type: i0.Input, args: [{ isSignal: true, alias: "eruGridStore", required: false }] }], valueChange: [{
|
|
6293
6300
|
type: Output
|
|
6294
6301
|
}], blur: [{
|
|
@@ -6687,8 +6694,11 @@ class SelectComponent {
|
|
|
6687
6694
|
const option = filteredOpts.find(opt => opt.value === value);
|
|
6688
6695
|
return option ? option.label : String(value);
|
|
6689
6696
|
}
|
|
6697
|
+
trackByValueAndIndex(index, option) {
|
|
6698
|
+
return `${option?.value || ''}_${index}`;
|
|
6699
|
+
}
|
|
6690
6700
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6691
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: SelectComponent, isStandalone: true, selector: "eru-select", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"select-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"select-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"multiple()\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"select-panel\"\n class=\"select-input\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n @if (multiple()) {\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n }\n </mat-option>\n\n @for (option of filteredOptions(); track option.value) {\n @if (multiple()) {\n <mat-option [value]=\"option.value\" (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n {{ option.label }}\n </mat-option>\n } @else {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"select-display\" \n [class.select-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"select-drillable\" (click)=\"onDrillableClick($event)\">\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n </span>\n } @else {\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n }\n </div>\n}\n\n", styles: [".select-form-field{width:100%}.select-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.select-container{width:100%}.select-display{width:100%;padding:8px 12px;min-height:40px;display:flex;align-items:center;cursor:default}.select-display.select-display-editable{cursor:pointer}.select-display.select-display-editable:hover{background-color:#0000000a}.select-drillable{color:#1976d2;cursor:pointer;text-decoration:underline}.select-drillable:hover{color:#1565c0}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.select-panel{min-width:200px!important}.select-input{padding-left:4px}.select-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.select-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.select-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6701
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: SelectComponent, isStandalone: true, selector: "eru-select", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n<mat-form-field [appearance]=\"getProperty('appearance') || 'outline'\" class=\"select-form-field\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"select-container\">\n <mat-select [placeholder]=\"getProperty('placeholder') || ''\" [multiple]=\"multiple()\"\n [disabled]=\"getProperty('disabled') || !isEditable()\" [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\" [compareWith]=\"compareWith\" panelClass=\"select-panel\" class=\"select-input\"\n (selectionChange)=\"onValueChange($event.value)\" (blur)=\"onBlur($event)\" (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n\n <mat-option disabled class=\"search-option\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field [appearance]=\"getProperty('appearance') || 'outline'\" class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input matInput type=\"text\" class=\"search-input\" placeholder=\"filter options...\" [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n @if (multiple()) {\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox [checked]=\"isAllSelected()\" [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n }\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n @if (multiple()) {\n <mat-option [value]=\"option.value\" (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n {{ option.label }}\n </mat-option>\n } @else {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n }\n </mat-select>\n </div>\n</mat-form-field>\n} @else {\n<div class=\"select-display\" [class.select-display-editable]=\"isEditable()\" (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"select-drillable\" (click)=\"onDrillableClick($event)\">\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n </span>\n } @else {\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n }\n</div>\n}", styles: [".select-form-field{width:100%}.select-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.select-container{width:100%}.select-display{width:100%;padding:8px 12px;min-height:30px;display:flex;align-items:center;cursor:default}.select-display.select-display-editable{cursor:pointer}.select-display.select-display-editable:hover{background-color:#0000000a}.select-drillable{color:#1976d2;cursor:pointer;text-decoration:underline}.select-drillable:hover{color:#1565c0}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.select-panel{min-width:200px!important}.select-input{padding-left:4px}.select-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.select-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.select-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6692
6702
|
}
|
|
6693
6703
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SelectComponent, decorators: [{
|
|
6694
6704
|
type: Component,
|
|
@@ -6699,7 +6709,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
6699
6709
|
MatInputModule,
|
|
6700
6710
|
MatOptionModule,
|
|
6701
6711
|
MatCheckboxModule
|
|
6702
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n
|
|
6712
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n<mat-form-field [appearance]=\"getProperty('appearance') || 'outline'\" class=\"select-form-field\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"select-container\">\n <mat-select [placeholder]=\"getProperty('placeholder') || ''\" [multiple]=\"multiple()\"\n [disabled]=\"getProperty('disabled') || !isEditable()\" [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\" [compareWith]=\"compareWith\" panelClass=\"select-panel\" class=\"select-input\"\n (selectionChange)=\"onValueChange($event.value)\" (blur)=\"onBlur($event)\" (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n\n <mat-option disabled class=\"search-option\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field [appearance]=\"getProperty('appearance') || 'outline'\" class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input matInput type=\"text\" class=\"search-input\" placeholder=\"filter options...\" [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n @if (multiple()) {\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox [checked]=\"isAllSelected()\" [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n }\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n @if (multiple()) {\n <mat-option [value]=\"option.value\" (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n {{ option.label }}\n </mat-option>\n } @else {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n }\n </mat-select>\n </div>\n</mat-form-field>\n} @else {\n<div class=\"select-display\" [class.select-display-editable]=\"isEditable()\" (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"select-drillable\" (click)=\"onDrillableClick($event)\">\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n </span>\n } @else {\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n }\n</div>\n}", styles: [".select-form-field{width:100%}.select-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.select-container{width:100%}.select-display{width:100%;padding:8px 12px;min-height:30px;display:flex;align-items:center;cursor:default}.select-display.select-display-editable{cursor:pointer}.select-display.select-display-editable:hover{background-color:#0000000a}.select-drillable{color:#1976d2;cursor:pointer;text-decoration:underline}.select-drillable:hover{color:#1565c0}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.select-panel{min-width:200px!important}.select-input{padding-left:4px}.select-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.select-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.select-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important}\n"] }]
|
|
6703
6713
|
}], ctorParameters: () => [], propDecorators: { selectContainer: [{
|
|
6704
6714
|
type: ViewChild,
|
|
6705
6715
|
args: ['selectContainer', { static: false }]
|
|
@@ -6979,7 +6989,7 @@ class StatusComponent {
|
|
|
6979
6989
|
return `#${toHex(darkerR)}${toHex(darkerG)}${toHex(darkerB)}`;
|
|
6980
6990
|
}
|
|
6981
6991
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: StatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6982
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: StatusComponent, isStandalone: true, selector: "eru-status", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"status-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"status-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || 'Select status...'\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"status-panel\"\n class=\"status-input\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <mat-option [value]=\"null\">\n None\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"status-option-content\">\n @if(option.color) {\n <span class=\"status-option-indicator\" \n [style.background-color]=\"option.color\"\n [style.border-color]=\"getDarkerColor(option.color)\"></span>\n }\n <span class=\"status-option-label\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n @if(currentValue()) {\n <div \n class=\"status-display\"\n [style.background-color]=\"statusColors().background\"\n [style.border-color]=\"statusColors().border\"\n [style.color]=\"statusColors().text\"\n (dblclick)=\"onActivate()\">\n <div class=\"status-display-content\">\n @if (isDrillable()) {\n <span class=\"status-text drillable-value\" (click)=\"onDrillableClick($event)\">\n {{statusDisplay().text}}\n </span>\n } @else {\n <span class=\"status-text\">\n {{statusDisplay().text}}\n </span>\n }\n </div>\n </div>\n } @else {\n <div class=\"status-empty\" (dblclick)=\"onActivate()\"></div>\n }\n}\n\n", styles: [".status-form-field{width:100%}.status-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.status-input{padding-left:4px}.status-container{width:100%}.status-empty{width:100%;min-height:30px;cursor:pointer}.status-display{cursor:pointer;width:100%;min-height:30px;border-radius:4px;border:2px solid;transition:all .2s ease;display:flex;align-items:center;justify-content:center;padding:0 12px;box-sizing:border-box;cursor:default}.status-display:hover{opacity:.9}.status-display-content{cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px;width:100%}.status-text{text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-color-indicator{width:12px;height:12px;border-radius:50%;display:inline-block;flex-shrink:0}.drillable-value{color:inherit;text-decoration:underline;cursor:pointer}.drillable-value:hover{opacity:.8}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important;display:flex!important;flex-direction:column!important;gap:8px!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.status-panel{min-width:150px!important}.status-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.status-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.status-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:last-of-type mat-pseudo-checkbox,.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .status-option-content{display:flex;align-items:center;gap:8px;width:100%}mat-option .status-option-indicator{width:12px;height:12px;border-radius:50%;display:inline-block;flex-shrink:0;border:1.5px solid}mat-option .status-option-label{flex:1;color:var(--grid-on-surface, #1d1b20);font-size:var(--grid-font-size-body, 12px);font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6992
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: StatusComponent, isStandalone: true, selector: "eru-status", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"status-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"status-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || 'Select status...'\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"status-panel\"\n class=\"status-input\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <mat-option [value]=\"null\">\n None\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"status-option-content\">\n @if(option.color) {\n <span class=\"status-option-indicator\" \n [style.background-color]=\"option.color\"\n [style.border-color]=\"getDarkerColor(option.color)\"></span>\n }\n <span class=\"status-option-label\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n @if(currentValue()) {\n <div \n class=\"status-display\"\n [style.background-color]=\"statusColors().background\"\n [style.border-color]=\"statusColors().border\"\n [style.color]=\"statusColors().text\"\n (dblclick)=\"onActivate()\">\n <div class=\"status-display-content\">\n @if (isDrillable()) {\n <span class=\"status-text drillable-value\" (click)=\"onDrillableClick($event)\">\n {{statusDisplay().text}}\n </span>\n } @else {\n <span class=\"status-text\">\n {{statusDisplay().text}}\n </span>\n }\n </div>\n </div>\n } @else {\n <div class=\"status-empty\" (dblclick)=\"onActivate()\"></div>\n }\n}\n\n", styles: [".status-form-field{width:100%}.status-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.status-input{padding-left:4px}.status-container{width:100%}.status-empty{width:100%;min-height:30px;cursor:pointer}.status-display{cursor:pointer;width:100%;min-height:30px;border-radius:4px;border:2px solid;transition:all .2s ease;display:flex;align-items:center;justify-content:center;padding:0 12px;box-sizing:border-box;cursor:default}.status-display:hover{opacity:.9}.status-display-content{cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px;width:100%}.status-text{text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-color-indicator{width:12px;height:12px;border-radius:50%;display:inline-block;flex-shrink:0}.drillable-value{color:inherit;text-decoration:underline;cursor:pointer}.drillable-value:hover{opacity:.8}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important;display:flex!important;flex-direction:column!important;gap:8px!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.status-panel{min-width:150px!important}.status-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.status-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.status-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:last-of-type mat-pseudo-checkbox,.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .status-option-content{display:flex;align-items:center;gap:8px;width:100%}mat-option .status-option-indicator{width:12px;height:12px;border-radius:50%;display:inline-block;flex-shrink:0;border:1.5px solid}mat-option .status-option-label{flex:1;color:var(--grid-on-surface, #1d1b20);font-size:var(--grid-font-size-body, 12px);font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
6983
6993
|
}
|
|
6984
6994
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: StatusComponent, decorators: [{
|
|
6985
6995
|
type: Component,
|
|
@@ -7336,7 +7346,7 @@ class TagComponent {
|
|
|
7336
7346
|
this.newTagColor.set('#cccccc');
|
|
7337
7347
|
}
|
|
7338
7348
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
7339
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: TagComponent, isStandalone: true, selector: "eru-tag", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange", newTagAdded: "newTagAdded" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"tag-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"tag-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"true\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"tag-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"tag-option\" \n [style.background]=\"getTagColor(option.value).background\" \n [style.color]=\"getTagColor(option.value).color\">\n {{ option.label }}\n </span>\n </mat-option>\n }\n\n <mat-option class=\"add-tag-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"add-tag-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"add-tag-form-field\">\n <mat-label>Add new tag</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"add-tag-input\"\n placeholder=\"Enter tag name...\"\n [value]=\"newTagInput()\"\n (input)=\"onNewTagInputChange($any($event.target).value)\"\n (keydown.enter)=\"addNewTag()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"add-tag-actions\">\n <input\n type=\"color\"\n class=\"add-tag-color-picker\"\n [value]=\"newTagColor()\"\n (input)=\"onNewTagColorChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n title=\"Select tag color\">\n <button\n mat-icon-button\n class=\"add-tag-button\"\n [disabled]=\"!canAddNewTag()\"\n (click)=\"addNewTag(); $event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </mat-option>\n\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"tag-display\" \n [class.tag-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n </span>\n } @else {\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag-more\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n }\n </div>\n}\n\n", styles: [".tag-form-field{width:100%}.tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.tag-container{width:100%}.tag-display{width:100%;padding:8px 12px;min-height:40px;display:flex;flex-wrap:wrap;align-items:center;gap:4px;cursor:default}.tag-display.tag-display-editable{cursor:pointer}.tag-display.tag-display-editable:hover{background-color:#0000000a}.tag{display:inline-block;padding:8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}.tag-more{display:inline-block;border-radius:12px;background-color:var(--grid-surface-container-high, #f5f5f5);color:var(--grid-on-surface-variant, #49454f);font-size:var(--grid-font-size-body, 12px);font-weight:700;font-style:italic;padding:8px;white-space:nowrap;line-height:1.2}.drillable-value{display:flex;flex-wrap:wrap;gap:4px;align-items:center;cursor:pointer}.drillable-value .tag{text-decoration:underline}.add-option{position:sticky;position:-webkit-sticky;bottom:0;z-index:3;background:var(--grid-surface-container-high, #fff);box-shadow:0 -2px 8px -4px #00000017;border-top:1px solid var(--grid-outline-variant, #e0e0e0)}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important;display:flex!important;flex-direction:column!important;gap:8px!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.tag-panel-footer{position:absolute;bottom:0;left:0;right:0;background:#fff;border-top:1px solid rgba(0,0,0,.12);padding:8px;z-index:10;box-shadow:0 -2px 4px #0000001a}.tag-panel-footer .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;pointer-events:auto}.tag-panel-footer .add-tag-form-field-wrapper{flex:1;min-width:0;position:relative}.tag-panel-footer .new-tag-input{width:100%;border:1px solid rgba(0,0,0,.38);border-radius:4px;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 12px;font-family:var(--grid-font-family, \"Poppins\")!important;box-sizing:border-box;cursor:text}.tag-panel-footer .new-tag-input:focus{border-color:var(--grid-primary, #6750a4);border-width:2px}.tag-panel-footer .add-tag-button{flex-shrink:0;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 16px!important;min-width:auto!important;pointer-events:auto!important;background-color:var(--grid-primary, #6750a4);color:#fff;border:none;border-radius:4px;cursor:pointer;font-family:var(--grid-font-family, \"Poppins\")!important}.tag-panel-footer .add-tag-button:hover:not([disabled]){opacity:.9}.tag-panel-footer .add-tag-button[disabled]{opacity:.5;cursor:not-allowed}.cdk-overlay-pane.tag-panel-overlay{position:relative;padding-bottom:60px!important}.cdk-overlay-pane.tag-panel-overlay .mat-mdc-select-panel{max-height:calc(100% - 60px)!important}.add-tag-option{position:sticky!important;background:var(--grid-surface-container, #fff)!important;bottom:-10px!important;z-index:10!important;padding:8px 8px 10px!important;margin-top:auto!important;margin-bottom:0!important;box-shadow:0 -2px 8px #00000026!important;border-top:1px solid rgba(0,0,0,.12)!important}.add-tag-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mat-mdc-option{min-height:auto!important;padding:0!important;height:auto!important}.add-tag-option .mat-mdc-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mdc-list-item__primary-text{width:100%!important;padding:0!important;margin:0!important}.add-tag-option .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;padding:0;margin-bottom:0}.add-tag-option .add-tag-form-field{flex:1;min-width:0}.add-tag-option .add-tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.add-tag-option .add-tag-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-infix{min-height:auto!important;padding:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.add-tag-option .add-tag-actions{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;flex-shrink:0}.add-tag-option .add-tag-color-picker{flex-shrink:0;width:20px;height:20px;border:1px solid rgba(0,0,0,.12);border-radius:4px;cursor:pointer;padding:2px;background:transparent;box-sizing:border-box;margin:0 auto}.add-tag-option .add-tag-color-picker::-webkit-color-swatch-wrapper{padding:0}.add-tag-option .add-tag-color-picker::-webkit-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker::-moz-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker:hover{border-color:var(--grid-primary, #6750a4)}.add-tag-option .add-tag-color-picker:focus{outline:2px solid var(--grid-primary, #6750a4);outline-offset:2px}.add-tag-option .add-tag-button{flex-shrink:0;width:20px;height:20px;color:var(--grid-primary, #6750a4)!important;display:flex!important;align-items:center!important;justify-content:center!important;margin:0 auto}.add-tag-option .add-tag-button:not([disabled]){color:var(--grid-primary, #6750a4)!important}.add-tag-option .add-tag-button:not([disabled]):hover{background-color:#6750a414!important}.add-tag-option .add-tag-button[disabled]{opacity:.38;color:#00000061!important}.add-tag-option .add-tag-button mat-icon{font-size:24px;width:24px;height:24px;line-height:24px;display:flex;align-items:center;justify-content:center;margin-right:0}.tag-panel mat-option:last-of-type mat-pseudo-checkbox,.tag-panel mat-option:first-of-type mat-pseudo-checkbox{display:none!important}.tag-panel{min-width:200px!important}.tag-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.tag-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.tag-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .tag-option{display:inline-block;padding:4px 8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
7349
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: TagComponent, isStandalone: true, selector: "eru-tag", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange", newTagAdded: "newTagAdded" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"tag-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"tag-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"true\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"tag-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"tag-option\" \n [style.background]=\"getTagColor(option.value).background\" \n [style.color]=\"getTagColor(option.value).color\">\n {{ option.label }}\n </span>\n </mat-option>\n }\n\n <mat-option class=\"add-tag-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"add-tag-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"add-tag-form-field\">\n <mat-label>Add new tag</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"add-tag-input\"\n placeholder=\"Enter tag name...\"\n [value]=\"newTagInput()\"\n (input)=\"onNewTagInputChange($any($event.target).value)\"\n (keydown.enter)=\"addNewTag()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"add-tag-actions\">\n <input\n type=\"color\"\n class=\"add-tag-color-picker\"\n [value]=\"newTagColor()\"\n (input)=\"onNewTagColorChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n title=\"Select tag color\">\n <button\n mat-icon-button\n class=\"add-tag-button\"\n [disabled]=\"!canAddNewTag()\"\n (click)=\"addNewTag(); $event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </mat-option>\n\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"tag-display\" \n [class.tag-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n </span>\n } @else {\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag-more\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n }\n </div>\n}\n\n", styles: [".tag-form-field{width:100%}.tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.tag-container{width:100%}.tag-display{width:100%;padding:8px 12px;min-height:30px;display:flex;flex-wrap:wrap;align-items:center;gap:4px;cursor:default}.tag-display.tag-display-editable{cursor:pointer}.tag-display.tag-display-editable:hover{background-color:#0000000a}.tag{display:inline-block;padding:8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}.tag-more{display:inline-block;border-radius:12px;background-color:var(--grid-surface-container-high, #f5f5f5);color:var(--grid-on-surface-variant, #49454f);font-size:var(--grid-font-size-body, 12px);font-weight:700;font-style:italic;padding:8px;white-space:nowrap;line-height:1.2}.drillable-value{display:flex;flex-wrap:wrap;gap:4px;align-items:center;cursor:pointer}.drillable-value .tag{text-decoration:underline}.add-option{position:sticky;position:-webkit-sticky;bottom:0;z-index:3;background:var(--grid-surface-container-high, #fff);box-shadow:0 -2px 8px -4px #00000017;border-top:1px solid var(--grid-outline-variant, #e0e0e0)}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important;display:flex!important;flex-direction:column!important;gap:8px!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.tag-panel-footer{position:absolute;bottom:0;left:0;right:0;background:#fff;border-top:1px solid rgba(0,0,0,.12);padding:8px;z-index:10;box-shadow:0 -2px 4px #0000001a}.tag-panel-footer .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;pointer-events:auto}.tag-panel-footer .add-tag-form-field-wrapper{flex:1;min-width:0;position:relative}.tag-panel-footer .new-tag-input{width:100%;border:1px solid rgba(0,0,0,.38);border-radius:4px;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 12px;font-family:var(--grid-font-family, \"Poppins\")!important;box-sizing:border-box;cursor:text}.tag-panel-footer .new-tag-input:focus{border-color:var(--grid-primary, #6750a4);border-width:2px}.tag-panel-footer .add-tag-button{flex-shrink:0;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 16px!important;min-width:auto!important;pointer-events:auto!important;background-color:var(--grid-primary, #6750a4);color:#fff;border:none;border-radius:4px;cursor:pointer;font-family:var(--grid-font-family, \"Poppins\")!important}.tag-panel-footer .add-tag-button:hover:not([disabled]){opacity:.9}.tag-panel-footer .add-tag-button[disabled]{opacity:.5;cursor:not-allowed}.cdk-overlay-pane.tag-panel-overlay{position:relative;padding-bottom:60px!important}.cdk-overlay-pane.tag-panel-overlay .mat-mdc-select-panel{max-height:calc(100% - 60px)!important}.add-tag-option{position:sticky!important;background:var(--grid-surface-container, #fff)!important;bottom:-10px!important;z-index:10!important;padding:8px 8px 10px!important;margin-top:auto!important;margin-bottom:0!important;box-shadow:0 -2px 8px #00000026!important;border-top:1px solid rgba(0,0,0,.12)!important}.add-tag-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mat-mdc-option{min-height:auto!important;padding:0!important;height:auto!important}.add-tag-option .mat-mdc-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mdc-list-item__primary-text{width:100%!important;padding:0!important;margin:0!important}.add-tag-option .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;padding:0;margin-bottom:0}.add-tag-option .add-tag-form-field{flex:1;min-width:0}.add-tag-option .add-tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.add-tag-option .add-tag-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-infix{min-height:auto!important;padding:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.add-tag-option .add-tag-actions{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;flex-shrink:0}.add-tag-option .add-tag-color-picker{flex-shrink:0;width:20px;height:20px;border:1px solid rgba(0,0,0,.12);border-radius:4px;cursor:pointer;padding:2px;background:transparent;box-sizing:border-box;margin:0 auto}.add-tag-option .add-tag-color-picker::-webkit-color-swatch-wrapper{padding:0}.add-tag-option .add-tag-color-picker::-webkit-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker::-moz-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker:hover{border-color:var(--grid-primary, #6750a4)}.add-tag-option .add-tag-color-picker:focus{outline:2px solid var(--grid-primary, #6750a4);outline-offset:2px}.add-tag-option .add-tag-button{flex-shrink:0;width:20px;height:20px;color:var(--grid-primary, #6750a4)!important;display:flex!important;align-items:center!important;justify-content:center!important;margin:0 auto}.add-tag-option .add-tag-button:not([disabled]){color:var(--grid-primary, #6750a4)!important}.add-tag-option .add-tag-button:not([disabled]):hover{background-color:#6750a414!important}.add-tag-option .add-tag-button[disabled]{opacity:.38;color:#00000061!important}.add-tag-option .add-tag-button mat-icon{font-size:24px;width:24px;height:24px;line-height:24px;display:flex;align-items:center;justify-content:center;margin-right:0}.tag-panel mat-option:last-of-type mat-pseudo-checkbox,.tag-panel mat-option:first-of-type mat-pseudo-checkbox{display:none!important}.tag-panel{min-width:200px!important}.tag-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.tag-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.tag-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .tag-option{display:inline-block;padding:4px 8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
7340
7350
|
}
|
|
7341
7351
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TagComponent, decorators: [{
|
|
7342
7352
|
type: Component,
|
|
@@ -7350,7 +7360,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
7350
7360
|
MatCheckboxModule,
|
|
7351
7361
|
MatButtonModule,
|
|
7352
7362
|
MatIconModule
|
|
7353
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"tag-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"tag-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"true\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"tag-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"tag-option\" \n [style.background]=\"getTagColor(option.value).background\" \n [style.color]=\"getTagColor(option.value).color\">\n {{ option.label }}\n </span>\n </mat-option>\n }\n\n <mat-option class=\"add-tag-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"add-tag-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"add-tag-form-field\">\n <mat-label>Add new tag</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"add-tag-input\"\n placeholder=\"Enter tag name...\"\n [value]=\"newTagInput()\"\n (input)=\"onNewTagInputChange($any($event.target).value)\"\n (keydown.enter)=\"addNewTag()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"add-tag-actions\">\n <input\n type=\"color\"\n class=\"add-tag-color-picker\"\n [value]=\"newTagColor()\"\n (input)=\"onNewTagColorChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n title=\"Select tag color\">\n <button\n mat-icon-button\n class=\"add-tag-button\"\n [disabled]=\"!canAddNewTag()\"\n (click)=\"addNewTag(); $event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </mat-option>\n\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"tag-display\" \n [class.tag-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n </span>\n } @else {\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag-more\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n }\n </div>\n}\n\n", styles: [".tag-form-field{width:100%}.tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.tag-container{width:100%}.tag-display{width:100%;padding:8px 12px;min-height:40px;display:flex;flex-wrap:wrap;align-items:center;gap:4px;cursor:default}.tag-display.tag-display-editable{cursor:pointer}.tag-display.tag-display-editable:hover{background-color:#0000000a}.tag{display:inline-block;padding:8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}.tag-more{display:inline-block;border-radius:12px;background-color:var(--grid-surface-container-high, #f5f5f5);color:var(--grid-on-surface-variant, #49454f);font-size:var(--grid-font-size-body, 12px);font-weight:700;font-style:italic;padding:8px;white-space:nowrap;line-height:1.2}.drillable-value{display:flex;flex-wrap:wrap;gap:4px;align-items:center;cursor:pointer}.drillable-value .tag{text-decoration:underline}.add-option{position:sticky;position:-webkit-sticky;bottom:0;z-index:3;background:var(--grid-surface-container-high, #fff);box-shadow:0 -2px 8px -4px #00000017;border-top:1px solid var(--grid-outline-variant, #e0e0e0)}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important;display:flex!important;flex-direction:column!important;gap:8px!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.tag-panel-footer{position:absolute;bottom:0;left:0;right:0;background:#fff;border-top:1px solid rgba(0,0,0,.12);padding:8px;z-index:10;box-shadow:0 -2px 4px #0000001a}.tag-panel-footer .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;pointer-events:auto}.tag-panel-footer .add-tag-form-field-wrapper{flex:1;min-width:0;position:relative}.tag-panel-footer .new-tag-input{width:100%;border:1px solid rgba(0,0,0,.38);border-radius:4px;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 12px;font-family:var(--grid-font-family, \"Poppins\")!important;box-sizing:border-box;cursor:text}.tag-panel-footer .new-tag-input:focus{border-color:var(--grid-primary, #6750a4);border-width:2px}.tag-panel-footer .add-tag-button{flex-shrink:0;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 16px!important;min-width:auto!important;pointer-events:auto!important;background-color:var(--grid-primary, #6750a4);color:#fff;border:none;border-radius:4px;cursor:pointer;font-family:var(--grid-font-family, \"Poppins\")!important}.tag-panel-footer .add-tag-button:hover:not([disabled]){opacity:.9}.tag-panel-footer .add-tag-button[disabled]{opacity:.5;cursor:not-allowed}.cdk-overlay-pane.tag-panel-overlay{position:relative;padding-bottom:60px!important}.cdk-overlay-pane.tag-panel-overlay .mat-mdc-select-panel{max-height:calc(100% - 60px)!important}.add-tag-option{position:sticky!important;background:var(--grid-surface-container, #fff)!important;bottom:-10px!important;z-index:10!important;padding:8px 8px 10px!important;margin-top:auto!important;margin-bottom:0!important;box-shadow:0 -2px 8px #00000026!important;border-top:1px solid rgba(0,0,0,.12)!important}.add-tag-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mat-mdc-option{min-height:auto!important;padding:0!important;height:auto!important}.add-tag-option .mat-mdc-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mdc-list-item__primary-text{width:100%!important;padding:0!important;margin:0!important}.add-tag-option .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;padding:0;margin-bottom:0}.add-tag-option .add-tag-form-field{flex:1;min-width:0}.add-tag-option .add-tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.add-tag-option .add-tag-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-infix{min-height:auto!important;padding:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.add-tag-option .add-tag-actions{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;flex-shrink:0}.add-tag-option .add-tag-color-picker{flex-shrink:0;width:20px;height:20px;border:1px solid rgba(0,0,0,.12);border-radius:4px;cursor:pointer;padding:2px;background:transparent;box-sizing:border-box;margin:0 auto}.add-tag-option .add-tag-color-picker::-webkit-color-swatch-wrapper{padding:0}.add-tag-option .add-tag-color-picker::-webkit-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker::-moz-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker:hover{border-color:var(--grid-primary, #6750a4)}.add-tag-option .add-tag-color-picker:focus{outline:2px solid var(--grid-primary, #6750a4);outline-offset:2px}.add-tag-option .add-tag-button{flex-shrink:0;width:20px;height:20px;color:var(--grid-primary, #6750a4)!important;display:flex!important;align-items:center!important;justify-content:center!important;margin:0 auto}.add-tag-option .add-tag-button:not([disabled]){color:var(--grid-primary, #6750a4)!important}.add-tag-option .add-tag-button:not([disabled]):hover{background-color:#6750a414!important}.add-tag-option .add-tag-button[disabled]{opacity:.38;color:#00000061!important}.add-tag-option .add-tag-button mat-icon{font-size:24px;width:24px;height:24px;line-height:24px;display:flex;align-items:center;justify-content:center;margin-right:0}.tag-panel mat-option:last-of-type mat-pseudo-checkbox,.tag-panel mat-option:first-of-type mat-pseudo-checkbox{display:none!important}.tag-panel{min-width:200px!important}.tag-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.tag-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.tag-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .tag-option{display:inline-block;padding:4px 8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}\n"] }]
|
|
7363
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"tag-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"tag-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"true\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"tag-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"tag-option\" \n [style.background]=\"getTagColor(option.value).background\" \n [style.color]=\"getTagColor(option.value).color\">\n {{ option.label }}\n </span>\n </mat-option>\n }\n\n <mat-option class=\"add-tag-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"add-tag-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"add-tag-form-field\">\n <mat-label>Add new tag</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"add-tag-input\"\n placeholder=\"Enter tag name...\"\n [value]=\"newTagInput()\"\n (input)=\"onNewTagInputChange($any($event.target).value)\"\n (keydown.enter)=\"addNewTag()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"add-tag-actions\">\n <input\n type=\"color\"\n class=\"add-tag-color-picker\"\n [value]=\"newTagColor()\"\n (input)=\"onNewTagColorChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n title=\"Select tag color\">\n <button\n mat-icon-button\n class=\"add-tag-button\"\n [disabled]=\"!canAddNewTag()\"\n (click)=\"addNewTag(); $event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </mat-option>\n\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"tag-display\" \n [class.tag-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n </span>\n } @else {\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag-more\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n }\n </div>\n}\n\n", styles: [".tag-form-field{width:100%}.tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.tag-container{width:100%}.tag-display{width:100%;padding:8px 12px;min-height:30px;display:flex;flex-wrap:wrap;align-items:center;gap:4px;cursor:default}.tag-display.tag-display-editable{cursor:pointer}.tag-display.tag-display-editable:hover{background-color:#0000000a}.tag{display:inline-block;padding:8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}.tag-more{display:inline-block;border-radius:12px;background-color:var(--grid-surface-container-high, #f5f5f5);color:var(--grid-on-surface-variant, #49454f);font-size:var(--grid-font-size-body, 12px);font-weight:700;font-style:italic;padding:8px;white-space:nowrap;line-height:1.2}.drillable-value{display:flex;flex-wrap:wrap;gap:4px;align-items:center;cursor:pointer}.drillable-value .tag{text-decoration:underline}.add-option{position:sticky;position:-webkit-sticky;bottom:0;z-index:3;background:var(--grid-surface-container-high, #fff);box-shadow:0 -2px 8px -4px #00000017;border-top:1px solid var(--grid-outline-variant, #e0e0e0)}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important;display:flex!important;flex-direction:column!important;gap:8px!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.search-option .select-all-container{padding:4px 0!important;display:flex!important;align-items:center!important;pointer-events:auto!important}.search-option .select-all-container .select-all-text{font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;font-weight:500!important;color:var(--grid-on-surface, #1d1b20)!important;margin-left:8px!important}.search-option .select-all-container mat-checkbox .mdc-checkbox .mdc-checkbox__checkmark{color:var(--grid-on-primary, #ffffff)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.search-option .select-all-container mat-checkbox.mat-mdc-checkbox-indeterminate .mdc-checkbox__background{background-color:var(--grid-primary, #6750a4)!important;border-color:var(--grid-primary, #6750a4)!important}.tag-panel-footer{position:absolute;bottom:0;left:0;right:0;background:#fff;border-top:1px solid rgba(0,0,0,.12);padding:8px;z-index:10;box-shadow:0 -2px 4px #0000001a}.tag-panel-footer .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;pointer-events:auto}.tag-panel-footer .add-tag-form-field-wrapper{flex:1;min-width:0;position:relative}.tag-panel-footer .new-tag-input{width:100%;border:1px solid rgba(0,0,0,.38);border-radius:4px;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 12px;font-family:var(--grid-font-family, \"Poppins\")!important;box-sizing:border-box;cursor:text}.tag-panel-footer .new-tag-input:focus{border-color:var(--grid-primary, #6750a4);border-width:2px}.tag-panel-footer .add-tag-button{flex-shrink:0;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 16px!important;min-width:auto!important;pointer-events:auto!important;background-color:var(--grid-primary, #6750a4);color:#fff;border:none;border-radius:4px;cursor:pointer;font-family:var(--grid-font-family, \"Poppins\")!important}.tag-panel-footer .add-tag-button:hover:not([disabled]){opacity:.9}.tag-panel-footer .add-tag-button[disabled]{opacity:.5;cursor:not-allowed}.cdk-overlay-pane.tag-panel-overlay{position:relative;padding-bottom:60px!important}.cdk-overlay-pane.tag-panel-overlay .mat-mdc-select-panel{max-height:calc(100% - 60px)!important}.add-tag-option{position:sticky!important;background:var(--grid-surface-container, #fff)!important;bottom:-10px!important;z-index:10!important;padding:8px 8px 10px!important;margin-top:auto!important;margin-bottom:0!important;box-shadow:0 -2px 8px #00000026!important;border-top:1px solid rgba(0,0,0,.12)!important}.add-tag-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mat-mdc-option{min-height:auto!important;padding:0!important;height:auto!important}.add-tag-option .mat-mdc-option:hover{background:var(--grid-surface-container, #fff)!important}.add-tag-option .mdc-list-item__primary-text{width:100%!important;padding:0!important;margin:0!important}.add-tag-option .add-tag-container{display:flex;align-items:center;gap:8px;width:100%;padding:0;margin-bottom:0}.add-tag-option .add-tag-form-field{flex:1;min-width:0}.add-tag-option .add-tag-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.add-tag-option .add-tag-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-infix{min-height:auto!important;padding:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.add-tag-option .add-tag-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.add-tag-option .add-tag-actions{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;flex-shrink:0}.add-tag-option .add-tag-color-picker{flex-shrink:0;width:20px;height:20px;border:1px solid rgba(0,0,0,.12);border-radius:4px;cursor:pointer;padding:2px;background:transparent;box-sizing:border-box;margin:0 auto}.add-tag-option .add-tag-color-picker::-webkit-color-swatch-wrapper{padding:0}.add-tag-option .add-tag-color-picker::-webkit-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker::-moz-color-swatch{border:none;border-radius:2px}.add-tag-option .add-tag-color-picker:hover{border-color:var(--grid-primary, #6750a4)}.add-tag-option .add-tag-color-picker:focus{outline:2px solid var(--grid-primary, #6750a4);outline-offset:2px}.add-tag-option .add-tag-button{flex-shrink:0;width:20px;height:20px;color:var(--grid-primary, #6750a4)!important;display:flex!important;align-items:center!important;justify-content:center!important;margin:0 auto}.add-tag-option .add-tag-button:not([disabled]){color:var(--grid-primary, #6750a4)!important}.add-tag-option .add-tag-button:not([disabled]):hover{background-color:#6750a414!important}.add-tag-option .add-tag-button[disabled]{opacity:.38;color:#00000061!important}.add-tag-option .add-tag-button mat-icon{font-size:24px;width:24px;height:24px;line-height:24px;display:flex;align-items:center;justify-content:center;margin-right:0}.tag-panel mat-option:last-of-type mat-pseudo-checkbox,.tag-panel mat-option:first-of-type mat-pseudo-checkbox{display:none!important}.tag-panel{min-width:200px!important}.tag-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.tag-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.tag-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .tag-option{display:inline-block;padding:4px 8px;border-radius:12px;font-size:var(--grid-font-size-body, 12px);font-weight:500;white-space:nowrap;line-height:1.2}\n"] }]
|
|
7354
7364
|
}], ctorParameters: () => [], propDecorators: { selectContainer: [{
|
|
7355
7365
|
type: ViewChild,
|
|
7356
7366
|
args: ['selectContainer', { static: false }]
|
|
@@ -7633,8 +7643,11 @@ class PeopleComponent {
|
|
|
7633
7643
|
selectedMultiSelect(value) {
|
|
7634
7644
|
this.onValueChange(value);
|
|
7635
7645
|
}
|
|
7646
|
+
trackByValueAndIndex(index, option) {
|
|
7647
|
+
return `${option?.value || ''}_${index}`;
|
|
7648
|
+
}
|
|
7636
7649
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PeopleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
7637
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PeopleComponent, isStandalone: true, selector: "eru-people", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n appearance=\"outline\"\n class=\"people-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"people-select-container\">\n <mat-select\n [multiple]=\"true\"\n [disabled]=\"!isEditable()\"\n [value]=\"currentValue()\"\n panelClass=\"people-select-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n <div class=\"people-trigger-content\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">Select people...</span>\n }\n </div>\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n appearance=\"outline\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track option.value) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials(option.label) }}</div>\n <span class=\"option-text\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"people-display\" \n [class.people-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"people-drillable\" (click)=\"onDrillableClick($event)\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n </span>\n } @else {\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n }\n </div>\n}\n\n", styles: [".people-form-field{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.people-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.people-select-container{width:100%;display:flex;align-items:center}.people-trigger-content{display:flex;align-items:center;gap:4px;padding:4px;min-height:32px;width:100%;overflow:hidden;flex-wrap:nowrap}.people-display{display:flex;align-items:center;gap:4px;padding:4px;min-height:32px;width:100%;height:100%;cursor:default;overflow:hidden;flex-wrap:nowrap}.people-display.people-display-editable{cursor:pointer}.people-display.people-display-editable:hover{background-color:#0000000a}.avatar-circle{width:28px;height:28px;min-width:28px;min-height:28px;max-width:28px;max-height:28px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:500;border:2px solid var(--grid-surface, #fef7ff);margin-left:-8px;position:relative;z-index:1;flex-shrink:0;box-sizing:border-box}.avatar-circle:first-child{margin-left:0}.avatar-circle.count-circle{background-color:var(--grid-surface-variant, #e7e0ec);color:var(--grid-on-surface-variant, #49454f);font-size:11px;font-weight:500}.no-people-text{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px;padding:4px 8px}.people-drillable{display:flex;align-items:center;gap:4px;cursor:pointer;color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.people-drillable .avatar-circle{text-decoration:none}.people-select-panel{min-width:200px!important}.people-select-panel .search-option{height:auto!important;padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.people-select-panel .search-option .mdc-list-item__primary-text{opacity:1!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto;box-sizing:border-box!important;margin-bottom:8px}.people-select-panel .search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.people-select-panel .search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .select-all-container{padding:4px 8px;cursor:pointer;pointer-events:auto}.people-select-panel .search-option .select-all-container .select-all-text{margin-left:8px;font-size:var(--grid-font-size-body, 12px)}.people-select-panel .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.people-select-panel .mat-mdc-option{padding:8px 12px;cursor:pointer;transition:background-color .2s}.people-select-panel .mat-mdc-option:hover{background-color:#0000000a}.people-select-panel .mat-mdc-option[aria-selected=true]{background-color:#6750a41a}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i2$1.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i2$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
7650
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PeopleComponent, isStandalone: true, selector: "eru-people", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n<mat-form-field appearance=\"outline\" class=\"people-form-field\" (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"people-select-container\">\n <mat-select [multiple]=\"true\" [disabled]=\"!isEditable()\" [value]=\"currentValue()\" panelClass=\"people-select-panel\"\n (selectionChange)=\"onValueChange($event.value)\" (blur)=\"onBlur($event)\" (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n\n <mat-select-trigger>\n <div class=\"people-trigger-content\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">Select people...</span>\n }\n </div>\n </mat-select-trigger>\n\n <mat-option disabled class=\"search-option\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input matInput type=\"text\" class=\"search-input\" placeholder=\"filter options...\" [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox [checked]=\"isAllSelected()\" [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials(option.label) }}</div>\n <span class=\"option-text\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n</mat-form-field>\n} @else {\n<div class=\"people-display\" [class.people-display-editable]=\"isEditable()\" (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"people-drillable\" (click)=\"onDrillableClick($event)\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n </span>\n } @else {\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n }\n</div>\n}", styles: [".people-form-field{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.people-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.people-select-container{width:100%;display:flex;align-items:center}.people-trigger-content{display:flex;align-items:center;gap:4px;padding:4px;min-height:32px;width:100%;overflow:hidden;flex-wrap:nowrap}.people-display{display:flex;align-items:center;gap:4px;padding:4px;min-height:32px;width:100%;height:100%;cursor:default;overflow:hidden;flex-wrap:nowrap}.people-display.people-display-editable{cursor:pointer}.people-display.people-display-editable:hover{background-color:#0000000a}.avatar-circle{width:28px;height:28px;min-width:28px;min-height:28px;max-width:28px;max-height:28px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:500;border:2px solid var(--grid-surface, #fef7ff);margin-left:-8px;position:relative;z-index:1;flex-shrink:0;box-sizing:border-box}.avatar-circle:first-child{margin-left:0}.avatar-circle.count-circle{background-color:var(--grid-surface-variant, #e7e0ec);color:var(--grid-on-surface-variant, #49454f);font-size:11px;font-weight:500}.no-people-text{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px;padding:4px 8px}.people-drillable{display:flex;align-items:center;gap:4px;cursor:pointer;color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.people-drillable .avatar-circle{text-decoration:none}.people-select-panel{min-width:200px!important}.people-select-panel .search-option{height:auto!important;padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.people-select-panel .search-option .mdc-list-item__primary-text{opacity:1!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto;box-sizing:border-box!important;margin-bottom:8px}.people-select-panel .search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.people-select-panel .search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .select-all-container{padding:4px 8px;cursor:pointer;pointer-events:auto}.people-select-panel .search-option .select-all-container .select-all-text{margin-left:8px;font-size:var(--grid-font-size-body, 12px)}.people-select-panel .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.people-select-panel .mat-mdc-option{padding:8px 12px;cursor:pointer;transition:background-color .2s}.people-select-panel .mat-mdc-option:hover{background-color:#0000000a}.people-select-panel .mat-mdc-option[aria-selected=true]{background-color:#6750a41a}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i2$2.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
7638
7651
|
}
|
|
7639
7652
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PeopleComponent, decorators: [{
|
|
7640
7653
|
type: Component,
|
|
@@ -7645,7 +7658,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
7645
7658
|
MatSelectModule,
|
|
7646
7659
|
MatOptionModule,
|
|
7647
7660
|
MatCheckboxModule
|
|
7648
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n
|
|
7661
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n<mat-form-field appearance=\"outline\" class=\"people-form-field\" (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"people-select-container\">\n <mat-select [multiple]=\"true\" [disabled]=\"!isEditable()\" [value]=\"currentValue()\" panelClass=\"people-select-panel\"\n (selectionChange)=\"onValueChange($event.value)\" (blur)=\"onBlur($event)\" (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n\n <mat-select-trigger>\n <div class=\"people-trigger-content\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">Select people...</span>\n }\n </div>\n </mat-select-trigger>\n\n <mat-option disabled class=\"search-option\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input matInput type=\"text\" class=\"search-input\" placeholder=\"filter options...\" [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox [checked]=\"isAllSelected()\" [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\" (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials(option.label) }}</div>\n <span class=\"option-text\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n</mat-form-field>\n} @else {\n<div class=\"people-display\" [class.people-display-editable]=\"isEditable()\" (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"people-drillable\" (click)=\"onDrillableClick($event)\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n </span>\n } @else {\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n }\n</div>\n}", styles: [".people-form-field{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:var(--grid-font-size-body, 12px)!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.people-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.people-select-container{width:100%;display:flex;align-items:center}.people-trigger-content{display:flex;align-items:center;gap:4px;padding:4px;min-height:32px;width:100%;overflow:hidden;flex-wrap:nowrap}.people-display{display:flex;align-items:center;gap:4px;padding:4px;min-height:32px;width:100%;height:100%;cursor:default;overflow:hidden;flex-wrap:nowrap}.people-display.people-display-editable{cursor:pointer}.people-display.people-display-editable:hover{background-color:#0000000a}.avatar-circle{width:28px;height:28px;min-width:28px;min-height:28px;max-width:28px;max-height:28px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:500;border:2px solid var(--grid-surface, #fef7ff);margin-left:-8px;position:relative;z-index:1;flex-shrink:0;box-sizing:border-box}.avatar-circle:first-child{margin-left:0}.avatar-circle.count-circle{background-color:var(--grid-surface-variant, #e7e0ec);color:var(--grid-on-surface-variant, #49454f);font-size:11px;font-weight:500}.no-people-text{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px;padding:4px 8px}.people-drillable{display:flex;align-items:center;gap:4px;cursor:pointer;color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.people-drillable .avatar-circle{text-decoration:none}.people-select-panel{min-width:200px!important}.people-select-panel .search-option{height:auto!important;padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.people-select-panel .search-option .mdc-list-item__primary-text{opacity:1!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto;box-sizing:border-box!important;margin-bottom:8px}.people-select-panel .search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.people-select-panel .search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.people-select-panel .search-option .select-all-container{padding:4px 8px;cursor:pointer;pointer-events:auto}.people-select-panel .search-option .select-all-container .select-all-text{margin-left:8px;font-size:var(--grid-font-size-body, 12px)}.people-select-panel .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.people-select-panel .mat-mdc-option{padding:8px 12px;cursor:pointer;transition:background-color .2s}.people-select-panel .mat-mdc-option:hover{background-color:#0000000a}.people-select-panel .mat-mdc-option[aria-selected=true]{background-color:#6750a41a}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}\n"] }]
|
|
7649
7662
|
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], isEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isEditable", required: false }] }], isActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "isActive", required: false }] }], isDrillable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDrillable", required: false }] }], columnWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnWidth", required: false }] }], eruGridStore: [{ type: i0.Input, args: [{ isSignal: true, alias: "eruGridStore", required: false }] }], valueChange: [{
|
|
7650
7663
|
type: Output
|
|
7651
7664
|
}], blur: [{
|
|
@@ -7865,7 +7878,7 @@ class PriorityComponent {
|
|
|
7865
7878
|
return `${option.value}_${index}`;
|
|
7866
7879
|
}
|
|
7867
7880
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PriorityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
7868
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PriorityComponent, isStandalone: true, selector: "eru-priority", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }, { propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"priority-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"priority-container\">\n <mat-select\n #matSelect\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"false\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"priority-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n @if(priorityIcon()) {\n <span class=\"priority-trigger\">\n <mat-icon class=\"priority-icon-trigger\" [style.color]=\"priorityColor()\">flag</mat-icon>\n <span>{{ getSelectedLabel() }}</span>\n </span>\n } @else {\n <span>{{ getSelectedLabel() }}</span>\n }\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\">\n <span class=\"priority-option\">\n <mat-icon class=\"priority-icon\" [style.color]=\"getOptionColor(option)\">flag</mat-icon>\n <span class=\"priority-label\">{{ option.label }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"priority-display\" \n [class.priority-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n </span>\n } @else {\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n }\n </div>\n}\n", styles: [".priority-form-field{width:100%}.priority-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.priority-container{width:100%}.priority-trigger{display:flex;align-items:center;gap:8px;width:100%}.priority-icon-trigger{width:16px;height:16px;padding-left:2px;font-size:16px;line-height:16px;flex-shrink:0}.priority-display{width:100%;padding:8px 12px;min-height:
|
|
7881
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PriorityComponent, isStandalone: true, selector: "eru-priority", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: false, transformFunction: null }, eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange" }, viewQueries: [{ propertyName: "selectContainer", first: true, predicate: ["selectContainer"], descendants: true }, { propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }], ngImport: i0, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"priority-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"priority-container\">\n <mat-select\n #matSelect\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"false\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"priority-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n @if(priorityIcon()) {\n <span class=\"priority-trigger\">\n <mat-icon class=\"priority-icon-trigger\" [style.color]=\"priorityColor()\">flag</mat-icon>\n <span>{{ getSelectedLabel() }}</span>\n </span>\n } @else {\n <span>{{ getSelectedLabel() }}</span>\n }\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\">\n <span class=\"priority-option\">\n <mat-icon class=\"priority-icon\" [style.color]=\"getOptionColor(option)\">flag</mat-icon>\n <span class=\"priority-label\">{{ option.label }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"priority-display\" \n [class.priority-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n </span>\n } @else {\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n }\n </div>\n}\n", styles: [".priority-form-field{width:100%}.priority-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.priority-container{width:100%}.priority-trigger{display:flex;align-items:center;gap:8px;width:100%}.priority-icon-trigger{width:16px;height:16px;padding-left:2px;font-size:16px;line-height:16px;flex-shrink:0}.priority-display{width:100%;padding:8px 12px;min-height:30px;display:flex;align-items:center;gap:8px;cursor:default}.priority-display.priority-display-editable{cursor:pointer}.priority-display.priority-display-editable:hover{background-color:#0000000a}.priority-icon-display{width:16px;height:16px;font-size:16px;line-height:16px}.drillable-value{display:flex;align-items:center;gap:8px;color:#1976d2;cursor:pointer;text-decoration:underline}.drillable-value:hover{color:#1565c0}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.priority-panel{min-width:150px!important}.priority-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.priority-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.priority-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .priority-option{display:flex;align-items:center;gap:8px;width:100%}mat-option .priority-icon{width:16px;height:16px;font-size:16px;line-height:16px;flex-shrink:0}mat-option .priority-label{flex:1}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i2$2.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
7869
7882
|
}
|
|
7870
7883
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PriorityComponent, decorators: [{
|
|
7871
7884
|
type: Component,
|
|
@@ -7876,7 +7889,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
7876
7889
|
MatInputModule,
|
|
7877
7890
|
MatOptionModule,
|
|
7878
7891
|
MatIconModule
|
|
7879
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"priority-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"priority-container\">\n <mat-select\n #matSelect\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"false\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"priority-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n @if(priorityIcon()) {\n <span class=\"priority-trigger\">\n <mat-icon class=\"priority-icon-trigger\" [style.color]=\"priorityColor()\">flag</mat-icon>\n <span>{{ getSelectedLabel() }}</span>\n </span>\n } @else {\n <span>{{ getSelectedLabel() }}</span>\n }\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\">\n <span class=\"priority-option\">\n <mat-icon class=\"priority-icon\" [style.color]=\"getOptionColor(option)\">flag</mat-icon>\n <span class=\"priority-label\">{{ option.label }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"priority-display\" \n [class.priority-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n </span>\n } @else {\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n }\n </div>\n}\n", styles: [".priority-form-field{width:100%}.priority-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.priority-container{width:100%}.priority-trigger{display:flex;align-items:center;gap:8px;width:100%}.priority-icon-trigger{width:16px;height:16px;padding-left:2px;font-size:16px;line-height:16px;flex-shrink:0}.priority-display{width:100%;padding:8px 12px;min-height:
|
|
7892
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"priority-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"priority-container\">\n <mat-select\n #matSelect\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"false\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"priority-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n @if(priorityIcon()) {\n <span class=\"priority-trigger\">\n <mat-icon class=\"priority-icon-trigger\" [style.color]=\"priorityColor()\">flag</mat-icon>\n <span>{{ getSelectedLabel() }}</span>\n </span>\n } @else {\n <span>{{ getSelectedLabel() }}</span>\n }\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\">\n <span class=\"priority-option\">\n <mat-icon class=\"priority-icon\" [style.color]=\"getOptionColor(option)\">flag</mat-icon>\n <span class=\"priority-label\">{{ option.label }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"priority-display\" \n [class.priority-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n </span>\n } @else {\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n }\n </div>\n}\n", styles: [".priority-form-field{width:100%}.priority-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.priority-container{width:100%}.priority-trigger{display:flex;align-items:center;gap:8px;width:100%}.priority-icon-trigger{width:16px;height:16px;padding-left:2px;font-size:16px;line-height:16px;flex-shrink:0}.priority-display{width:100%;padding:8px 12px;min-height:30px;display:flex;align-items:center;gap:8px;cursor:default}.priority-display.priority-display-editable{cursor:pointer}.priority-display.priority-display-editable:hover{background-color:#0000000a}.priority-icon-display{width:16px;height:16px;font-size:16px;line-height:16px}.drillable-value{display:flex;align-items:center;gap:8px;color:#1976d2;cursor:pointer;text-decoration:underline}.drillable-value:hover{color:#1565c0}.search-option{padding:2px 4px!important;cursor:default!important;pointer-events:auto!important;width:100%!important;box-sizing:border-box!important;overflow:hidden!important}.search-option .mat-mdc-option{height:auto!important;padding:2px 4px!important;min-height:auto!important}.search-option .mat-mdc-option:hover{background:transparent!important}.search-option .mdc-list-item__primary-text{width:100%!important;max-width:100%!important;box-sizing:border-box!important;padding:0!important;margin:0!important}.search-option .search-form-field{width:100%!important;max-width:100%!important;pointer-events:auto!important;box-sizing:border-box!important;margin:0!important}.search-option .search-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.search-option .search-form-field .mat-mdc-text-field-wrapper{padding-bottom:0!important;width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-form-field .mat-mdc-form-field-infix{width:100%!important;max-width:100%!important;box-sizing:border-box!important;min-height:auto!important;padding:0!important}.search-option .search-form-field .mat-mdc-form-field-flex{width:100%!important;max-width:100%!important;box-sizing:border-box!important}.search-option .search-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--grid-font-size-body, 12px)!important;padding:8px 0}.priority-panel{min-width:150px!important}.priority-panel .search-option .mat-mdc-option,.mat-mdc-select-panel .search-option .mat-mdc-option{min-height:auto!important;padding:2px 4px!important}.priority-panel .mdc-list-item--disabled,.mat-mdc-select-panel .mdc-list-item--disabled{pointer-events:auto!important;cursor:default!important}.priority-panel .mdc-list-item--disabled:hover,.mat-mdc-select-panel .mdc-list-item--disabled:hover{background:transparent!important}.mat-select-panel-animations-enabled mat-option:first-of-type mat-pseudo-checkbox{display:none!important}mat-option .mdc-list-item__primary-text{line-height:1.5!important;white-space:normal!important;display:flex!important;align-items:center!important}mat-option .priority-option{display:flex;align-items:center;gap:8px;width:100%}mat-option .priority-icon{width:16px;height:16px;font-size:16px;line-height:16px;flex-shrink:0}mat-option .priority-label{flex:1}\n"] }]
|
|
7880
7893
|
}], ctorParameters: () => [], propDecorators: { selectContainer: [{
|
|
7881
7894
|
type: ViewChild,
|
|
7882
7895
|
args: ['selectContainer', { static: false }]
|
|
@@ -8083,7 +8096,6 @@ class AttachmentComponent {
|
|
|
8083
8096
|
uploadFile(base64String, fileName) {
|
|
8084
8097
|
// This can be extended to call an upload service
|
|
8085
8098
|
// For now, just emit the file data
|
|
8086
|
-
console.log('Upload file:', fileName);
|
|
8087
8099
|
}
|
|
8088
8100
|
viewFile(file, event) {
|
|
8089
8101
|
if (event) {
|
|
@@ -8116,7 +8128,7 @@ class AttachmentComponent {
|
|
|
8116
8128
|
return file;
|
|
8117
8129
|
}
|
|
8118
8130
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: AttachmentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8119
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: AttachmentComponent, isStandalone: true, selector: "eru-attachment", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange", fileAdded: "fileAdded", fileDeleted: "fileDeleted", fileViewed: "fileViewed" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"attachment-overlay-container\">\n <div \n class=\"attachment-cell-wrapper\"\n cdkOverlayOrigin \n #attachmentTrigger=\"cdkOverlayOrigin\"\n [class.attachment-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n @if(hasFiles()) {\n <div class=\"cell-attachment-container\">\n @if (isDrillable() && !isActive()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n } @else {\n <div class=\"cell-attachment-container\">\n @if (isDrillable() && !isActive()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n </div>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"attachmentTrigger\"\n [cdkConnectedOverlayOpen]=\"isOverlayOpen() && isActive()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'attachment-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick()\"\n (detach)=\"closeOverlay()\">\n <div \n class=\"attachment-menu-overlay\" \n [style.width.px]=\"columnWidth() || config().columnWidth || 300\" \n [style.min-width.px]=\"300\"\n (click)=\"onOverlayClick($event)\">\n <div class=\"attachment-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header Section -->\n <div class=\"attachment-header\">\n <span class=\"attachment-title\">Add or Drag files</span>\n <button \n mat-flat-button \n (click)=\"onUploadClick(); $event.stopPropagation()\" \n class=\"attachment-upload-btn\"\n [disabled]=\"config().disabled || !isEditable()\">\n Upload\n </button>\n </div>\n \n <!-- Drop zone -->\n <div \n class=\"attachment-drop-zone\" \n (drop)=\"onFileDrop($event)\" \n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\"\n (paste)=\"onPaste($event)\"\n (click)=\"onUploadClick(); $event.stopPropagation()\"\n [class.dragging]=\"isDragging()\">\n <div class=\"attachment-drop-content\">\n <div class=\"attachment-drop-icon\">+</div>\n <div class=\"attachment-drop-text\">\n <div class=\"primary-text\">Click to upload or drag files here</div>\n <div class=\"secondary-text\">Support multiple files</div>\n </div>\n </div>\n </div>\n \n <!-- Hidden file input -->\n <input \n #fileInput\n type=\"file\" \n multiple \n (change)=\"onFileInputChange($event)\" \n style=\"display: none;\">\n \n <!-- File list -->\n @if (hasFiles()) {\n <div class=\"attachment-file-list\">\n @for (file of currentValue(); track trackByFile($index, file)) {\n <div class=\"attachment-file-item\">\n <div class=\"file-info\">\n <span class=\"file-icon\">\uD83D\uDCCE</span>\n <span class=\"file-name\">{{ getFileName(file) }}</span>\n </div>\n <div class=\"file-actions\">\n <button \n class=\"action-btn\" \n (click)=\"viewFile(file, $event)\" \n title=\"View\"\n type=\"button\">\n \uD83D\uDC41\uFE0F\n </button>\n <button \n class=\"action-btn\" \n (click)=\"deleteFile(file, $event)\" \n title=\"Delete\"\n type=\"button\">\n \uD83D\uDDD1\uFE0F\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </ng-template>\n</div>\n\n", styles: [".attachment-overlay-container{width:100%;height:100%}.attachment-cell-wrapper{display:flex;align-items:center;justify-content:center;padding:4px;min-height:32px;cursor:default}.attachment-cell-wrapper.attachment-display-editable{cursor:pointer}.attachment-cell-wrapper.attachment-display-editable:hover{background-color:#0000000a}.cell-attachment-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.drillable-value{display:flex;align-items:center;justify-content:center;cursor:pointer}.drillable-value svg{text-decoration:none}.drillable-value:hover{opacity:.8}.attachment-backdrop{background:transparent}.attachment-menu-overlay{background:#fff;border-radius:8px;box-shadow:0 4px 12px #00000026;overflow:hidden;position:relative;z-index:1000}.attachment-container{padding:16px}.attachment-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.attachment-title{font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1c1b1f)}.attachment-upload-btn{font-size:var(--grid-font-size-body, 12px)!important;min-width:50px}.attachment-drop-zone{border:2px dashed var(--grid-outline-variant, #cac4d0);border-radius:8px;padding:40px 20px;text-align:center;cursor:pointer;transition:all .3s ease;background:var(--grid-surface-variant, #e7e0ec);margin:16px 0}.attachment-drop-zone:hover{border-color:var(--grid-primary, #6750a4);background:var(--grid-surface-container, #f3edf7)}.attachment-drop-zone.dragging{border-color:var(--grid-primary, #6750a4);background:var(--grid-surface-container, #f3edf7);transform:scale(1.01)}.attachment-drop-content{display:flex;flex-direction:column;align-items:center;gap:12px}.attachment-drop-icon{font-size:48px;color:var(--grid-primary, #6750a4);font-weight:300;line-height:1}.attachment-drop-text .primary-text{font-family:var(--grid-font-family, \"Poppins\");font-size:14px;color:var(--grid-on-surface-variant, #49454f);font-weight:400;margin:0}.attachment-drop-text .secondary-text{font-family:var(--grid-font-family, \"Poppins\");font-size:12px;color:var(--grid-on-surface-variant, #49454f);margin-top:4px;display:block}.attachment-file-list{display:block;margin-top:16px;max-height:300px;overflow-y:auto}.attachment-file-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-radius:4px;margin-bottom:8px;background:var(--grid-surface-variant, #e7e0ec);transition:background-color .2s}.attachment-file-item:hover{background:var(--grid-surface-container, #f3edf7)}.file-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.file-icon{font-size:16px;flex-shrink:0}.file-name{font-size:var(--grid-font-size-body, 12px);color:var(--grid-on-surface, #1c1b1f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-actions{display:flex;gap:8px;flex-shrink:0}.action-btn{background:none;border:none;cursor:pointer;padding:4px 8px;border-radius:4px;font-size:var(--grid-font-size-body, 12px);transition:background-color .2s}.action-btn:hover{background-color:#0000001a}.action-btn:active{background-color:#0003}.action-btn:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
8131
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: AttachmentComponent, isStandalone: true, selector: "eru-attachment", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDrillable: { classPropertyName: "isDrillable", publicName: "isDrillable", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", blur: "blur", focus: "focus", drilldownClick: "drilldownClick", editModeChange: "editModeChange", fileAdded: "fileAdded", fileDeleted: "fileDeleted", fileViewed: "fileViewed" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"attachment-overlay-container\">\n <div \n class=\"attachment-cell-wrapper\"\n cdkOverlayOrigin \n #attachmentTrigger=\"cdkOverlayOrigin\"\n [class.attachment-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n @if(hasFiles()) {\n <div class=\"cell-attachment-container\">\n @if (isDrillable() && !isActive()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n } @else {\n <div class=\"cell-attachment-container\">\n @if (isDrillable() && !isActive()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n </div>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"attachmentTrigger\"\n [cdkConnectedOverlayOpen]=\"isOverlayOpen() && isActive()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'attachment-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick()\"\n (detach)=\"closeOverlay()\">\n <div \n class=\"attachment-menu-overlay\" \n [style.width.px]=\"columnWidth() || config().columnWidth || 300\" \n [style.min-width.px]=\"300\"\n (click)=\"onOverlayClick($event)\">\n <div class=\"attachment-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header Section -->\n <div class=\"attachment-header\">\n <span class=\"attachment-title\">Add or Drag files</span>\n <button \n mat-flat-button \n (click)=\"onUploadClick(); $event.stopPropagation()\" \n class=\"attachment-upload-btn\"\n [disabled]=\"config().disabled || !isEditable()\">\n Upload\n </button>\n </div>\n \n <!-- Drop zone -->\n <div \n class=\"attachment-drop-zone\" \n (drop)=\"onFileDrop($event)\" \n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\"\n (paste)=\"onPaste($event)\"\n (click)=\"onUploadClick(); $event.stopPropagation()\"\n [class.dragging]=\"isDragging()\">\n <div class=\"attachment-drop-content\">\n <div class=\"attachment-drop-icon\">+</div>\n <div class=\"attachment-drop-text\">\n <div class=\"primary-text\">Click to upload or drag files here</div>\n <div class=\"secondary-text\">Support multiple files</div>\n </div>\n </div>\n </div>\n \n <!-- Hidden file input -->\n <input \n #fileInput\n type=\"file\" \n multiple \n (change)=\"onFileInputChange($event)\" \n style=\"display: none;\">\n \n <!-- File list -->\n @if (hasFiles()) {\n <div class=\"attachment-file-list\">\n @for (file of currentValue(); track trackByFile($index, file)) {\n <div class=\"attachment-file-item\">\n <div class=\"file-info\">\n <span class=\"file-icon\">\uD83D\uDCCE</span>\n <span class=\"file-name\">{{ getFileName(file) }}</span>\n </div>\n <div class=\"file-actions\">\n <button \n class=\"action-btn\" \n (click)=\"viewFile(file, $event)\" \n title=\"View\"\n type=\"button\">\n \uD83D\uDC41\uFE0F\n </button>\n <button \n class=\"action-btn\" \n (click)=\"deleteFile(file, $event)\" \n title=\"Delete\"\n type=\"button\">\n \uD83D\uDDD1\uFE0F\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </ng-template>\n</div>\n\n", styles: [".attachment-overlay-container{width:100%;height:100%}.attachment-cell-wrapper{display:flex;align-items:center;justify-content:center;padding:4px;min-height:32px;cursor:default}.attachment-cell-wrapper.attachment-display-editable{cursor:pointer}.attachment-cell-wrapper.attachment-display-editable:hover{background-color:#0000000a}.cell-attachment-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.drillable-value{display:flex;align-items:center;justify-content:center;cursor:pointer}.drillable-value svg{text-decoration:none}.drillable-value:hover{opacity:.8}.attachment-backdrop{background:transparent}.attachment-menu-overlay{background:#fff;border-radius:8px;box-shadow:0 4px 12px #00000026;overflow:hidden;position:relative;z-index:1000}.attachment-container{padding:16px}.attachment-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.attachment-title{font-size:var(--grid-font-size-body, 12px);font-weight:500;color:var(--grid-on-surface, #1c1b1f)}.attachment-upload-btn{font-size:var(--grid-font-size-body, 12px)!important;min-width:50px}.attachment-drop-zone{border:2px dashed var(--grid-outline-variant, #cac4d0);border-radius:8px;padding:40px 20px;text-align:center;cursor:pointer;transition:all .3s ease;background:var(--grid-surface-variant, #e7e0ec);margin:16px 0}.attachment-drop-zone:hover{border-color:var(--grid-primary, #6750a4);background:var(--grid-surface-container, #f3edf7)}.attachment-drop-zone.dragging{border-color:var(--grid-primary, #6750a4);background:var(--grid-surface-container, #f3edf7);transform:scale(1.01)}.attachment-drop-content{display:flex;flex-direction:column;align-items:center;gap:12px}.attachment-drop-icon{font-size:48px;color:var(--grid-primary, #6750a4);font-weight:300;line-height:1}.attachment-drop-text .primary-text{font-family:var(--grid-font-family, \"Poppins\");font-size:14px;color:var(--grid-on-surface-variant, #49454f);font-weight:400;margin:0}.attachment-drop-text .secondary-text{font-family:var(--grid-font-family, \"Poppins\");font-size:12px;color:var(--grid-on-surface-variant, #49454f);margin-top:4px;display:block}.attachment-file-list{display:block;margin-top:16px;max-height:300px;overflow-y:auto}.attachment-file-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-radius:4px;margin-bottom:8px;background:var(--grid-surface-variant, #e7e0ec);transition:background-color .2s}.attachment-file-item:hover{background:var(--grid-surface-container, #f3edf7)}.file-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.file-icon{font-size:16px;flex-shrink:0}.file-name{font-size:var(--grid-font-size-body, 12px);color:var(--grid-on-surface, #1c1b1f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-actions{display:flex;gap:8px;flex-shrink:0}.action-btn{background:none;border:none;cursor:pointer;padding:4px 8px;border-radius:4px;font-size:var(--grid-font-size-body, 12px);transition:background-color .2s}.action-btn:hover{background-color:#0000001a}.action-btn:active{background-color:#0003}.action-btn:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4$3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4$3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
8120
8132
|
}
|
|
8121
8133
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: AttachmentComponent, decorators: [{
|
|
8122
8134
|
type: Component,
|
|
@@ -8172,14 +8184,49 @@ class DataCellComponent {
|
|
|
8172
8184
|
replaceZeroValue = undefined;
|
|
8173
8185
|
td = model(...(ngDevMode ? [undefined, { debugName: "td" }] : []));
|
|
8174
8186
|
currentValue = signal(null, ...(ngDevMode ? [{ debugName: "currentValue" }] : []));
|
|
8187
|
+
initialValueBeforeEdit = null;
|
|
8188
|
+
isEditing = false;
|
|
8175
8189
|
drillable = input(false, ...(ngDevMode ? [{ debugName: "drillable" }] : []));
|
|
8176
8190
|
mode = input('', ...(ngDevMode ? [{ debugName: "mode" }] : []));
|
|
8177
8191
|
isEditable = input(false, ...(ngDevMode ? [{ debugName: "isEditable" }] : []));
|
|
8192
|
+
row = input(null, ...(ngDevMode ? [{ debugName: "row" }] : []));
|
|
8193
|
+
notifyStoreOfValueChange(oldValue, newValue) {
|
|
8194
|
+
if (oldValue === newValue)
|
|
8195
|
+
return;
|
|
8196
|
+
this.eruGridStore().setCellValueChange({
|
|
8197
|
+
oldValue,
|
|
8198
|
+
newValue,
|
|
8199
|
+
fieldName: this.columnName(),
|
|
8200
|
+
rowId: this.row()?.entity_id || this.id().toString(),
|
|
8201
|
+
row: this.row()
|
|
8202
|
+
});
|
|
8203
|
+
}
|
|
8178
8204
|
constructor() {
|
|
8179
8205
|
effect(() => {
|
|
8180
8206
|
const columnWidth = this.currentColumnWidth();
|
|
8181
8207
|
this.formattedMultiSelectValue(columnWidth);
|
|
8182
8208
|
});
|
|
8209
|
+
// Effect to handle edit session: capture initial value and notify on end
|
|
8210
|
+
effect(() => {
|
|
8211
|
+
const active = this.isActive();
|
|
8212
|
+
if (active && !this.isEditing) {
|
|
8213
|
+
// Enters edit mode
|
|
8214
|
+
this.isEditing = true;
|
|
8215
|
+
// Deep copy of current value (especially for arrays like people/tags)
|
|
8216
|
+
const currentVal = this.currentValue();
|
|
8217
|
+
this.initialValueBeforeEdit = Array.isArray(currentVal) ? [...currentVal] : currentVal;
|
|
8218
|
+
}
|
|
8219
|
+
else if (!active && this.isEditing) {
|
|
8220
|
+
// Exits edit mode
|
|
8221
|
+
this.isEditing = false;
|
|
8222
|
+
const newValue = this.currentValue();
|
|
8223
|
+
// Only notify if value has actually changed
|
|
8224
|
+
if (this.hasValueChanged(this.initialValueBeforeEdit, newValue)) {
|
|
8225
|
+
this.notifyStoreOfValueChange(this.initialValueBeforeEdit, newValue);
|
|
8226
|
+
}
|
|
8227
|
+
this.initialValueBeforeEdit = null;
|
|
8228
|
+
}
|
|
8229
|
+
});
|
|
8183
8230
|
// Watch for changes in the value input and update currentValue accordingly
|
|
8184
8231
|
effect(() => {
|
|
8185
8232
|
const value = this.value();
|
|
@@ -8204,10 +8251,23 @@ class DataCellComponent {
|
|
|
8204
8251
|
}
|
|
8205
8252
|
});
|
|
8206
8253
|
}
|
|
8254
|
+
hasValueChanged(oldVal, newVal) {
|
|
8255
|
+
if (Array.isArray(oldVal) && Array.isArray(newVal)) {
|
|
8256
|
+
if (oldVal.length !== newVal.length)
|
|
8257
|
+
return true;
|
|
8258
|
+
return JSON.stringify([...oldVal].sort()) !== JSON.stringify([...newVal].sort());
|
|
8259
|
+
}
|
|
8260
|
+
return oldVal !== newVal;
|
|
8261
|
+
}
|
|
8207
8262
|
// Currency component configuration
|
|
8208
|
-
// Event handlers
|
|
8209
|
-
|
|
8263
|
+
// Event handlers
|
|
8264
|
+
onValueChange(value) {
|
|
8210
8265
|
this.currentValue.set(value);
|
|
8266
|
+
// Some types need immediate validation feedback
|
|
8267
|
+
const typesNeedingValidation = ['textbox', 'email', 'textarea', 'website', 'location'];
|
|
8268
|
+
if (typesNeedingValidation.includes(this.columnDatatype())) {
|
|
8269
|
+
this.validateField(value, false);
|
|
8270
|
+
}
|
|
8211
8271
|
}
|
|
8212
8272
|
onCurrencyBlur(value) {
|
|
8213
8273
|
this.currentValue.set(value);
|
|
@@ -8222,9 +8282,6 @@ class DataCellComponent {
|
|
|
8222
8282
|
this.handleDrilldown(value);
|
|
8223
8283
|
}
|
|
8224
8284
|
// Number component configuration and handlers
|
|
8225
|
-
onNumberValueChange(value) {
|
|
8226
|
-
this.currentValue.set(value);
|
|
8227
|
-
}
|
|
8228
8285
|
onNumberBlurHandler(value) {
|
|
8229
8286
|
this.currentValue.set(value);
|
|
8230
8287
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8238,11 +8295,6 @@ class DataCellComponent {
|
|
|
8238
8295
|
this.handleDrilldown(value);
|
|
8239
8296
|
}
|
|
8240
8297
|
// Textbox component handlers
|
|
8241
|
-
onTextboxValueChange(value) {
|
|
8242
|
-
this.currentValue.set(value);
|
|
8243
|
-
// Validate and clear error if value becomes valid (without deactivating the cell)
|
|
8244
|
-
this.validateField(value, false);
|
|
8245
|
-
}
|
|
8246
8298
|
onTextboxBlur(value) {
|
|
8247
8299
|
this.currentValue.set(value);
|
|
8248
8300
|
// Only deactivate if validation passes
|
|
@@ -8271,11 +8323,6 @@ class DataCellComponent {
|
|
|
8271
8323
|
this.handleDrilldown(value);
|
|
8272
8324
|
}
|
|
8273
8325
|
// Email component handlers
|
|
8274
|
-
onEmailValueChange(value) {
|
|
8275
|
-
this.currentValue.set(value);
|
|
8276
|
-
// Validate and clear error if value becomes valid (without deactivating the cell)
|
|
8277
|
-
this.validateField(value, false);
|
|
8278
|
-
}
|
|
8279
8326
|
onEmailBlurHandler(value) {
|
|
8280
8327
|
this.currentValue.set(value);
|
|
8281
8328
|
// Only deactivate if validation passes
|
|
@@ -8304,11 +8351,6 @@ class DataCellComponent {
|
|
|
8304
8351
|
this.handleDrilldown(value);
|
|
8305
8352
|
}
|
|
8306
8353
|
// Textarea component handlers
|
|
8307
|
-
onTextareaValueChange(value) {
|
|
8308
|
-
this.currentValue.set(value);
|
|
8309
|
-
// Validate and clear error if value becomes valid (without deactivating the cell)
|
|
8310
|
-
this.validateField(value, false);
|
|
8311
|
-
}
|
|
8312
8354
|
onTextareaBlur(value) {
|
|
8313
8355
|
this.currentValue.set(value);
|
|
8314
8356
|
// Only deactivate if validation passes
|
|
@@ -8337,11 +8379,6 @@ class DataCellComponent {
|
|
|
8337
8379
|
this.handleDrilldown(value);
|
|
8338
8380
|
}
|
|
8339
8381
|
// Website component handlers
|
|
8340
|
-
onWebsiteValueChange(value) {
|
|
8341
|
-
this.currentValue.set(value);
|
|
8342
|
-
// Validate and clear error if value becomes valid (without deactivating the cell)
|
|
8343
|
-
this.validateField(value, false);
|
|
8344
|
-
}
|
|
8345
8382
|
onWebsiteBlur(value) {
|
|
8346
8383
|
this.currentValue.set(value);
|
|
8347
8384
|
// Only deactivate if validation passes
|
|
@@ -8370,11 +8407,6 @@ class DataCellComponent {
|
|
|
8370
8407
|
this.handleDrilldown(value);
|
|
8371
8408
|
}
|
|
8372
8409
|
// Location component handlers
|
|
8373
|
-
onLocationValueChange(value) {
|
|
8374
|
-
this.currentValue.set(value);
|
|
8375
|
-
// Validate and clear error if value becomes valid (without deactivating the cell)
|
|
8376
|
-
this.validateField(value, false);
|
|
8377
|
-
}
|
|
8378
8410
|
onLocationBlurHandler(value) {
|
|
8379
8411
|
this.currentValue.set(value);
|
|
8380
8412
|
// Only deactivate if validation passes
|
|
@@ -8403,9 +8435,6 @@ class DataCellComponent {
|
|
|
8403
8435
|
this.handleDrilldown(value);
|
|
8404
8436
|
}
|
|
8405
8437
|
// Checkbox component handlers
|
|
8406
|
-
onCheckboxValueChange(value) {
|
|
8407
|
-
this.currentValue.set(value);
|
|
8408
|
-
}
|
|
8409
8438
|
onCheckboxBlur(value) {
|
|
8410
8439
|
this.currentValue.set(value);
|
|
8411
8440
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8419,9 +8448,6 @@ class DataCellComponent {
|
|
|
8419
8448
|
this.handleDrilldown(value);
|
|
8420
8449
|
}
|
|
8421
8450
|
// Date component handlers
|
|
8422
|
-
onDateValueChange(value) {
|
|
8423
|
-
this.currentValue.set(value);
|
|
8424
|
-
}
|
|
8425
8451
|
onDateEditModeChange(isActive) {
|
|
8426
8452
|
if (isActive && this.mode() === 'table') {
|
|
8427
8453
|
this.eruGridStore().setActiveCell(this.el.nativeElement);
|
|
@@ -8431,9 +8457,6 @@ class DataCellComponent {
|
|
|
8431
8457
|
this.handleDrilldown(value);
|
|
8432
8458
|
}
|
|
8433
8459
|
// Datetime component handlers
|
|
8434
|
-
onDatetimeValueChange(value) {
|
|
8435
|
-
this.currentValue.set(value);
|
|
8436
|
-
}
|
|
8437
8460
|
onDatetimeEditModeChange(isActive) {
|
|
8438
8461
|
if (isActive && this.mode() === 'table') {
|
|
8439
8462
|
this.eruGridStore().setActiveCell(this.el.nativeElement);
|
|
@@ -8443,9 +8466,6 @@ class DataCellComponent {
|
|
|
8443
8466
|
this.handleDrilldown(value);
|
|
8444
8467
|
}
|
|
8445
8468
|
// Duration component handlers
|
|
8446
|
-
onDurationValueChange(value) {
|
|
8447
|
-
this.currentValue.set(value);
|
|
8448
|
-
}
|
|
8449
8469
|
onDurationBlur(value) {
|
|
8450
8470
|
this.currentValue.set(value);
|
|
8451
8471
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8459,9 +8479,6 @@ class DataCellComponent {
|
|
|
8459
8479
|
this.handleDrilldown(value);
|
|
8460
8480
|
}
|
|
8461
8481
|
// Phone component handlers
|
|
8462
|
-
onPhoneValueChange(value) {
|
|
8463
|
-
this.currentValue.set(value);
|
|
8464
|
-
}
|
|
8465
8482
|
onPhoneBlur(value) {
|
|
8466
8483
|
this.currentValue.set(value);
|
|
8467
8484
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8479,9 +8496,6 @@ class DataCellComponent {
|
|
|
8479
8496
|
const config = this.columnCellConfiguration();
|
|
8480
8497
|
return config;
|
|
8481
8498
|
}, ...(ngDevMode ? [{ debugName: "getSelectConfig" }] : []));
|
|
8482
|
-
onSelectValueChange(value) {
|
|
8483
|
-
this.currentValue.set(value);
|
|
8484
|
-
}
|
|
8485
8499
|
onSelectBlur(value) {
|
|
8486
8500
|
this.currentValue.set(value);
|
|
8487
8501
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8518,9 +8532,6 @@ class DataCellComponent {
|
|
|
8518
8532
|
options: options
|
|
8519
8533
|
};
|
|
8520
8534
|
}, ...(ngDevMode ? [{ debugName: "getStatusConfig" }] : []));
|
|
8521
|
-
onStatusValueChange(value) {
|
|
8522
|
-
this.currentValue.set(value);
|
|
8523
|
-
}
|
|
8524
8535
|
onStatusBlur(value) {
|
|
8525
8536
|
this.currentValue.set(value);
|
|
8526
8537
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8541,9 +8552,6 @@ class DataCellComponent {
|
|
|
8541
8552
|
}
|
|
8542
8553
|
return config;
|
|
8543
8554
|
}, ...(ngDevMode ? [{ debugName: "getTagConfig" }] : []));
|
|
8544
|
-
onTagValueChange(value) {
|
|
8545
|
-
this.currentValue.set(value);
|
|
8546
|
-
}
|
|
8547
8555
|
onTagBlur(value) {
|
|
8548
8556
|
this.currentValue.set(value);
|
|
8549
8557
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8561,9 +8569,6 @@ class DataCellComponent {
|
|
|
8561
8569
|
const config = this.columnCellConfiguration();
|
|
8562
8570
|
return config;
|
|
8563
8571
|
}, ...(ngDevMode ? [{ debugName: "getPeopleConfig" }] : []));
|
|
8564
|
-
onPeopleValueChange(value) {
|
|
8565
|
-
this.currentValue.set(value);
|
|
8566
|
-
}
|
|
8567
8572
|
onPeopleBlur(value) {
|
|
8568
8573
|
this.currentValue.set(value);
|
|
8569
8574
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8584,9 +8589,6 @@ class DataCellComponent {
|
|
|
8584
8589
|
}
|
|
8585
8590
|
return config;
|
|
8586
8591
|
}, ...(ngDevMode ? [{ debugName: "getPriorityConfig" }] : []));
|
|
8587
|
-
onPriorityValueChange(value) {
|
|
8588
|
-
this.currentValue.set(value);
|
|
8589
|
-
}
|
|
8590
8592
|
onPriorityBlur(value) {
|
|
8591
8593
|
this.currentValue.set(value);
|
|
8592
8594
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8614,9 +8616,6 @@ class DataCellComponent {
|
|
|
8614
8616
|
columnWidth: config?.column_width || this.currentColumnWidth()
|
|
8615
8617
|
};
|
|
8616
8618
|
}, ...(ngDevMode ? [{ debugName: "getAttachmentConfig" }] : []));
|
|
8617
|
-
onAttachmentValueChange(value) {
|
|
8618
|
-
this.currentValue.set(value);
|
|
8619
|
-
}
|
|
8620
8619
|
onAttachmentBlur(value) {
|
|
8621
8620
|
this.currentValue.set(value);
|
|
8622
8621
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8630,9 +8629,6 @@ class DataCellComponent {
|
|
|
8630
8629
|
this.handleDrilldown(value);
|
|
8631
8630
|
}
|
|
8632
8631
|
// Progress component handlers
|
|
8633
|
-
onProgressValueChange(value) {
|
|
8634
|
-
this.currentValue.set(value);
|
|
8635
|
-
}
|
|
8636
8632
|
onProgressBlur(value) {
|
|
8637
8633
|
this.currentValue.set(value);
|
|
8638
8634
|
this.eruGridStore().setActiveCell(null);
|
|
@@ -8657,9 +8653,6 @@ class DataCellComponent {
|
|
|
8657
8653
|
emojiValue: config?.emoji_value || 'star'
|
|
8658
8654
|
};
|
|
8659
8655
|
}, ...(ngDevMode ? [{ debugName: "getRatingConfig" }] : []));
|
|
8660
|
-
onRatingValueChange(value) {
|
|
8661
|
-
this.currentValue.set(value);
|
|
8662
|
-
}
|
|
8663
8656
|
onRatingEditModeChange(isActive) {
|
|
8664
8657
|
if (isActive && this.mode() === 'table') {
|
|
8665
8658
|
this.eruGridStore().setActiveCell(this.el.nativeElement);
|
|
@@ -8833,7 +8826,6 @@ class DataCellComponent {
|
|
|
8833
8826
|
onDrillableClick(event) {
|
|
8834
8827
|
if (this.drillable()) {
|
|
8835
8828
|
event.stopPropagation();
|
|
8836
|
-
console.log('drillable click', this.id(), this.currentValue());
|
|
8837
8829
|
// Handle drillable click - you can emit an event or call a service here
|
|
8838
8830
|
const idSplit = this.id().toString().replace('pivot_', '').replace('_default|', '');
|
|
8839
8831
|
// Split on first underscore to get first part and rest
|
|
@@ -8841,13 +8833,6 @@ class DataCellComponent {
|
|
|
8841
8833
|
const columnValues = columnName.join('_');
|
|
8842
8834
|
const columnValuesSplit = columnValues.split('|');
|
|
8843
8835
|
const colName = columnValuesSplit[columnValuesSplit.length - 1];
|
|
8844
|
-
console.log({
|
|
8845
|
-
frozenGrandTotalCell: this.frozenGrandTotalCell(),
|
|
8846
|
-
columnName: colName,
|
|
8847
|
-
rowId: rowId,
|
|
8848
|
-
columnValue: this.currentValue()
|
|
8849
|
-
});
|
|
8850
|
-
console.log(columnValues);
|
|
8851
8836
|
this.eruGridStore().setDrilldown({
|
|
8852
8837
|
frozenGrandTotalCell: this.frozenGrandTotalCell(),
|
|
8853
8838
|
columnName: colName,
|
|
@@ -8886,7 +8871,6 @@ class DataCellComponent {
|
|
|
8886
8871
|
}
|
|
8887
8872
|
}
|
|
8888
8873
|
catch (error) {
|
|
8889
|
-
console.log("Could not set cursor position for input type:", matInput.type, error);
|
|
8890
8874
|
// Final fallback: try to use value manipulation
|
|
8891
8875
|
try {
|
|
8892
8876
|
const currentValue = matInput.value;
|
|
@@ -8895,7 +8879,6 @@ class DataCellComponent {
|
|
|
8895
8879
|
matInput.setSelectionRange(0, 0);
|
|
8896
8880
|
}
|
|
8897
8881
|
catch (fallbackError) {
|
|
8898
|
-
console.log("All cursor positioning methods failed:", fallbackError);
|
|
8899
8882
|
}
|
|
8900
8883
|
}
|
|
8901
8884
|
}
|
|
@@ -8905,7 +8888,6 @@ class DataCellComponent {
|
|
|
8905
8888
|
setTimeout(tryFocus, 25);
|
|
8906
8889
|
}
|
|
8907
8890
|
else {
|
|
8908
|
-
console.log("Could not find visible input element after", maxAttempts, "attempts");
|
|
8909
8891
|
}
|
|
8910
8892
|
};
|
|
8911
8893
|
// Start trying to focus after allowing Angular to update the DOM
|
|
@@ -9004,7 +8986,6 @@ class DataCellComponent {
|
|
|
9004
8986
|
openDatePicker() {
|
|
9005
8987
|
}
|
|
9006
8988
|
selectedMultiSelect(event) {
|
|
9007
|
-
console.log('selectedMultiSelect event:', event);
|
|
9008
8989
|
// Handle edge cases
|
|
9009
8990
|
if (!event || !Array.isArray(event)) {
|
|
9010
8991
|
console.warn('Invalid event received:', event);
|
|
@@ -9021,7 +9002,6 @@ class DataCellComponent {
|
|
|
9021
9002
|
}
|
|
9022
9003
|
}
|
|
9023
9004
|
appendMultiSelect(event) {
|
|
9024
|
-
console.log(event);
|
|
9025
9005
|
const currentValues = this.currentValue();
|
|
9026
9006
|
if (Array.isArray(currentValues)) {
|
|
9027
9007
|
if (currentValues.includes(event)) {
|
|
@@ -9285,7 +9265,6 @@ class DataCellComponent {
|
|
|
9285
9265
|
toggleOverlayMenu(event) {
|
|
9286
9266
|
event.stopPropagation();
|
|
9287
9267
|
this.isOpen = !this.isOpen;
|
|
9288
|
-
console.log('toggleOverlayMenu', this.getCellId());
|
|
9289
9268
|
this.overlayMenuService.toggleOverlayMenu(this.getCellId());
|
|
9290
9269
|
}
|
|
9291
9270
|
closeOverlayMenu() {
|
|
@@ -9304,11 +9283,9 @@ class DataCellComponent {
|
|
|
9304
9283
|
}
|
|
9305
9284
|
viewFile(file) {
|
|
9306
9285
|
// TODO: Implement file viewing functionality
|
|
9307
|
-
console.log('View file:', file);
|
|
9308
9286
|
}
|
|
9309
9287
|
deleteFile(file) {
|
|
9310
9288
|
// TODO: Implement file deletion functionality
|
|
9311
|
-
console.log('Delete file:', file);
|
|
9312
9289
|
const currentFiles = this.currentValue() || [];
|
|
9313
9290
|
const updatedFiles = currentFiles.filter((f) => f !== file);
|
|
9314
9291
|
this.currentValue.set(updatedFiles);
|
|
@@ -9348,7 +9325,6 @@ class DataCellComponent {
|
|
|
9348
9325
|
this.upload(base64Content, newFileName);
|
|
9349
9326
|
this.currentValue().push(newFileName);
|
|
9350
9327
|
this.cdr.detectChanges();
|
|
9351
|
-
console.log(this.currentValue());
|
|
9352
9328
|
};
|
|
9353
9329
|
reader.readAsDataURL(file);
|
|
9354
9330
|
}
|
|
@@ -9372,10 +9348,8 @@ class DataCellComponent {
|
|
|
9372
9348
|
}
|
|
9373
9349
|
fileInputChange(e) {
|
|
9374
9350
|
debugger;
|
|
9375
|
-
console.log(e, 'file');
|
|
9376
9351
|
Array.from(e.target.files).forEach((file) => {
|
|
9377
9352
|
this.processFile(file);
|
|
9378
|
-
console.log(file, 'file');
|
|
9379
9353
|
});
|
|
9380
9354
|
}
|
|
9381
9355
|
view(file, FNAME) {
|
|
@@ -9493,14 +9467,13 @@ class DataCellComponent {
|
|
|
9493
9467
|
}
|
|
9494
9468
|
}
|
|
9495
9469
|
getColumnName() {
|
|
9496
|
-
//console.log(this.getColumnValue())
|
|
9497
9470
|
//const columnValue = this.getColumnValue().replace('default|', '');
|
|
9498
9471
|
//const columnValues = columnValue.split('|')
|
|
9499
9472
|
//const colName = columnValues[columnValues.length - 1]
|
|
9500
9473
|
return this.getColumnValue()?.replace('default|', '') || '';
|
|
9501
9474
|
}
|
|
9502
9475
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DataCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9503
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: DataCellComponent, isStandalone: true, selector: "data-cell", inputs: { eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: true, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: true, transformFunction: null }, columnDatatype: { classPropertyName: "columnDatatype", publicName: "columnDatatype", isSignal: true, isRequired: true, transformFunction: null }, columnName: { classPropertyName: "columnName", publicName: "columnName", isSignal: true, isRequired: true, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, frozenGrandTotalCell: { classPropertyName: "frozenGrandTotalCell", publicName: "frozenGrandTotalCell", isSignal: true, isRequired: false, transformFunction: null }, td: { classPropertyName: "td", publicName: "td", isSignal: true, isRequired: false, transformFunction: null }, drillable: { classPropertyName: "drillable", publicName: "drillable", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { td: "tdChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "data-cell-component" }, providers: [MatDatepickerModule,
|
|
9476
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: DataCellComponent, isStandalone: true, selector: "data-cell", inputs: { eruGridStore: { classPropertyName: "eruGridStore", publicName: "eruGridStore", isSignal: true, isRequired: true, transformFunction: null }, fieldSize: { classPropertyName: "fieldSize", publicName: "fieldSize", isSignal: true, isRequired: true, transformFunction: null }, columnDatatype: { classPropertyName: "columnDatatype", publicName: "columnDatatype", isSignal: true, isRequired: true, transformFunction: null }, columnName: { classPropertyName: "columnName", publicName: "columnName", isSignal: true, isRequired: true, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, frozenGrandTotalCell: { classPropertyName: "frozenGrandTotalCell", publicName: "frozenGrandTotalCell", isSignal: true, isRequired: false, transformFunction: null }, td: { classPropertyName: "td", publicName: "td", isSignal: true, isRequired: false, transformFunction: null }, drillable: { classPropertyName: "drillable", publicName: "drillable", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null }, row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { td: "tdChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "data-cell-component" }, providers: [MatDatepickerModule,
|
|
9504
9477
|
MatNativeDateModule,
|
|
9505
9478
|
DatePipe,
|
|
9506
9479
|
{
|
|
@@ -9508,7 +9481,7 @@ class DataCellComponent {
|
|
|
9508
9481
|
useValue: cellValidators
|
|
9509
9482
|
},
|
|
9510
9483
|
...MATERIAL_PROVIDERS
|
|
9511
|
-
], viewQueries: [{ propertyName: "attachmentTrigger", first: true, predicate: ["attachmentTrigger"], descendants: true }, { propertyName: "singleSelectTrigger", first: true, predicate: ["singleSelectTrigger"], descendants: true }, { propertyName: "multiSelectTrigger", first: true, predicate: ["multiSelectTrigger"], descendants: true }, { propertyName: "peopleTrigger", first: true, predicate: ["peopleTrigger"], descendants: true }], ngImport: i0, template: "<div class=\"container\">\n @switch (columnDatatype()) {\n @case ('textbox') {\n <eru-textbox\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onTextboxValueChange($event)\"\n (blur)=\"onTextboxBlur($event)\"\n (editModeChange)=\"onTextboxEditModeChange($event)\"\n (drilldownClick)=\"onTextboxDrilldown($event)\">\n </eru-textbox>\n }\n @case ('currency') {\n <eru-currency \n [value]=\"currentValue()\" \n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\"\n (valueChange)=\"onCurrencyValueChange($event)\"\n (blur)=\"onCurrencyBlur($event)\"\n (editModeChange)=\"onCurrencyEditModeChange($event)\"\n (drilldownClick)=\"onCurrencyDrilldown($event)\">\n </eru-currency>\n }\n @case ('number') {\n <eru-number\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\"\n (valueChange)=\"onNumberValueChange($event)\"\n (blur)=\"onNumberBlurHandler($event)\"\n (editModeChange)=\"onNumberEditModeChange($event)\"\n (drilldownClick)=\"onNumberDrilldown($event)\">\n </eru-number>\n }\n @case ('location') {\n <eru-location\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onLocationValueChange($event)\"\n (blur)=\"onLocationBlurHandler($event)\"\n (editModeChange)=\"onLocationEditModeChange($event)\"\n (drilldownClick)=\"onLocationDrilldown($event)\">\n </eru-location>\n }\n @case ('email') {\n <eru-email\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onEmailValueChange($event)\"\n (blur)=\"onEmailBlurHandler($event)\"\n (editModeChange)=\"onEmailEditModeChange($event)\"\n (drilldownClick)=\"onEmailDrilldown($event)\">\n </eru-email>\n }\n @case ('textarea') {\n <eru-textarea\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onTextareaValueChange($event)\"\n (blur)=\"onTextareaBlur($event)\"\n (editModeChange)=\"onTextareaEditModeChange($event)\"\n (drilldownClick)=\"onTextareaDrilldown($event)\">\n </eru-textarea>\n }\n @case ('website') {\n <eru-website\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onWebsiteValueChange($event)\"\n (blur)=\"onWebsiteBlur($event)\"\n (editModeChange)=\"onWebsiteEditModeChange($event)\"\n (drilldownClick)=\"onWebsiteDrilldown($event)\">\n </eru-website>\n }\n <!-- @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}</span>\n } @else {\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n }\n </div>\n } -->\n\n <!-- @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" cdkOverlayOrigin #singleSelectTrigger=\"cdkOverlayOrigin\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n } -->\n\n @case ('checkbox') {\n <eru-checkbox\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onCheckboxValueChange($event)\"\n (blur)=\"onCheckboxBlur($event)\"\n (editModeChange)=\"onCheckboxEditModeChange($event)\"\n (drilldownClick)=\"onCheckboxDrilldown($event)\">\n </eru-checkbox>\n }\n\n @case ('people') {\n <eru-people\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onPeopleValueChange($event)\"\n (blur)=\"onPeopleBlur($event)\"\n (editModeChange)=\"onPeopleEditModeChange($event)\"\n (drilldownClick)=\"onPeopleDrilldown($event)\">\n </eru-people>\n }\n\n\n @case ('date') {\n <eru-date\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDateValueChange($event)\"\n (editModeChange)=\"onDateEditModeChange($event)\"\n (drilldownClick)=\"onDateDrilldown($event)\">\n </eru-date>\n }\n\n @case ('datetime') {\n <eru-datetime\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDatetimeValueChange($event)\"\n (editModeChange)=\"onDatetimeEditModeChange($event)\"\n (drilldownClick)=\"onDatetimeDrilldown($event)\">\n </eru-datetime>\n }\n\n @case ('duration') {\n <eru-duration\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDurationValueChange($event)\"\n (blur)=\"onDurationBlur($event)\"\n (editModeChange)=\"onDurationEditModeChange($event)\"\n (drilldownClick)=\"onDurationDrilldown($event)\">\n </eru-duration>\n }\n\n\n @case ('priority') {\n <eru-priority\n [value]=\"currentValue()\"\n [config]=\"getPriorityConfig()\"\n [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onPriorityValueChange($event)\"\n (blur)=\"onPriorityBlur($event)\"\n (editModeChange)=\"onPriorityEditModeChange($event)\"\n (drilldownClick)=\"onPriorityDrilldown($event)\">\n </eru-priority>\n }\n @case ('progress') {\n <eru-progress\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onProgressValueChange($event)\"\n (blur)=\"onProgressBlur($event)\"\n (focus)=\"onProgressFocus()\"\n (editModeChange)=\"onProgressEditModeChange($event)\"\n (drilldownClick)=\"onProgressDrilldown($event)\">\n </eru-progress>\n }\n\n @case ('rating') {\n <eru-rating\n [value]=\"currentValue()\"\n [config]=\"getRatingConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n (valueChange)=\"onRatingValueChange($event)\"\n (editModeChange)=\"onRatingEditModeChange($event)\">\n </eru-rating>\n }\n\n @case ('status') {\n <eru-status\n [value]=\"currentValue()\"\n [config]=\"getStatusConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onStatusValueChange($event)\"\n (blur)=\"onStatusBlur($event)\"\n (editModeChange)=\"onStatusEditModeChange($event)\"\n (drilldownClick)=\"onStatusDrilldown($event)\">\n </eru-status>\n }\n\n @case ('tag') {\n <eru-tag\n [value]=\"currentValue()\"\n [config]=\"getTagConfig()\"\n [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onTagValueChange($event)\"\n (blur)=\"onTagBlur($event)\"\n (editModeChange)=\"onTagEditModeChange($event)\"\n (drilldownClick)=\"onTagDrilldown($event)\">\n </eru-tag>\n }\n\n @case ('phone') {\n <eru-phone\n [value]=\"currentValue()\"\n [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n (valueChange)=\"onPhoneValueChange($event)\"\n (blur)=\"onPhoneBlur($event)\"\n (editModeChange)=\"onPhoneEditModeChange($event)\"\n (drilldownClick)=\"onPhoneDrilldown($event)\">\n </eru-phone>\n }\n\n @case ('dropdown_single_select') {\n <eru-select\n [value]=\"currentValue()\"\n [config]=\"getSelectConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [multiple]=\"false\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onSelectValueChange($event)\"\n (blur)=\"onSelectBlur($event)\"\n (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n @case ('dropdown_multi_select') {\n <eru-select\n [value]=\"currentValue()\"\n [config]=\"getSelectConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [multiple]=\"true\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onSelectValueChange($event)\"\n (blur)=\"onSelectBlur($event)\"\n (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n } \n\n @case ('attachment') {\n <eru-attachment\n [value]=\"currentValue()\"\n [config]=\"getAttachmentConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n (valueChange)=\"onAttachmentValueChange($event)\"\n (blur)=\"onAttachmentBlur($event)\"\n (editModeChange)=\"onAttachmentEditModeChange($event)\"\n (drilldownClick)=\"onAttachmentDrilldown($event)\">\n </eru-attachment>\n }\n @default {\n <div class=\"cell-default-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{value()}}</span>\n } @else {\n {{value()}}\n }\n </div>\n }\n }\n\n</div>\n\n\n<!-- <ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"singleSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_single_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_single_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" (click)=\"$event.stopPropagation()\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\">\n </mat-form-field>\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"'None'\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of filteredOptions(); track option.value || option.name) {\n <li [cdkOption]=\"option.value || option.name\" class=\"listbox-option notext-overflow\">\n {{option.label || option.name}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->\n\n<!-- <ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"multiSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_multi_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_multi_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (click)=\"$event.stopPropagation()\">\n </mat-form-field>\n \n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n \n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\" (click)=\"$event.stopPropagation()\">\n <li [cdkOption]=\"'None'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('None')\" (click)=\"$event.stopPropagation();appendMultiSelect('None')\"></mat-checkbox>\n <span class=\"option-text\">None</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 1')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 1')\"></mat-checkbox>\n <span class=\"option-text\">option 1</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 2')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 2')\"></mat-checkbox>\n <span class=\"option-text\">option 2</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 3')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 3')\"></mat-checkbox>\n <span class=\"option-text\">option 3</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 4')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 4')\"></mat-checkbox>\n <span class=\"option-text\">option 4</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 5'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 5')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 5')\"></mat-checkbox>\n <span class=\"option-text\">option 5</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 6'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 6')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 6')\"></mat-checkbox>\n <span class=\"option-text\">option 6</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 7'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 7')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 7')\"></mat-checkbox>\n <span class=\"option-text\">option 7</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 8'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 8')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 8')\"></mat-checkbox>\n <span class=\"option-text\">option 8</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 9'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 9')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 9')\"></mat-checkbox>\n <span class=\"option-text\">option 9</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 10'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 10')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 10')\"></mat-checkbox>\n <span class=\"option-text\">option 10</span>\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected(option.value)\" (click)=\"$event.stopPropagation();appendMultiSelect(option.value)\"></mat-checkbox>\n <span class=\"option-text\">{{option.label}}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->\n\n", styles: [":host{display:block;height:100%;width:100%;position:relative;overflow:hidden!important}.container{height:calc(100% - 2px);width:calc(100% - 2px);position:relative!important;overflow:hidden!important;max-width:100%!important;box-sizing:border-box!important}.container .cell-display-text{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.inputRef{height:inherit;width:inherit;border:none}.inputRef:focus{outline:none}.cell-checkbox{text-align:center}.cell-form-field{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-outline,.cell-form-field .mat-mdc-form-field-subscript-wrapper,.cell-form-field .mat-mdc-form-field-text-suffix{display:none!important}.cell-form-field .mat-mdc-form-field-wrapper,.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex .mat-mdc-form-field-infix{width:100%!important;height:100%!important;padding:0!important;margin:0!important;min-height:auto!important;border-top:none!important}.cell-form-field input[matInput]{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:14px!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.dropdown-menu{width:100%}.cell-display-text-editable{cursor:pointer!important}.cell-display-text{width:100%!important;height:100%!important;min-height:20px!important;display:block!important;padding:4px 8px!important;font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;color:var(--grid-on-surface, #1d1b20)!important;background:transparent!important;border:none!important;outline:none!important;text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;box-sizing:border-box!important;transition:background-color .2s ease!important;line-height:1.4!important}.cell-display-text,.cell-display-text>*{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.cell-display-text:empty:before{content:\"Click to select\"!important;color:var(--grid-on-surface-variant, #49454f)!important;font-style:italic!important}.cell-display-number{text-align:var(--grid-number-text-align, right)}.aggregation .cell-display-number{text-align:var(--grid-aggregation-text-align, right)}.assignee-avatars{display:flex;align-items:center;padding:4px 8px;min-height:20px}.no-assignees{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}.drillable-value{color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.drillable-link{cursor:pointer;padding:4px}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "component", type: CurrencyComponent, selector: "eru-currency", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "replaceZeroValue", "placeholder"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: NumberComponent, selector: "eru-number", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "replaceZeroValue", "placeholder"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: TextboxComponent, selector: "eru-textbox", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: EmailComponent, selector: "eru-email", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "placeholder", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: TextareaComponent, selector: "eru-textarea", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: WebsiteComponent, selector: "eru-website", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: LocationComponent, selector: "eru-location", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: CheckboxComponent, selector: "eru-checkbox", inputs: ["value", "isEditable", "isActive", "isDrillable", "label"], outputs: ["valueChange", "change", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: DateComponent, selector: "eru-date", inputs: ["value", "isEditable", "isActive", "isDrillable", "placeholder"], outputs: ["valueChange", "dateChange", "drilldownClick", "editModeChange"] }, { kind: "component", type: DatetimeComponent, selector: "eru-datetime", inputs: ["value", "isEditable", "isActive", "isDrillable", "placeholder", "config"], outputs: ["valueChange", "datetimeChange", "drilldownClick", "editModeChange"] }, { kind: "component", type: DurationComponent, selector: "eru-duration", inputs: ["value", "isEditable", "isActive", "isDrillable", "placeholder"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: PhoneComponent, selector: "eru-phone", inputs: ["value", "defaultCountry", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: ProgressComponent, selector: "eru-progress", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: RatingComponent, selector: "eru-rating", inputs: ["value", "config", "isEditable", "isActive"], outputs: ["valueChange", "editModeChange"] }, { kind: "component", type: SelectComponent, selector: "eru-select", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "multiple", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: StatusComponent, selector: "eru-status", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: TagComponent, selector: "eru-tag", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange", "newTagAdded"] }, { kind: "component", type: PeopleComponent, selector: "eru-people", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: PriorityComponent, selector: "eru-priority", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: AttachmentComponent, selector: "eru-attachment", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange", "fileAdded", "fileDeleted", "fileViewed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
9484
|
+
], viewQueries: [{ propertyName: "attachmentTrigger", first: true, predicate: ["attachmentTrigger"], descendants: true }, { propertyName: "singleSelectTrigger", first: true, predicate: ["singleSelectTrigger"], descendants: true }, { propertyName: "multiSelectTrigger", first: true, predicate: ["multiSelectTrigger"], descendants: true }, { propertyName: "peopleTrigger", first: true, predicate: ["peopleTrigger"], descendants: true }], ngImport: i0, template: "<div class=\"container\">\n @switch (columnDatatype()) {\n @case ('textbox') {\n <eru-textbox [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onTextboxBlur($event)\"\n (editModeChange)=\"onTextboxEditModeChange($event)\" (drilldownClick)=\"onTextboxDrilldown($event)\">\n </eru-textbox>\n }\n @case ('currency') {\n <eru-currency [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\" (valueChange)=\"onValueChange($event)\" (blur)=\"onCurrencyBlur($event)\"\n (editModeChange)=\"onCurrencyEditModeChange($event)\" (drilldownClick)=\"onCurrencyDrilldown($event)\">\n </eru-currency>\n }\n @case ('number') {\n <eru-number [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\" (valueChange)=\"onValueChange($event)\" (blur)=\"onNumberBlurHandler($event)\"\n (editModeChange)=\"onNumberEditModeChange($event)\" (drilldownClick)=\"onNumberDrilldown($event)\">\n </eru-number>\n }\n @case ('location') {\n <eru-location [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onLocationBlurHandler($event)\"\n (editModeChange)=\"onLocationEditModeChange($event)\" (drilldownClick)=\"onLocationDrilldown($event)\">\n </eru-location>\n }\n @case ('email') {\n <eru-email [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onEmailBlurHandler($event)\"\n (editModeChange)=\"onEmailEditModeChange($event)\" (drilldownClick)=\"onEmailDrilldown($event)\">\n </eru-email>\n }\n @case ('textarea') {\n <eru-textarea [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onTextareaBlur($event)\"\n (editModeChange)=\"onTextareaEditModeChange($event)\" (drilldownClick)=\"onTextareaDrilldown($event)\">\n </eru-textarea>\n }\n @case ('website') {\n <eru-website [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onWebsiteBlur($event)\"\n (editModeChange)=\"onWebsiteEditModeChange($event)\" (drilldownClick)=\"onWebsiteDrilldown($event)\">\n </eru-website>\n }\n <!-- @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}</span>\n } @else {\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n }\n </div>\n } -->\n\n <!-- @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" cdkOverlayOrigin #singleSelectTrigger=\"cdkOverlayOrigin\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n } -->\n\n @case ('checkbox') {\n <eru-checkbox [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onCheckboxBlur($event)\"\n (editModeChange)=\"onCheckboxEditModeChange($event)\" (drilldownClick)=\"onCheckboxDrilldown($event)\">\n </eru-checkbox>\n }\n\n @case ('people') {\n <eru-people [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onPeopleBlur($event)\" (editModeChange)=\"onPeopleEditModeChange($event)\"\n (drilldownClick)=\"onPeopleDrilldown($event)\">\n </eru-people>\n }\n\n\n @case ('date') {\n <eru-date [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (editModeChange)=\"onDateEditModeChange($event)\"\n (drilldownClick)=\"onDateDrilldown($event)\">\n </eru-date>\n }\n\n @case ('datetime') {\n <eru-datetime [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\"\n (editModeChange)=\"onDatetimeEditModeChange($event)\" (drilldownClick)=\"onDatetimeDrilldown($event)\">\n </eru-datetime>\n }\n\n @case ('duration') {\n <eru-duration [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onDurationBlur($event)\"\n (editModeChange)=\"onDurationEditModeChange($event)\" (drilldownClick)=\"onDurationDrilldown($event)\">\n </eru-duration>\n }\n\n\n @case ('priority') {\n <eru-priority [value]=\"currentValue()\" [config]=\"getPriorityConfig()\" [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onPriorityBlur($event)\" (editModeChange)=\"onPriorityEditModeChange($event)\"\n (drilldownClick)=\"onPriorityDrilldown($event)\">\n </eru-priority>\n }\n @case ('progress') {\n <eru-progress [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onValueChange($event)\" (blur)=\"onProgressBlur($event)\" (focus)=\"onProgressFocus()\"\n (editModeChange)=\"onProgressEditModeChange($event)\" (drilldownClick)=\"onProgressDrilldown($event)\">\n </eru-progress>\n }\n\n @case ('rating') {\n <eru-rating [value]=\"currentValue()\" [config]=\"getRatingConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" (valueChange)=\"onValueChange($event)\" (editModeChange)=\"onRatingEditModeChange($event)\">\n </eru-rating>\n }\n\n @case ('status') {\n <eru-status [value]=\"currentValue()\" [config]=\"getStatusConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [isDrillable]=\"drillable()\" [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onStatusBlur($event)\"\n (editModeChange)=\"onStatusEditModeChange($event)\" (drilldownClick)=\"onStatusDrilldown($event)\">\n </eru-status>\n }\n\n @case ('tag') {\n <eru-tag [value]=\"currentValue()\" [config]=\"getTagConfig()\" [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onTagBlur($event)\"\n (editModeChange)=\"onTagEditModeChange($event)\" (drilldownClick)=\"onTagDrilldown($event)\">\n </eru-tag>\n }\n\n @case ('phone') {\n <eru-phone [value]=\"currentValue()\" [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onPhoneBlur($event)\" (editModeChange)=\"onPhoneEditModeChange($event)\"\n (drilldownClick)=\"onPhoneDrilldown($event)\">\n </eru-phone>\n }\n\n @case ('dropdown_single_select') {\n <eru-select [value]=\"currentValue()\" [config]=\"getSelectConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [multiple]=\"false\" [isDrillable]=\"drillable()\" [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onSelectBlur($event)\" (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n @case ('dropdown_multi_select') {\n <eru-select [value]=\"currentValue()\" [config]=\"getSelectConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [multiple]=\"true\" [isDrillable]=\"drillable()\" [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onSelectBlur($event)\" (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n\n @case ('attachment') {\n <eru-attachment [value]=\"currentValue()\" [config]=\"getAttachmentConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onAttachmentBlur($event)\"\n (editModeChange)=\"onAttachmentEditModeChange($event)\" (drilldownClick)=\"onAttachmentDrilldown($event)\">\n </eru-attachment>\n }\n @default {\n <div class=\"cell-default-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{value()}}</span>\n } @else {\n {{value()}}\n }\n </div>\n }\n }\n\n</div>\n\n\n<!-- <ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"singleSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_single_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_single_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" (click)=\"$event.stopPropagation()\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\">\n </mat-form-field>\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"'None'\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of filteredOptions(); track option.value || option.name) {\n <li [cdkOption]=\"option.value || option.name\" class=\"listbox-option notext-overflow\">\n {{option.label || option.name}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->\n\n<!-- <ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"multiSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_multi_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_multi_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (click)=\"$event.stopPropagation()\">\n </mat-form-field>\n \n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n \n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\" (click)=\"$event.stopPropagation()\">\n <li [cdkOption]=\"'None'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('None')\" (click)=\"$event.stopPropagation();appendMultiSelect('None')\"></mat-checkbox>\n <span class=\"option-text\">None</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 1')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 1')\"></mat-checkbox>\n <span class=\"option-text\">option 1</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 2')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 2')\"></mat-checkbox>\n <span class=\"option-text\">option 2</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 3')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 3')\"></mat-checkbox>\n <span class=\"option-text\">option 3</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 4')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 4')\"></mat-checkbox>\n <span class=\"option-text\">option 4</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 5'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 5')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 5')\"></mat-checkbox>\n <span class=\"option-text\">option 5</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 6'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 6')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 6')\"></mat-checkbox>\n <span class=\"option-text\">option 6</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 7'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 7')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 7')\"></mat-checkbox>\n <span class=\"option-text\">option 7</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 8'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 8')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 8')\"></mat-checkbox>\n <span class=\"option-text\">option 8</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 9'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 9')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 9')\"></mat-checkbox>\n <span class=\"option-text\">option 9</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 10'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 10')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 10')\"></mat-checkbox>\n <span class=\"option-text\">option 10</span>\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected(option.value)\" (click)=\"$event.stopPropagation();appendMultiSelect(option.value)\"></mat-checkbox>\n <span class=\"option-text\">{{option.label}}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->", styles: [":host{display:block;height:100%;width:100%;position:relative;overflow:hidden!important}.container{height:calc(100% - 2px);width:calc(100% - 2px);position:relative!important;overflow:hidden!important;max-width:100%!important;box-sizing:border-box!important}.container .cell-display-text{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.inputRef{height:inherit;width:inherit;border:none}.inputRef:focus{outline:none}.cell-checkbox{text-align:center}.cell-form-field{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-outline,.cell-form-field .mat-mdc-form-field-subscript-wrapper,.cell-form-field .mat-mdc-form-field-text-suffix{display:none!important}.cell-form-field .mat-mdc-form-field-wrapper,.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex .mat-mdc-form-field-infix{width:100%!important;height:100%!important;padding:0!important;margin:0!important;min-height:auto!important;border-top:none!important}.cell-form-field input[matInput]{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:14px!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.dropdown-menu{width:100%}.cell-display-text-editable{cursor:pointer!important}.cell-display-text{width:100%!important;height:100%!important;min-height:20px!important;display:block!important;padding:4px 8px!important;font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;color:var(--grid-on-surface, #1d1b20)!important;background:transparent!important;border:none!important;outline:none!important;text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;box-sizing:border-box!important;transition:background-color .2s ease!important;line-height:1.4!important}.cell-display-text,.cell-display-text>*{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.cell-display-text:empty:before{content:\"Click to select\"!important;color:var(--grid-on-surface-variant, #49454f)!important;font-style:italic!important}.cell-display-number{text-align:var(--grid-number-text-align, right)}.aggregation .cell-display-number{text-align:var(--grid-aggregation-text-align, right)}.assignee-avatars{display:flex;align-items:center;padding:4px 8px;min-height:20px}.no-assignees{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}.drillable-value{color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.drillable-link{cursor:pointer;padding:4px}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "component", type: CurrencyComponent, selector: "eru-currency", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "replaceZeroValue", "placeholder"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: NumberComponent, selector: "eru-number", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "replaceZeroValue", "placeholder"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: TextboxComponent, selector: "eru-textbox", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: EmailComponent, selector: "eru-email", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "placeholder", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: TextareaComponent, selector: "eru-textarea", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: WebsiteComponent, selector: "eru-website", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: LocationComponent, selector: "eru-location", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore", "externalError"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "validationError", "editModeChange"] }, { kind: "component", type: CheckboxComponent, selector: "eru-checkbox", inputs: ["value", "isEditable", "isActive", "isDrillable", "label"], outputs: ["valueChange", "change", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: DateComponent, selector: "eru-date", inputs: ["value", "isEditable", "isActive", "isDrillable", "placeholder"], outputs: ["valueChange", "dateChange", "drilldownClick", "editModeChange"] }, { kind: "component", type: DatetimeComponent, selector: "eru-datetime", inputs: ["value", "isEditable", "isActive", "isDrillable", "placeholder", "config"], outputs: ["valueChange", "datetimeChange", "drilldownClick", "editModeChange"] }, { kind: "component", type: DurationComponent, selector: "eru-duration", inputs: ["value", "isEditable", "isActive", "isDrillable", "placeholder"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: PhoneComponent, selector: "eru-phone", inputs: ["value", "defaultCountry", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: ProgressComponent, selector: "eru-progress", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: RatingComponent, selector: "eru-rating", inputs: ["value", "config", "isEditable", "isActive"], outputs: ["valueChange", "editModeChange"] }, { kind: "component", type: SelectComponent, selector: "eru-select", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "multiple", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: StatusComponent, selector: "eru-status", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: TagComponent, selector: "eru-tag", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange", "newTagAdded"] }, { kind: "component", type: PeopleComponent, selector: "eru-people", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: PriorityComponent, selector: "eru-priority", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth", "fieldSize", "eruGridStore"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange"] }, { kind: "component", type: AttachmentComponent, selector: "eru-attachment", inputs: ["value", "config", "isEditable", "isActive", "isDrillable", "columnWidth"], outputs: ["valueChange", "blur", "focus", "drilldownClick", "editModeChange", "fileAdded", "fileDeleted", "fileViewed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
9512
9485
|
}
|
|
9513
9486
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DataCellComponent, decorators: [{
|
|
9514
9487
|
type: Component,
|
|
@@ -9555,7 +9528,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
9555
9528
|
], host: {
|
|
9556
9529
|
'(document:click)': 'onDocumentClick($event)',
|
|
9557
9530
|
'class': 'data-cell-component'
|
|
9558
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"container\">\n @switch (columnDatatype()) {\n @case ('textbox') {\n <eru-textbox\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onTextboxValueChange($event)\"\n (blur)=\"onTextboxBlur($event)\"\n (editModeChange)=\"onTextboxEditModeChange($event)\"\n (drilldownClick)=\"onTextboxDrilldown($event)\">\n </eru-textbox>\n }\n @case ('currency') {\n <eru-currency \n [value]=\"currentValue()\" \n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\"\n (valueChange)=\"onCurrencyValueChange($event)\"\n (blur)=\"onCurrencyBlur($event)\"\n (editModeChange)=\"onCurrencyEditModeChange($event)\"\n (drilldownClick)=\"onCurrencyDrilldown($event)\">\n </eru-currency>\n }\n @case ('number') {\n <eru-number\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\"\n (valueChange)=\"onNumberValueChange($event)\"\n (blur)=\"onNumberBlurHandler($event)\"\n (editModeChange)=\"onNumberEditModeChange($event)\"\n (drilldownClick)=\"onNumberDrilldown($event)\">\n </eru-number>\n }\n @case ('location') {\n <eru-location\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onLocationValueChange($event)\"\n (blur)=\"onLocationBlurHandler($event)\"\n (editModeChange)=\"onLocationEditModeChange($event)\"\n (drilldownClick)=\"onLocationDrilldown($event)\">\n </eru-location>\n }\n @case ('email') {\n <eru-email\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onEmailValueChange($event)\"\n (blur)=\"onEmailBlurHandler($event)\"\n (editModeChange)=\"onEmailEditModeChange($event)\"\n (drilldownClick)=\"onEmailDrilldown($event)\">\n </eru-email>\n }\n @case ('textarea') {\n <eru-textarea\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onTextareaValueChange($event)\"\n (blur)=\"onTextareaBlur($event)\"\n (editModeChange)=\"onTextareaEditModeChange($event)\"\n (drilldownClick)=\"onTextareaDrilldown($event)\">\n </eru-textarea>\n }\n @case ('website') {\n <eru-website\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onWebsiteValueChange($event)\"\n (blur)=\"onWebsiteBlur($event)\"\n (editModeChange)=\"onWebsiteEditModeChange($event)\"\n (drilldownClick)=\"onWebsiteDrilldown($event)\">\n </eru-website>\n }\n <!-- @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}</span>\n } @else {\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n }\n </div>\n } -->\n\n <!-- @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" cdkOverlayOrigin #singleSelectTrigger=\"cdkOverlayOrigin\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n } -->\n\n @case ('checkbox') {\n <eru-checkbox\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onCheckboxValueChange($event)\"\n (blur)=\"onCheckboxBlur($event)\"\n (editModeChange)=\"onCheckboxEditModeChange($event)\"\n (drilldownClick)=\"onCheckboxDrilldown($event)\">\n </eru-checkbox>\n }\n\n @case ('people') {\n <eru-people\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onPeopleValueChange($event)\"\n (blur)=\"onPeopleBlur($event)\"\n (editModeChange)=\"onPeopleEditModeChange($event)\"\n (drilldownClick)=\"onPeopleDrilldown($event)\">\n </eru-people>\n }\n\n\n @case ('date') {\n <eru-date\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDateValueChange($event)\"\n (editModeChange)=\"onDateEditModeChange($event)\"\n (drilldownClick)=\"onDateDrilldown($event)\">\n </eru-date>\n }\n\n @case ('datetime') {\n <eru-datetime\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDatetimeValueChange($event)\"\n (editModeChange)=\"onDatetimeEditModeChange($event)\"\n (drilldownClick)=\"onDatetimeDrilldown($event)\">\n </eru-datetime>\n }\n\n @case ('duration') {\n <eru-duration\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDurationValueChange($event)\"\n (blur)=\"onDurationBlur($event)\"\n (editModeChange)=\"onDurationEditModeChange($event)\"\n (drilldownClick)=\"onDurationDrilldown($event)\">\n </eru-duration>\n }\n\n\n @case ('priority') {\n <eru-priority\n [value]=\"currentValue()\"\n [config]=\"getPriorityConfig()\"\n [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onPriorityValueChange($event)\"\n (blur)=\"onPriorityBlur($event)\"\n (editModeChange)=\"onPriorityEditModeChange($event)\"\n (drilldownClick)=\"onPriorityDrilldown($event)\">\n </eru-priority>\n }\n @case ('progress') {\n <eru-progress\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onProgressValueChange($event)\"\n (blur)=\"onProgressBlur($event)\"\n (focus)=\"onProgressFocus()\"\n (editModeChange)=\"onProgressEditModeChange($event)\"\n (drilldownClick)=\"onProgressDrilldown($event)\">\n </eru-progress>\n }\n\n @case ('rating') {\n <eru-rating\n [value]=\"currentValue()\"\n [config]=\"getRatingConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n (valueChange)=\"onRatingValueChange($event)\"\n (editModeChange)=\"onRatingEditModeChange($event)\">\n </eru-rating>\n }\n\n @case ('status') {\n <eru-status\n [value]=\"currentValue()\"\n [config]=\"getStatusConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onStatusValueChange($event)\"\n (blur)=\"onStatusBlur($event)\"\n (editModeChange)=\"onStatusEditModeChange($event)\"\n (drilldownClick)=\"onStatusDrilldown($event)\">\n </eru-status>\n }\n\n @case ('tag') {\n <eru-tag\n [value]=\"currentValue()\"\n [config]=\"getTagConfig()\"\n [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onTagValueChange($event)\"\n (blur)=\"onTagBlur($event)\"\n (editModeChange)=\"onTagEditModeChange($event)\"\n (drilldownClick)=\"onTagDrilldown($event)\">\n </eru-tag>\n }\n\n @case ('phone') {\n <eru-phone\n [value]=\"currentValue()\"\n [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n (valueChange)=\"onPhoneValueChange($event)\"\n (blur)=\"onPhoneBlur($event)\"\n (editModeChange)=\"onPhoneEditModeChange($event)\"\n (drilldownClick)=\"onPhoneDrilldown($event)\">\n </eru-phone>\n }\n\n @case ('dropdown_single_select') {\n <eru-select\n [value]=\"currentValue()\"\n [config]=\"getSelectConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [multiple]=\"false\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onSelectValueChange($event)\"\n (blur)=\"onSelectBlur($event)\"\n (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n @case ('dropdown_multi_select') {\n <eru-select\n [value]=\"currentValue()\"\n [config]=\"getSelectConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [multiple]=\"true\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onSelectValueChange($event)\"\n (blur)=\"onSelectBlur($event)\"\n (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n } \n\n @case ('attachment') {\n <eru-attachment\n [value]=\"currentValue()\"\n [config]=\"getAttachmentConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n (valueChange)=\"onAttachmentValueChange($event)\"\n (blur)=\"onAttachmentBlur($event)\"\n (editModeChange)=\"onAttachmentEditModeChange($event)\"\n (drilldownClick)=\"onAttachmentDrilldown($event)\">\n </eru-attachment>\n }\n @default {\n <div class=\"cell-default-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{value()}}</span>\n } @else {\n {{value()}}\n }\n </div>\n }\n }\n\n</div>\n\n\n<!-- <ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"singleSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_single_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_single_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" (click)=\"$event.stopPropagation()\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\">\n </mat-form-field>\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"'None'\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of filteredOptions(); track option.value || option.name) {\n <li [cdkOption]=\"option.value || option.name\" class=\"listbox-option notext-overflow\">\n {{option.label || option.name}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->\n\n<!-- <ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"multiSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_multi_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_multi_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (click)=\"$event.stopPropagation()\">\n </mat-form-field>\n \n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n \n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\" (click)=\"$event.stopPropagation()\">\n <li [cdkOption]=\"'None'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('None')\" (click)=\"$event.stopPropagation();appendMultiSelect('None')\"></mat-checkbox>\n <span class=\"option-text\">None</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 1')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 1')\"></mat-checkbox>\n <span class=\"option-text\">option 1</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 2')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 2')\"></mat-checkbox>\n <span class=\"option-text\">option 2</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 3')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 3')\"></mat-checkbox>\n <span class=\"option-text\">option 3</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 4')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 4')\"></mat-checkbox>\n <span class=\"option-text\">option 4</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 5'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 5')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 5')\"></mat-checkbox>\n <span class=\"option-text\">option 5</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 6'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 6')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 6')\"></mat-checkbox>\n <span class=\"option-text\">option 6</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 7'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 7')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 7')\"></mat-checkbox>\n <span class=\"option-text\">option 7</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 8'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 8')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 8')\"></mat-checkbox>\n <span class=\"option-text\">option 8</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 9'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 9')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 9')\"></mat-checkbox>\n <span class=\"option-text\">option 9</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 10'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 10')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 10')\"></mat-checkbox>\n <span class=\"option-text\">option 10</span>\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected(option.value)\" (click)=\"$event.stopPropagation();appendMultiSelect(option.value)\"></mat-checkbox>\n <span class=\"option-text\">{{option.label}}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->\n\n", styles: [":host{display:block;height:100%;width:100%;position:relative;overflow:hidden!important}.container{height:calc(100% - 2px);width:calc(100% - 2px);position:relative!important;overflow:hidden!important;max-width:100%!important;box-sizing:border-box!important}.container .cell-display-text{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.inputRef{height:inherit;width:inherit;border:none}.inputRef:focus{outline:none}.cell-checkbox{text-align:center}.cell-form-field{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-outline,.cell-form-field .mat-mdc-form-field-subscript-wrapper,.cell-form-field .mat-mdc-form-field-text-suffix{display:none!important}.cell-form-field .mat-mdc-form-field-wrapper,.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex .mat-mdc-form-field-infix{width:100%!important;height:100%!important;padding:0!important;margin:0!important;min-height:auto!important;border-top:none!important}.cell-form-field input[matInput]{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:14px!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.dropdown-menu{width:100%}.cell-display-text-editable{cursor:pointer!important}.cell-display-text{width:100%!important;height:100%!important;min-height:20px!important;display:block!important;padding:4px 8px!important;font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;color:var(--grid-on-surface, #1d1b20)!important;background:transparent!important;border:none!important;outline:none!important;text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;box-sizing:border-box!important;transition:background-color .2s ease!important;line-height:1.4!important}.cell-display-text,.cell-display-text>*{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.cell-display-text:empty:before{content:\"Click to select\"!important;color:var(--grid-on-surface-variant, #49454f)!important;font-style:italic!important}.cell-display-number{text-align:var(--grid-number-text-align, right)}.aggregation .cell-display-number{text-align:var(--grid-aggregation-text-align, right)}.assignee-avatars{display:flex;align-items:center;padding:4px 8px;min-height:20px}.no-assignees{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}.drillable-value{color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.drillable-link{cursor:pointer;padding:4px}\n"] }]
|
|
9531
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"container\">\n @switch (columnDatatype()) {\n @case ('textbox') {\n <eru-textbox [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onTextboxBlur($event)\"\n (editModeChange)=\"onTextboxEditModeChange($event)\" (drilldownClick)=\"onTextboxDrilldown($event)\">\n </eru-textbox>\n }\n @case ('currency') {\n <eru-currency [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\" (valueChange)=\"onValueChange($event)\" (blur)=\"onCurrencyBlur($event)\"\n (editModeChange)=\"onCurrencyEditModeChange($event)\" (drilldownClick)=\"onCurrencyDrilldown($event)\">\n </eru-currency>\n }\n @case ('number') {\n <eru-number [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\" (valueChange)=\"onValueChange($event)\" (blur)=\"onNumberBlurHandler($event)\"\n (editModeChange)=\"onNumberEditModeChange($event)\" (drilldownClick)=\"onNumberDrilldown($event)\">\n </eru-number>\n }\n @case ('location') {\n <eru-location [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onLocationBlurHandler($event)\"\n (editModeChange)=\"onLocationEditModeChange($event)\" (drilldownClick)=\"onLocationDrilldown($event)\">\n </eru-location>\n }\n @case ('email') {\n <eru-email [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onEmailBlurHandler($event)\"\n (editModeChange)=\"onEmailEditModeChange($event)\" (drilldownClick)=\"onEmailDrilldown($event)\">\n </eru-email>\n }\n @case ('textarea') {\n <eru-textarea [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onTextareaBlur($event)\"\n (editModeChange)=\"onTextareaEditModeChange($event)\" (drilldownClick)=\"onTextareaDrilldown($event)\">\n </eru-textarea>\n }\n @case ('website') {\n <eru-website [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onWebsiteBlur($event)\"\n (editModeChange)=\"onWebsiteEditModeChange($event)\" (drilldownClick)=\"onWebsiteDrilldown($event)\">\n </eru-website>\n }\n <!-- @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}</span>\n } @else {\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n }\n </div>\n } -->\n\n <!-- @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" cdkOverlayOrigin #singleSelectTrigger=\"cdkOverlayOrigin\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n } -->\n\n @case ('checkbox') {\n <eru-checkbox [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onCheckboxBlur($event)\"\n (editModeChange)=\"onCheckboxEditModeChange($event)\" (drilldownClick)=\"onCheckboxDrilldown($event)\">\n </eru-checkbox>\n }\n\n @case ('people') {\n <eru-people [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onPeopleBlur($event)\" (editModeChange)=\"onPeopleEditModeChange($event)\"\n (drilldownClick)=\"onPeopleDrilldown($event)\">\n </eru-people>\n }\n\n\n @case ('date') {\n <eru-date [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (editModeChange)=\"onDateEditModeChange($event)\"\n (drilldownClick)=\"onDateDrilldown($event)\">\n </eru-date>\n }\n\n @case ('datetime') {\n <eru-datetime [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\"\n (editModeChange)=\"onDatetimeEditModeChange($event)\" (drilldownClick)=\"onDatetimeDrilldown($event)\">\n </eru-datetime>\n }\n\n @case ('duration') {\n <eru-duration [value]=\"currentValue()\" [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onDurationBlur($event)\"\n (editModeChange)=\"onDurationEditModeChange($event)\" (drilldownClick)=\"onDurationDrilldown($event)\">\n </eru-duration>\n }\n\n\n @case ('priority') {\n <eru-priority [value]=\"currentValue()\" [config]=\"getPriorityConfig()\" [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onPriorityBlur($event)\" (editModeChange)=\"onPriorityEditModeChange($event)\"\n (drilldownClick)=\"onPriorityDrilldown($event)\">\n </eru-priority>\n }\n @case ('progress') {\n <eru-progress [value]=\"currentValue()\" [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onValueChange($event)\" (blur)=\"onProgressBlur($event)\" (focus)=\"onProgressFocus()\"\n (editModeChange)=\"onProgressEditModeChange($event)\" (drilldownClick)=\"onProgressDrilldown($event)\">\n </eru-progress>\n }\n\n @case ('rating') {\n <eru-rating [value]=\"currentValue()\" [config]=\"getRatingConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" (valueChange)=\"onValueChange($event)\" (editModeChange)=\"onRatingEditModeChange($event)\">\n </eru-rating>\n }\n\n @case ('status') {\n <eru-status [value]=\"currentValue()\" [config]=\"getStatusConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [isDrillable]=\"drillable()\" [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onStatusBlur($event)\"\n (editModeChange)=\"onStatusEditModeChange($event)\" (drilldownClick)=\"onStatusDrilldown($event)\">\n </eru-status>\n }\n\n @case ('tag') {\n <eru-tag [value]=\"currentValue()\" [config]=\"getTagConfig()\" [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [isDrillable]=\"drillable()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onTagBlur($event)\"\n (editModeChange)=\"onTagEditModeChange($event)\" (drilldownClick)=\"onTagDrilldown($event)\">\n </eru-tag>\n }\n\n @case ('phone') {\n <eru-phone [value]=\"currentValue()\" [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" [fieldSize]=\"fieldSize()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onPhoneBlur($event)\" (editModeChange)=\"onPhoneEditModeChange($event)\"\n (drilldownClick)=\"onPhoneDrilldown($event)\">\n </eru-phone>\n }\n\n @case ('dropdown_single_select') {\n <eru-select [value]=\"currentValue()\" [config]=\"getSelectConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [multiple]=\"false\" [isDrillable]=\"drillable()\" [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onSelectBlur($event)\" (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n @case ('dropdown_multi_select') {\n <eru-select [value]=\"currentValue()\" [config]=\"getSelectConfig()\" [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\" [multiple]=\"true\" [isDrillable]=\"drillable()\" [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\" [eruGridStore]=\"eruGridStore()\" (valueChange)=\"onValueChange($event)\"\n (blur)=\"onSelectBlur($event)\" (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n\n @case ('attachment') {\n <eru-attachment [value]=\"currentValue()\" [config]=\"getAttachmentConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\" [isActive]=\"isActive()\" [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\" (valueChange)=\"onValueChange($event)\" (blur)=\"onAttachmentBlur($event)\"\n (editModeChange)=\"onAttachmentEditModeChange($event)\" (drilldownClick)=\"onAttachmentDrilldown($event)\">\n </eru-attachment>\n }\n @default {\n <div class=\"cell-default-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{value()}}</span>\n } @else {\n {{value()}}\n }\n </div>\n }\n }\n\n</div>\n\n\n<!-- <ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"singleSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_single_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_single_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" (click)=\"$event.stopPropagation()\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\">\n </mat-form-field>\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"'None'\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of filteredOptions(); track option.value || option.name) {\n <li [cdkOption]=\"option.value || option.name\" class=\"listbox-option notext-overflow\">\n {{option.label || option.name}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->\n\n<!-- <ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"multiSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_multi_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_multi_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (click)=\"$event.stopPropagation()\">\n </mat-form-field>\n \n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n \n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\" (click)=\"$event.stopPropagation()\">\n <li [cdkOption]=\"'None'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('None')\" (click)=\"$event.stopPropagation();appendMultiSelect('None')\"></mat-checkbox>\n <span class=\"option-text\">None</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 1')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 1')\"></mat-checkbox>\n <span class=\"option-text\">option 1</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 2')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 2')\"></mat-checkbox>\n <span class=\"option-text\">option 2</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 3')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 3')\"></mat-checkbox>\n <span class=\"option-text\">option 3</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 4')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 4')\"></mat-checkbox>\n <span class=\"option-text\">option 4</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 5'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 5')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 5')\"></mat-checkbox>\n <span class=\"option-text\">option 5</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 6'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 6')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 6')\"></mat-checkbox>\n <span class=\"option-text\">option 6</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 7'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 7')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 7')\"></mat-checkbox>\n <span class=\"option-text\">option 7</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 8'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 8')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 8')\"></mat-checkbox>\n <span class=\"option-text\">option 8</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 9'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 9')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 9')\"></mat-checkbox>\n <span class=\"option-text\">option 9</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 10'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 10')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 10')\"></mat-checkbox>\n <span class=\"option-text\">option 10</span>\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected(option.value)\" (click)=\"$event.stopPropagation();appendMultiSelect(option.value)\"></mat-checkbox>\n <span class=\"option-text\">{{option.label}}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template> -->", styles: [":host{display:block;height:100%;width:100%;position:relative;overflow:hidden!important}.container{height:calc(100% - 2px);width:calc(100% - 2px);position:relative!important;overflow:hidden!important;max-width:100%!important;box-sizing:border-box!important}.container .cell-display-text{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.inputRef{height:inherit;width:inherit;border:none}.inputRef:focus{outline:none}.cell-checkbox{text-align:center}.cell-form-field{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-outline,.cell-form-field .mat-mdc-form-field-subscript-wrapper,.cell-form-field .mat-mdc-form-field-text-suffix{display:none!important}.cell-form-field .mat-mdc-form-field-wrapper,.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex{width:100%!important;height:100%!important;padding:0!important;margin:0!important}.cell-form-field .mat-mdc-form-field-wrapper .mat-mdc-form-field-flex .mat-mdc-form-field-infix{width:100%!important;height:100%!important;padding:0!important;margin:0!important;min-height:auto!important;border-top:none!important}.cell-form-field input[matInput]{width:100%!important;height:100%!important;padding:2px!important;margin:0!important;border:none!important;outline:none!important;background:transparent!important;font-size:14px!important;line-height:normal!important;box-sizing:border-box!important;max-width:none!important;min-width:0!important;flex:none!important}.dropdown-menu{width:100%}.cell-display-text-editable{cursor:pointer!important}.cell-display-text{width:100%!important;height:100%!important;min-height:20px!important;display:block!important;padding:4px 8px!important;font-family:var(--grid-font-family, \"Poppins\")!important;font-size:var(--grid-font-size-body, 12px)!important;color:var(--grid-on-surface, #1d1b20)!important;background:transparent!important;border:none!important;outline:none!important;text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;box-sizing:border-box!important;transition:background-color .2s ease!important;line-height:1.4!important}.cell-display-text,.cell-display-text>*{text-overflow:ellipsis!important;overflow:hidden!important;white-space:nowrap!important;max-width:100%!important;width:100%!important;display:block!important}.cell-display-text:empty:before{content:\"Click to select\"!important;color:var(--grid-on-surface-variant, #49454f)!important;font-style:italic!important}.cell-display-number{text-align:var(--grid-number-text-align, right)}.aggregation .cell-display-number{text-align:var(--grid-aggregation-text-align, right)}.assignee-avatars{display:flex;align-items:center;padding:4px 8px;min-height:20px}.no-assignees{color:var(--grid-on-surface-variant, #49454f);font-style:italic;font-size:12px}.option-content{display:flex;align-items:center;gap:8px;width:100%}.option-avatar{width:24px;height:24px;border-radius:50%;background-color:var(--grid-primary, #6750a4);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0}.option-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkmark{color:var(--grid-primary, #6750a4);font-weight:700;font-size:14px;flex-shrink:0}.drillable-value{color:var(--grid-primary, #6750a4);text-decoration:underline;text-decoration-color:var(--grid-primary, #6750a4);text-decoration-thickness:1px;text-underline-offset:2px;transition:all .2s ease}.drillable-link{cursor:pointer;padding:4px}\n"] }]
|
|
9559
9532
|
}], ctorParameters: () => [], propDecorators: { attachmentTrigger: [{
|
|
9560
9533
|
type: ViewChild,
|
|
9561
9534
|
args: ['attachmentTrigger']
|
|
@@ -9568,7 +9541,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
9568
9541
|
}], peopleTrigger: [{
|
|
9569
9542
|
type: ViewChild,
|
|
9570
9543
|
args: ['peopleTrigger']
|
|
9571
|
-
}], eruGridStore: [{ type: i0.Input, args: [{ isSignal: true, alias: "eruGridStore", required: true }] }], fieldSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldSize", required: true }] }], columnDatatype: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnDatatype", required: true }] }], columnName: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnName", required: true }] }], column: [{ type: i0.Input, args: [{ isSignal: true, alias: "column", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], frozenGrandTotalCell: [{ type: i0.Input, args: [{ isSignal: true, alias: "frozenGrandTotalCell", required: false }] }], td: [{ type: i0.Input, args: [{ isSignal: true, alias: "td", required: false }] }, { type: i0.Output, args: ["tdChange"] }], drillable: [{ type: i0.Input, args: [{ isSignal: true, alias: "drillable", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], isEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isEditable", required: false }] }] } });
|
|
9544
|
+
}], eruGridStore: [{ type: i0.Input, args: [{ isSignal: true, alias: "eruGridStore", required: true }] }], fieldSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldSize", required: true }] }], columnDatatype: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnDatatype", required: true }] }], columnName: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnName", required: true }] }], column: [{ type: i0.Input, args: [{ isSignal: true, alias: "column", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], frozenGrandTotalCell: [{ type: i0.Input, args: [{ isSignal: true, alias: "frozenGrandTotalCell", required: false }] }], td: [{ type: i0.Input, args: [{ isSignal: true, alias: "td", required: false }] }, { type: i0.Output, args: ["tdChange"] }], drillable: [{ type: i0.Input, args: [{ isSignal: true, alias: "drillable", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], isEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isEditable", required: false }] }], row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: false }] }] } });
|
|
9572
9545
|
|
|
9573
9546
|
class ResizeColumnDirective {
|
|
9574
9547
|
renderer;
|
|
@@ -9605,7 +9578,6 @@ class ResizeColumnDirective {
|
|
|
9605
9578
|
this.renderer.setStyle(this.resizer, "width", "10px");
|
|
9606
9579
|
this.renderer.setStyle(this.resizer, "cursor", "col-resize");
|
|
9607
9580
|
this.renderer.setStyle(this.resizer, "zIndex", "1");
|
|
9608
|
-
this.renderer.setStyle(this.columnElement, "position", "relative");
|
|
9609
9581
|
this.renderer.appendChild(this.columnElement, this.resizer);
|
|
9610
9582
|
// Add event listeners
|
|
9611
9583
|
this.renderer.listen(this.resizer, "mousedown", this.onMouseDown);
|
|
@@ -9632,56 +9604,55 @@ class ResizeColumnDirective {
|
|
|
9632
9604
|
// Apply column constraints - service handles all fallback scenarios
|
|
9633
9605
|
const gridConfig = this.gridConfig || this.eruGridStore.gridConfiguration();
|
|
9634
9606
|
newWidth = this.columnConstraintsService.constrainWidth(newWidth, this.columnConfig, gridConfig);
|
|
9635
|
-
//
|
|
9636
|
-
const
|
|
9637
|
-
|
|
9638
|
-
|
|
9639
|
-
|
|
9640
|
-
|
|
9641
|
-
|
|
9642
|
-
|
|
9643
|
-
|
|
9644
|
-
|
|
9645
|
-
|
|
9646
|
-
|
|
9647
|
-
|
|
9648
|
-
|
|
9649
|
-
|
|
9650
|
-
|
|
9651
|
-
|
|
9652
|
-
|
|
9653
|
-
|
|
9654
|
-
|
|
9655
|
-
|
|
9656
|
-
|
|
9657
|
-
|
|
9658
|
-
|
|
9659
|
-
|
|
9660
|
-
|
|
9661
|
-
|
|
9662
|
-
|
|
9663
|
-
|
|
9664
|
-
if (dataColumnIndex >= 0 && colElements.length > dataColumnIndex && colElements[dataColumnIndex]) {
|
|
9665
|
-
const colElement = colElements[dataColumnIndex];
|
|
9666
|
-
this.renderer.setStyle(colElement, "width", `${newWidth}px !important`);
|
|
9667
|
-
this.renderer.setStyle(colElement, "min-width", `${newWidth}px !important`);
|
|
9668
|
-
this.renderer.setStyle(colElement, "max-width", `${newWidth}px !important`);
|
|
9669
|
-
// Update CSS variable if it exists
|
|
9670
|
-
this.renderer.setStyle(colElement, "--col-width", `${newWidth}px`);
|
|
9671
|
-
}
|
|
9607
|
+
// Synchronize resizing across all tables in the grid (header and all body groups)
|
|
9608
|
+
const gridContainer = this.columnElement.closest('.eru-grid');
|
|
9609
|
+
const isPivotMode = this.eruGridStore.isPivotMode();
|
|
9610
|
+
// domColumnIndex is the visual position in the table row (1-based for nth-child)
|
|
9611
|
+
const domColumnIndex = Array.from(this.columnElement.parentElement.children).indexOf(this.columnElement) + 1;
|
|
9612
|
+
if (gridContainer) {
|
|
9613
|
+
const allTables = gridContainer.querySelectorAll('table');
|
|
9614
|
+
allTables.forEach(table => {
|
|
9615
|
+
// 1. Update th/td cells in all tables (header, body, group headers, totals)
|
|
9616
|
+
const cells = Array.from(table.querySelectorAll(`th:nth-child(${domColumnIndex}), td:nth-child(${domColumnIndex})`));
|
|
9617
|
+
cells.forEach(cell => {
|
|
9618
|
+
this.renderer.setStyle(cell, "width", `${newWidth}px`);
|
|
9619
|
+
this.renderer.setStyle(cell, "minWidth", `${newWidth}px`);
|
|
9620
|
+
this.renderer.setStyle(cell, "maxWidth", `${newWidth}px`);
|
|
9621
|
+
});
|
|
9622
|
+
// 2. Update colgroup if it exists
|
|
9623
|
+
// Now that colgroup structure matches the TR structure (Selection + ActionBefore + DataCol + ActionAfter),
|
|
9624
|
+
// we can use the domColumnIndex directly without subtraction math.
|
|
9625
|
+
const colgroup = table.querySelector('colgroup');
|
|
9626
|
+
if (colgroup) {
|
|
9627
|
+
const colElements = Array.from(colgroup.querySelectorAll('col'));
|
|
9628
|
+
if (domColumnIndex > 0 && colElements.length >= domColumnIndex) {
|
|
9629
|
+
const colElement = colElements[domColumnIndex - 1];
|
|
9630
|
+
this.renderer.setStyle(colElement, "width", `${newWidth}px !important`);
|
|
9631
|
+
this.renderer.setStyle(colElement, "min-width", `${newWidth}px !important`);
|
|
9632
|
+
this.renderer.setStyle(colElement, "max-width", `${newWidth}px !important`);
|
|
9633
|
+
}
|
|
9634
|
+
}
|
|
9635
|
+
});
|
|
9672
9636
|
}
|
|
9673
9637
|
// Update the column width in the store if we have column information
|
|
9674
9638
|
if (this.columnConfig) {
|
|
9675
9639
|
this.eruGridStore.updateColumnWidth(this.columnConfig.name, newWidth);
|
|
9676
9640
|
}
|
|
9677
|
-
// Optional: Add smooth transition for
|
|
9678
|
-
this.renderer.setStyle(this.table, "transition", "all 0.
|
|
9641
|
+
// Optional: Add smooth transition for visual feedback
|
|
9642
|
+
this.renderer.setStyle(this.table, "transition", "all 0.05s ease");
|
|
9679
9643
|
};
|
|
9680
9644
|
onMouseUp = (event) => {
|
|
9681
9645
|
if (this.pressed) {
|
|
9682
9646
|
this.pressed = false;
|
|
9683
9647
|
this.renderer.removeClass(this.table, "resizing");
|
|
9684
9648
|
this.renderer.setStyle(this.resizer, "backgroundColor", "transparent");
|
|
9649
|
+
// Set finish resize signal in store
|
|
9650
|
+
if (this.columnConfig) {
|
|
9651
|
+
this.eruGridStore.setColumnResize({
|
|
9652
|
+
columnName: this.columnConfig.name,
|
|
9653
|
+
newWidth: this.columnElement.offsetWidth
|
|
9654
|
+
});
|
|
9655
|
+
}
|
|
9685
9656
|
// Remove transition after resize
|
|
9686
9657
|
this.renderer.setStyle(this.table, "transition", "none");
|
|
9687
9658
|
}
|
|
@@ -9738,7 +9709,6 @@ class ColumnDragDirective {
|
|
|
9738
9709
|
// Don't prevent default - let the browser handle drag naturally
|
|
9739
9710
|
// Just mark that we're starting a drag from the handle
|
|
9740
9711
|
this.isDragging = true;
|
|
9741
|
-
console.log('Drag handle mousedown, isDragging set to true', this.columnIndex);
|
|
9742
9712
|
// Allow event to propagate so drag can start
|
|
9743
9713
|
};
|
|
9744
9714
|
this.dragHandle.addEventListener('mousedown', this.mouseDownListener, true); // Use capture phase
|
|
@@ -9770,7 +9740,6 @@ class ColumnDragDirective {
|
|
|
9770
9740
|
}
|
|
9771
9741
|
}
|
|
9772
9742
|
onDragStart(event) {
|
|
9773
|
-
console.log('dragstart triggered', { isDragging: this.isDragging, columnIndex: this.columnIndex });
|
|
9774
9743
|
// Only allow drag if it was initiated by the handle OR if we have a valid columnIndex
|
|
9775
9744
|
// Check if event originated from drag handle
|
|
9776
9745
|
const target = event.target;
|
|
@@ -9778,7 +9747,6 @@ class ColumnDragDirective {
|
|
|
9778
9747
|
target.closest('.column-drag-handle') !== null;
|
|
9779
9748
|
// Allow drag if initiated from handle or if isDragging is true
|
|
9780
9749
|
if (!isFromHandle && !this.isDragging) {
|
|
9781
|
-
console.log('Drag prevented: not from handle and isDragging is false');
|
|
9782
9750
|
event.preventDefault();
|
|
9783
9751
|
return;
|
|
9784
9752
|
}
|
|
@@ -9792,7 +9760,6 @@ class ColumnDragDirective {
|
|
|
9792
9760
|
if (!this.isDragging) {
|
|
9793
9761
|
this.isDragging = true;
|
|
9794
9762
|
}
|
|
9795
|
-
console.log('Drag start', this.columnIndex);
|
|
9796
9763
|
// Ensure dataTransfer exists
|
|
9797
9764
|
if (event.dataTransfer) {
|
|
9798
9765
|
try {
|
|
@@ -9831,7 +9798,6 @@ class ColumnDragDirective {
|
|
|
9831
9798
|
event.preventDefault();
|
|
9832
9799
|
return;
|
|
9833
9800
|
}
|
|
9834
|
-
console.log('Drop', this.columnIndex);
|
|
9835
9801
|
event.preventDefault();
|
|
9836
9802
|
// Get the dragged column index
|
|
9837
9803
|
let fromIndex;
|
|
@@ -9843,7 +9809,6 @@ class ColumnDragDirective {
|
|
|
9843
9809
|
return;
|
|
9844
9810
|
}
|
|
9845
9811
|
const toIndex = this.columnIndex;
|
|
9846
|
-
console.log('Reordering', { fromIndex, toIndex });
|
|
9847
9812
|
// Reorder columns if different
|
|
9848
9813
|
if (fromIndex !== toIndex) {
|
|
9849
9814
|
this.eruGridStore.reorderColumns(fromIndex, toIndex);
|
|
@@ -9922,7 +9887,9 @@ class EruGridComponent {
|
|
|
9922
9887
|
gridService = inject(EruGridService);
|
|
9923
9888
|
gridStore = inject(EruGridStore);
|
|
9924
9889
|
elementRef = inject(ElementRef);
|
|
9890
|
+
containerHeight = signal(400, ...(ngDevMode ? [{ debugName: "containerHeight" }] : [])); // Internal tracking for available height
|
|
9925
9891
|
resizeObserver = null;
|
|
9892
|
+
groupIntersectionObserver = null;
|
|
9926
9893
|
isColumnReordering = signal(false, ...(ngDevMode ? [{ debugName: "isColumnReordering" }] : []));
|
|
9927
9894
|
firstTr = 0;
|
|
9928
9895
|
// @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;
|
|
@@ -9936,6 +9903,7 @@ class EruGridComponent {
|
|
|
9936
9903
|
initialTotalWidth = 0;
|
|
9937
9904
|
viewport;
|
|
9938
9905
|
groupsViewport;
|
|
9906
|
+
groupsScrollContainerEl;
|
|
9939
9907
|
previousOffset = signal(0, ...(ngDevMode ? [{ debugName: "previousOffset" }] : []));
|
|
9940
9908
|
groups = computed(() => this.gridStore.groups(), ...(ngDevMode ? [{ debugName: "groups" }] : []));
|
|
9941
9909
|
ghostRows = signal(5, ...(ngDevMode ? [{ debugName: "ghostRows" }] : []));
|
|
@@ -9967,29 +9935,36 @@ class EruGridComponent {
|
|
|
9967
9935
|
ngZone = inject(NgZone);
|
|
9968
9936
|
// Computed signal for group content heights - only recalculates when groupRows change
|
|
9969
9937
|
groupContentHeightsMap = computed(() => {
|
|
9970
|
-
console.log("groupContentHeightsMap called");
|
|
9971
9938
|
const groups = this.groups();
|
|
9972
9939
|
const groupRows = this.gridStore.groupRows();
|
|
9973
9940
|
const minHeight = this.getMinHeightPx();
|
|
9974
9941
|
const ROW_HEIGHT = 30;
|
|
9975
|
-
const
|
|
9942
|
+
const HEADER_BUFFER = 100; // Expected height for group headers and other UI elements
|
|
9943
|
+
const freezeHeaderHeight = this.gridConfig?.config.freezeHeader ? 0 : 50;
|
|
9976
9944
|
const heightsMap = new Map();
|
|
9945
|
+
// Use gridHeight from config — NOT containerHeight — to avoid the ResizeObserver
|
|
9946
|
+
// feedback loop where larger viewports → taller host → ResizeObserver fires → bigger viewports.
|
|
9947
|
+
const availableViewHeight = Math.max(300, this.gridHeight() - HEADER_BUFFER);
|
|
9948
|
+
const SCROLLBAR_BUFFER = 30 + freezeHeaderHeight; // Reserve space for horizontal scrollbar so CDK viewport has enough height
|
|
9977
9949
|
groups.forEach(group => {
|
|
9978
|
-
const rows = groupRows.get(group.id);
|
|
9950
|
+
const rows = groupRows.get(group.id || '');
|
|
9979
9951
|
const rowCount = rows?.length || 0;
|
|
9980
|
-
const rowsHeight = rowCount * ROW_HEIGHT;
|
|
9952
|
+
const rowsHeight = (rowCount * ROW_HEIGHT) + SCROLLBAR_BUFFER;
|
|
9953
|
+
console.log(group.id, 'freezeHeaderHeight', freezeHeaderHeight, 'rowsHeight', rowsHeight, 'availableViewHeight', availableViewHeight, 'rowCount', rowCount);
|
|
9981
9954
|
let height;
|
|
9982
9955
|
if (rowCount === 0) {
|
|
9983
9956
|
height = Math.min(minHeight / 2, 200);
|
|
9984
9957
|
}
|
|
9985
|
-
else if (rowCount < 50) {
|
|
9958
|
+
else if (rowCount < 50 && rowsHeight < availableViewHeight) {
|
|
9959
|
+
// Add scrollbar buffer so the CDK viewport has enough room to render all rows even
|
|
9960
|
+
// when a horizontal scrollbar is present (scrollbar ~17px reduces usable height).
|
|
9986
9961
|
height = rowsHeight;
|
|
9987
9962
|
}
|
|
9988
9963
|
else {
|
|
9989
|
-
// For groups
|
|
9990
|
-
height = Math.
|
|
9964
|
+
// For larger groups or if space is limited: fill available height or at least 500px
|
|
9965
|
+
height = Math.max(500, availableViewHeight);
|
|
9991
9966
|
}
|
|
9992
|
-
heightsMap.set(group.id, height);
|
|
9967
|
+
heightsMap.set(group.id || '', height);
|
|
9993
9968
|
});
|
|
9994
9969
|
return heightsMap;
|
|
9995
9970
|
}, ...(ngDevMode ? [{ debugName: "groupContentHeightsMap" }] : []));
|
|
@@ -10208,8 +10183,8 @@ class EruGridComponent {
|
|
|
10208
10183
|
* This is efficient as it uses the cached computed signal instead of recalculating
|
|
10209
10184
|
*/
|
|
10210
10185
|
getGroupContentHeight(groupId) {
|
|
10211
|
-
|
|
10212
|
-
return this.groupContentHeightsMap().get(
|
|
10186
|
+
const key = groupId ?? '';
|
|
10187
|
+
return this.groupContentHeightsMap().get(key) || 200; // Default to 200 if not found
|
|
10213
10188
|
}
|
|
10214
10189
|
/**
|
|
10215
10190
|
* Calculate total height of a group including header and content
|
|
@@ -10229,16 +10204,13 @@ class EruGridComponent {
|
|
|
10229
10204
|
*/
|
|
10230
10205
|
/* protected getAverageGroupHeight(): number {
|
|
10231
10206
|
const groups = this.groups();
|
|
10232
|
-
console.log("getAverageGroupHeight: groups", groups.length);
|
|
10233
10207
|
if (groups.length === 0) {
|
|
10234
10208
|
// Fallback to min height if no groups
|
|
10235
|
-
console.log("getAverageGroupHeight: no groups, returning max of 200 and min height", Math.max(200, this.getMinHeightPx()));
|
|
10236
10209
|
return Math.max(200, this.getMinHeightPx());
|
|
10237
10210
|
}
|
|
10238
10211
|
// Calculate average height considering all groups
|
|
10239
10212
|
const totalHeight = groups.reduce((sum, group) => sum + this.getTotalGroupHeight(group), 0);
|
|
10240
10213
|
const averageHeight = Math.ceil(totalHeight / groups.length);
|
|
10241
|
-
console.log("getAverageGroupHeight: totalHeight", totalHeight, "groups.length", groups.length, "averageHeight", averageHeight, 'final', Math.max(200, Math.min(averageHeight, this.getMinHeightPx() + 100)));
|
|
10242
10214
|
// Ensure it's at least the minimum height, but also reasonable
|
|
10243
10215
|
// CDK virtual scroll works best with a reasonable average
|
|
10244
10216
|
return Math.max(200, Math.min(averageHeight, this.getMinHeightPx() + 100));
|
|
@@ -10280,12 +10252,10 @@ class EruGridComponent {
|
|
|
10280
10252
|
/* effect(() => {
|
|
10281
10253
|
// Always access the signal first to ensure it's tracked, even if we return early
|
|
10282
10254
|
const groups = this.gridStore.groups();
|
|
10283
|
-
console.log("groups effect triggered for", groups);
|
|
10284
10255
|
|
|
10285
10256
|
if (groups && groups.length > 0) {
|
|
10286
10257
|
// Use setTimeout to make this asynchronous and prevent UI blocking
|
|
10287
10258
|
setTimeout(() => {
|
|
10288
|
-
console.log("calling initializeGroups" , groups);
|
|
10289
10259
|
this.initializeGroups();
|
|
10290
10260
|
//this.intelligentGroupLoading();
|
|
10291
10261
|
}, 0);
|
|
@@ -10322,11 +10292,25 @@ class EruGridComponent {
|
|
|
10322
10292
|
ngAfterViewInit() {
|
|
10323
10293
|
this.applyTokens();
|
|
10324
10294
|
this.adjustHeaderScrollbarCompensation();
|
|
10325
|
-
//
|
|
10326
|
-
|
|
10327
|
-
|
|
10328
|
-
|
|
10329
|
-
|
|
10295
|
+
// Initialize ResizeObserver to track available height for ROBUST height utilization
|
|
10296
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
10297
|
+
this.resizeObserver = new ResizeObserver(entries => {
|
|
10298
|
+
for (const entry of entries) {
|
|
10299
|
+
const height = entry.contentRect.height;
|
|
10300
|
+
// Cap at gridHeight to prevent feedback loop: larger viewports → taller host → loop
|
|
10301
|
+
const capped = Math.min(height, this.gridHeight());
|
|
10302
|
+
// Only enter Angular zone when the value actually changes — avoids triggering
|
|
10303
|
+
// change detection (and the updateViewportSize → checkViewportSize → resize chain)
|
|
10304
|
+
// on every resize event.
|
|
10305
|
+
if (capped > 0 && capped !== this.containerHeight()) {
|
|
10306
|
+
this.ngZone.run(() => {
|
|
10307
|
+
this.containerHeight.set(capped);
|
|
10308
|
+
});
|
|
10309
|
+
}
|
|
10310
|
+
}
|
|
10311
|
+
});
|
|
10312
|
+
this.resizeObserver.observe(this.elementRef.nativeElement);
|
|
10313
|
+
}
|
|
10330
10314
|
// For debugging: expose method to window
|
|
10331
10315
|
if (typeof window !== 'undefined') {
|
|
10332
10316
|
window.recalculateScrollbar = () => this.recalculateScrollbarCompensation();
|
|
@@ -10337,16 +10321,24 @@ class EruGridComponent {
|
|
|
10337
10321
|
this.resizeObserver.disconnect();
|
|
10338
10322
|
this.resizeObserver = null;
|
|
10339
10323
|
}
|
|
10340
|
-
|
|
10324
|
+
if (this.groupIntersectionObserver) {
|
|
10325
|
+
this.groupIntersectionObserver.disconnect();
|
|
10326
|
+
this.groupIntersectionObserver = null;
|
|
10327
|
+
}
|
|
10341
10328
|
if (this.groupsScrollTimeout) {
|
|
10342
10329
|
clearTimeout(this.groupsScrollTimeout);
|
|
10343
10330
|
this.groupsScrollTimeout = null;
|
|
10344
10331
|
}
|
|
10345
10332
|
}
|
|
10346
10333
|
set_table_group(data) {
|
|
10347
|
-
console.log("set_table_group from eru-grid.component", data);
|
|
10348
10334
|
this.gridStore.setGroups(data);
|
|
10349
|
-
this.
|
|
10335
|
+
if (this.isBoardMode()) {
|
|
10336
|
+
// Board mode uses per-column CDK viewports; trigger initial card load
|
|
10337
|
+
setTimeout(() => { this.loadBoardAll(); }, 50);
|
|
10338
|
+
}
|
|
10339
|
+
else {
|
|
10340
|
+
this.initializeGroups();
|
|
10341
|
+
}
|
|
10350
10342
|
}
|
|
10351
10343
|
getInitialMinHeightPx() {
|
|
10352
10344
|
return this.initialMinHeight;
|
|
@@ -10399,34 +10391,55 @@ class EruGridComponent {
|
|
|
10399
10391
|
initializeGroups() {
|
|
10400
10392
|
this.requestedGroupIds.clear();
|
|
10401
10393
|
this.lastLoadedGroupIds.clear();
|
|
10402
|
-
|
|
10394
|
+
// Disconnect old observer so we start fresh for the new group set
|
|
10395
|
+
if (this.groupIntersectionObserver) {
|
|
10396
|
+
this.groupIntersectionObserver.disconnect();
|
|
10397
|
+
this.groupIntersectionObserver = null;
|
|
10398
|
+
}
|
|
10403
10399
|
if (this.gridStore.groups().length > 0) {
|
|
10404
|
-
|
|
10400
|
+
// Defer until Angular has rendered the @for loop into the DOM
|
|
10401
|
+
setTimeout(() => this.setupGroupVisibilityObserver(), 0);
|
|
10405
10402
|
}
|
|
10406
10403
|
}
|
|
10407
|
-
fetchInitialRows() {
|
|
10408
|
-
console.log("fetchInitialRows", this.gridStore.groups());
|
|
10409
|
-
// Fetch data for initially visible groups
|
|
10410
|
-
this.fetchDataForVisibleGroups();
|
|
10411
|
-
}
|
|
10412
10404
|
/**
|
|
10413
|
-
*
|
|
10414
|
-
*
|
|
10405
|
+
* Set up an IntersectionObserver that watches each .group-container against
|
|
10406
|
+
* the outer scroll container as root. The observer fires automatically when
|
|
10407
|
+
* a group enters (or is already in) the visible viewport, loading its data
|
|
10408
|
+
* on demand. This replaces the old "fetch all expanded groups at once" approach.
|
|
10415
10409
|
*/
|
|
10416
|
-
|
|
10417
|
-
|
|
10418
|
-
|
|
10419
|
-
|
|
10420
|
-
|
|
10421
|
-
|
|
10422
|
-
|
|
10423
|
-
|
|
10424
|
-
|
|
10425
|
-
|
|
10426
|
-
|
|
10427
|
-
|
|
10410
|
+
setupGroupVisibilityObserver() {
|
|
10411
|
+
if (this.groupIntersectionObserver) {
|
|
10412
|
+
this.groupIntersectionObserver.disconnect();
|
|
10413
|
+
this.groupIntersectionObserver = null;
|
|
10414
|
+
}
|
|
10415
|
+
const container = this.groupsScrollContainerEl?.nativeElement;
|
|
10416
|
+
if (!container)
|
|
10417
|
+
return;
|
|
10418
|
+
this.groupIntersectionObserver = new IntersectionObserver((entries) => {
|
|
10419
|
+
entries.forEach(entry => {
|
|
10420
|
+
if (!entry.isIntersecting)
|
|
10421
|
+
return;
|
|
10422
|
+
const attrId = entry.target.getAttribute('data-group-id') ?? '';
|
|
10423
|
+
// Match attribute back to the group (null ids are stored as '' in the attribute)
|
|
10424
|
+
const group = this.groups().find(g => (g.id ?? '') === attrId);
|
|
10425
|
+
if (!group || !group.isExpanded)
|
|
10426
|
+
return;
|
|
10427
|
+
const key = group.id ?? '';
|
|
10428
|
+
if (this.requestedGroupIds.has(key) || group.totalRowCount === 0 ||
|
|
10429
|
+
group.isLoading || !group.hasMoreRows)
|
|
10430
|
+
return;
|
|
10431
|
+
this.requestedGroupIds.add(key);
|
|
10428
10432
|
this.requestRowsForGroup(group);
|
|
10429
|
-
}
|
|
10433
|
+
});
|
|
10434
|
+
}, {
|
|
10435
|
+
root: container,
|
|
10436
|
+
// Pre-load groups 200 px before they enter the visible area so there is
|
|
10437
|
+
// no blank flash when the user scrolls down.
|
|
10438
|
+
rootMargin: '0px 0px 200px 0px',
|
|
10439
|
+
threshold: 0,
|
|
10440
|
+
});
|
|
10441
|
+
container.querySelectorAll('.group-container[data-group-id]').forEach(el => {
|
|
10442
|
+
this.groupIntersectionObserver.observe(el);
|
|
10430
10443
|
});
|
|
10431
10444
|
}
|
|
10432
10445
|
// fetchRowsForGroup - REMOVED
|
|
@@ -10438,17 +10451,15 @@ class EruGridComponent {
|
|
|
10438
10451
|
const viewport = this.getViewportByGroupId(groupId);
|
|
10439
10452
|
if (viewport) {
|
|
10440
10453
|
// checkViewportSize() recalculates the viewport dimensions when content height changes
|
|
10441
|
-
// This is the proper way to update the viewport when total height changes
|
|
10442
10454
|
viewport.checkViewportSize();
|
|
10443
10455
|
}
|
|
10444
|
-
|
|
10456
|
+
// groupsViewport removed — groups now use plain @for iteration
|
|
10445
10457
|
}, 0);
|
|
10446
10458
|
}
|
|
10447
10459
|
addRowsForGroup(groupId, rows, hasMore) {
|
|
10448
10460
|
this.gridStore.addRowsForGroup(groupId, rows, hasMore);
|
|
10449
10461
|
this.updateViewportSize(groupId);
|
|
10450
10462
|
/* var viewport = this.getViewportByGroupId(groupId);
|
|
10451
|
-
console.log("viewport from addRowsForGroup", viewport);
|
|
10452
10463
|
if (viewport) {
|
|
10453
10464
|
this.gridStore.addRowsForGroup(groupId, rows, hasMore);
|
|
10454
10465
|
this.ngZone.runOutsideAngular(() => {
|
|
@@ -10463,7 +10474,6 @@ class EruGridComponent {
|
|
|
10463
10474
|
onScroll(scrollIndex, group) {
|
|
10464
10475
|
// Skip scroll events during component initialization
|
|
10465
10476
|
/* if (!this.isComponentInitialized) {
|
|
10466
|
-
console.log("Skipping scroll event - component not initialized yet");
|
|
10467
10477
|
return;
|
|
10468
10478
|
} */
|
|
10469
10479
|
var viewport = this.getViewportByGroupId(group.id);
|
|
@@ -10495,31 +10505,19 @@ class EruGridComponent {
|
|
|
10495
10505
|
});
|
|
10496
10506
|
}
|
|
10497
10507
|
getVisibleGroups() {
|
|
10498
|
-
|
|
10499
|
-
|
|
10508
|
+
if (!this.gridStore.isPivotMode()) {
|
|
10509
|
+
// Table mode: all groups are rendered (no outer virtual scroll), return all expanded groups
|
|
10510
|
+
return this.groups().filter(g => g.isExpanded !== false);
|
|
10511
|
+
}
|
|
10512
|
+
// Pivot mode: use pivot viewport
|
|
10513
|
+
const viewport = this.viewport;
|
|
10500
10514
|
if (!viewport) {
|
|
10501
|
-
// If viewport not initialized yet, return empty array
|
|
10502
10515
|
return [];
|
|
10503
10516
|
}
|
|
10504
10517
|
try {
|
|
10505
10518
|
const renderedRange = viewport.getRenderedRange();
|
|
10506
10519
|
const visibleGroups = new Set();
|
|
10507
|
-
|
|
10508
|
-
if (!this.gridStore.isPivotMode()) {
|
|
10509
|
-
// For table mode, rendered range indexes directly correspond to groups
|
|
10510
|
-
// Only include groups that are actually in the rendered range
|
|
10511
|
-
const groups = this.groups();
|
|
10512
|
-
if (renderedRange.end == 0 && groups.length > 0) {
|
|
10513
|
-
visibleGroups.add(groups[0].id);
|
|
10514
|
-
}
|
|
10515
|
-
for (let i = renderedRange.start; i < renderedRange.end && i < groups.length; i++) {
|
|
10516
|
-
const group = groups[i];
|
|
10517
|
-
if (group) {
|
|
10518
|
-
visibleGroups.add(group.id);
|
|
10519
|
-
}
|
|
10520
|
-
}
|
|
10521
|
-
}
|
|
10522
|
-
else {
|
|
10520
|
+
{
|
|
10523
10521
|
// For pivot mode, use the existing logic with group items
|
|
10524
10522
|
for (let i = renderedRange.start; i < renderedRange.end; i++) {
|
|
10525
10523
|
const groupItem = this.getGroupItemAtIndex(i);
|
|
@@ -10528,7 +10526,6 @@ class EruGridComponent {
|
|
|
10528
10526
|
}
|
|
10529
10527
|
}
|
|
10530
10528
|
}
|
|
10531
|
-
console.log("Visible Groups IDs:", Array.from(visibleGroups));
|
|
10532
10529
|
if (!visibleGroups || visibleGroups.size === 0) {
|
|
10533
10530
|
return [this.gridStore.groups().find(g => g.id === 'root')];
|
|
10534
10531
|
}
|
|
@@ -10544,7 +10541,6 @@ class EruGridComponent {
|
|
|
10544
10541
|
}
|
|
10545
10542
|
getGroupItemAtIndex(index) {
|
|
10546
10543
|
const groupItems = this.groupedRows();
|
|
10547
|
-
console.log("groupItems", groupItems);
|
|
10548
10544
|
return groupItems[index];
|
|
10549
10545
|
}
|
|
10550
10546
|
checkAndLoadMoreRows(group, viewport) {
|
|
@@ -10559,13 +10555,11 @@ class EruGridComponent {
|
|
|
10559
10555
|
}
|
|
10560
10556
|
intelligentGroupLoading() {
|
|
10561
10557
|
const visibleGroups = this.getVisibleGroups();
|
|
10562
|
-
console.log("visibleGroups intelligentGroupLoading", visibleGroups, this.lastLoadedGroupIds);
|
|
10563
10558
|
const groupsToLoad = visibleGroups.filter(group => group.isExpanded &&
|
|
10564
10559
|
group.hasMoreRows &&
|
|
10565
10560
|
!group.isLoading
|
|
10566
10561
|
/* && !this.lastLoadedGroupIds.has(group.id) */
|
|
10567
10562
|
);
|
|
10568
|
-
console.log("groupsToLoad intelligentGroupLoading", groupsToLoad);
|
|
10569
10563
|
const sortedGroupsToLoad = groupsToLoad.sort((a, b) => (a.currentLoadedRows || 0) - (b.currentLoadedRows || 0));
|
|
10570
10564
|
if (sortedGroupsToLoad.length > 0) {
|
|
10571
10565
|
const groupToLoad = sortedGroupsToLoad[0];
|
|
@@ -10578,7 +10572,6 @@ class EruGridComponent {
|
|
|
10578
10572
|
* Request rows for a specific group via signal
|
|
10579
10573
|
*/
|
|
10580
10574
|
requestRowsForGroup(group) {
|
|
10581
|
-
console.log("requestRowsForGroup", group, this.lastLoadedGroupIds);
|
|
10582
10575
|
// Prevent duplicate requests
|
|
10583
10576
|
//if (this.lastLoadedGroupIds.has(group.id)) return;
|
|
10584
10577
|
const request = {
|
|
@@ -10589,14 +10582,12 @@ class EruGridComponent {
|
|
|
10589
10582
|
timestamp: Date.now(),
|
|
10590
10583
|
groupTitle: group.title
|
|
10591
10584
|
};
|
|
10592
|
-
console.log('📤 Grid Component: Adding to request queue', request);
|
|
10593
10585
|
// Add to queue instead of overwriting signal
|
|
10594
10586
|
this.gridStore.addToRequestQueue(request);
|
|
10595
10587
|
// Mark group as loading
|
|
10596
10588
|
this.gridStore.startGroupLoading(group.id);
|
|
10597
10589
|
// Prevent duplicate requests for 5 seconds
|
|
10598
10590
|
this.lastLoadedGroupIds.add(group.id);
|
|
10599
|
-
console.log("lastLoadedGroupIds", this.lastLoadedGroupIds);
|
|
10600
10591
|
setTimeout(() => {
|
|
10601
10592
|
this.lastLoadedGroupIds.delete(group.id);
|
|
10602
10593
|
}, 1000);
|
|
@@ -10640,8 +10631,6 @@ class EruGridComponent {
|
|
|
10640
10631
|
}
|
|
10641
10632
|
// Create a computed signal for each group's rows to avoid function calls in template
|
|
10642
10633
|
getRowsForGroupSignal(groupId) {
|
|
10643
|
-
console.log("getRowsForGroupSignal called for group", groupId);
|
|
10644
|
-
console.log(this.gridStore.getRowsForGroup(groupId));
|
|
10645
10634
|
return computed(() => this.gridStore.getRowsForGroup(groupId));
|
|
10646
10635
|
}
|
|
10647
10636
|
trackByHeaderFn(index, header) {
|
|
@@ -10692,7 +10681,6 @@ class EruGridComponent {
|
|
|
10692
10681
|
// Note: field_size fallback is now handled in setColumns() in the store
|
|
10693
10682
|
// This method is kept for backward compatibility but mainly just ensures columns are set
|
|
10694
10683
|
const columns = this.gridStore.columns();
|
|
10695
|
-
console.log("columns from gridStore", columns);
|
|
10696
10684
|
if (columns && columns.length > 0) {
|
|
10697
10685
|
// Re-apply setColumns to ensure field_size fallback is applied if columns were set before configuration
|
|
10698
10686
|
// This handles the case where columns might have been set before columnConstraints were available
|
|
@@ -10847,10 +10835,6 @@ class EruGridComponent {
|
|
|
10847
10835
|
* Get rowspan information for pivot table cells
|
|
10848
10836
|
*/
|
|
10849
10837
|
_rowspanInfo = null;
|
|
10850
|
-
/**
|
|
10851
|
-
* Debug counter for sticky column debugging
|
|
10852
|
-
*/
|
|
10853
|
-
_stickyDebugCount = 0;
|
|
10854
10838
|
getRowspanInfo() {
|
|
10855
10839
|
return this._rowspanInfo ?? new Map();
|
|
10856
10840
|
}
|
|
@@ -10877,24 +10861,19 @@ class EruGridComponent {
|
|
|
10877
10861
|
else if (this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {
|
|
10878
10862
|
if (this.getRowspanInfo().get(`${rowIndex}_${columnName}`)?.rowspan || 1 > 0) {
|
|
10879
10863
|
if (currentRowspan > previousRowspan && rowIndex >= this.firstDataRowIndex()) {
|
|
10880
|
-
/* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 2a');} */
|
|
10881
10864
|
return false;
|
|
10882
10865
|
}
|
|
10883
10866
|
else {
|
|
10884
|
-
/* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 2b');} */
|
|
10885
10867
|
return true;
|
|
10886
10868
|
}
|
|
10887
10869
|
}
|
|
10888
10870
|
}
|
|
10889
10871
|
else if (!this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {
|
|
10890
|
-
/* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 3');} */
|
|
10891
10872
|
return false;
|
|
10892
10873
|
}
|
|
10893
10874
|
else {
|
|
10894
|
-
/* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 4');} */
|
|
10895
10875
|
return true;
|
|
10896
10876
|
}
|
|
10897
|
-
/* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 5');} */
|
|
10898
10877
|
return true;
|
|
10899
10878
|
}
|
|
10900
10879
|
/**
|
|
@@ -11012,12 +10991,6 @@ class EruGridComponent {
|
|
|
11012
10991
|
const freezeEnabled = this.gridStore.isFreezeEnabled();
|
|
11013
10992
|
const freezeField = this.gridStore.getFreezeField();
|
|
11014
10993
|
const pivotConfig = this.gridStore.pivotConfiguration();
|
|
11015
|
-
// Debug logging for sticky column detection - log ALL calls for first few
|
|
11016
|
-
if (!this._stickyDebugCount)
|
|
11017
|
-
this._stickyDebugCount = 0;
|
|
11018
|
-
if (this._stickyDebugCount < 20) {
|
|
11019
|
-
this._stickyDebugCount++;
|
|
11020
|
-
}
|
|
11021
10994
|
if (!freezeEnabled) {
|
|
11022
10995
|
return false;
|
|
11023
10996
|
}
|
|
@@ -11025,9 +10998,6 @@ class EruGridComponent {
|
|
|
11025
10998
|
return false;
|
|
11026
10999
|
}
|
|
11027
11000
|
if (!pivotConfig?.rows) {
|
|
11028
|
-
if (columnName === 'location' || columnName === 'Location') {
|
|
11029
|
-
console.log('❌ STICKY DEBUG: No pivot config rows');
|
|
11030
|
-
}
|
|
11031
11001
|
return false;
|
|
11032
11002
|
}
|
|
11033
11003
|
if (!columnName) {
|
|
@@ -11035,30 +11005,13 @@ class EruGridComponent {
|
|
|
11035
11005
|
}
|
|
11036
11006
|
// Find the index of the freeze field in the row dimensions (case-insensitive)
|
|
11037
11007
|
const freezeFieldIndex = pivotConfig.rows.findIndex(row => row && typeof row === 'string' && row.toLowerCase() === freezeField.toLowerCase());
|
|
11038
|
-
if (columnName === 'location' || columnName === 'Location') {
|
|
11039
|
-
console.log('🔧 STICKY DEBUG freezeFieldIndex:', {
|
|
11040
|
-
freezeFieldIndex,
|
|
11041
|
-
pivotRows: pivotConfig.rows,
|
|
11042
|
-
freezeField: freezeField
|
|
11043
|
-
});
|
|
11044
|
-
}
|
|
11045
11008
|
if (freezeFieldIndex === -1) {
|
|
11046
|
-
if (columnName === 'location' || columnName === 'Location') {
|
|
11047
|
-
console.log('❌ STICKY DEBUG: Freeze field not found in pivot rows');
|
|
11048
|
-
}
|
|
11049
11009
|
return false;
|
|
11050
11010
|
}
|
|
11051
11011
|
// Get all row dimensions that should be frozen
|
|
11052
11012
|
const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);
|
|
11053
11013
|
// Case-insensitive comparison for column name
|
|
11054
11014
|
const isSticky = rowDimensionsToFreeze.some(row => row && typeof row === 'string' && row.toLowerCase() === columnName.toLowerCase());
|
|
11055
|
-
if (columnName === 'location' || columnName === 'Location') {
|
|
11056
|
-
console.log('🔧 STICKY DEBUG final result:', {
|
|
11057
|
-
rowDimensionsToFreeze,
|
|
11058
|
-
isSticky,
|
|
11059
|
-
columnNameLower: columnName.toLowerCase()
|
|
11060
|
-
});
|
|
11061
|
-
}
|
|
11062
11015
|
return isSticky;
|
|
11063
11016
|
}
|
|
11064
11017
|
/**
|
|
@@ -11093,11 +11046,53 @@ class EruGridComponent {
|
|
|
11093
11046
|
* Check if a column is a row dimension column
|
|
11094
11047
|
*/
|
|
11095
11048
|
isRowDimensionColumn(columnName) {
|
|
11096
|
-
const pivotConfig = this.gridStore.pivotConfiguration();
|
|
11049
|
+
const pivotConfig = this.gridStore.pivotConfiguration() || this.gridStore.configuration().pivot;
|
|
11097
11050
|
if (!pivotConfig?.rows)
|
|
11098
11051
|
return false;
|
|
11099
11052
|
return pivotConfig.rows.some(row => row.toLowerCase() === columnName.toLowerCase());
|
|
11100
11053
|
}
|
|
11054
|
+
/**
|
|
11055
|
+
* Returns true when this row-dimension cell repeats the same value as the previous row,
|
|
11056
|
+
* meaning it should be visually hidden (CSS visibility: hidden) to simulate rowspan.
|
|
11057
|
+
* This is virtual-scroll safe — the cell is always rendered but visually suppressed.
|
|
11058
|
+
*/
|
|
11059
|
+
isRepeatedDimensionValue(rowIndex, columnName) {
|
|
11060
|
+
if (!this.isRowDimensionColumn(columnName))
|
|
11061
|
+
return false;
|
|
11062
|
+
const rows = this.gridStore.pivotDisplayData();
|
|
11063
|
+
if (rowIndex === 0 || rowIndex >= rows.length)
|
|
11064
|
+
return false;
|
|
11065
|
+
const currentRow = rows[rowIndex];
|
|
11066
|
+
const prevRow = rows[rowIndex - 1];
|
|
11067
|
+
if (!currentRow || !prevRow)
|
|
11068
|
+
return false;
|
|
11069
|
+
// Never hide values on subtotal or grand total rows
|
|
11070
|
+
if (currentRow['_isSubtotal'] || currentRow['_isGrandTotal'])
|
|
11071
|
+
return false;
|
|
11072
|
+
if (prevRow['_isSubtotal'] || prevRow['_isGrandTotal'])
|
|
11073
|
+
return false;
|
|
11074
|
+
// All parent dimensions AND this dimension must match for value to be "repeated"
|
|
11075
|
+
const pivotConfig = this.gridStore.pivotConfiguration() || this.gridStore.configuration().pivot;
|
|
11076
|
+
if (!pivotConfig?.rows)
|
|
11077
|
+
return false;
|
|
11078
|
+
const dims = pivotConfig.rows;
|
|
11079
|
+
const dimIndex = dims.findIndex(d => d.toLowerCase() === columnName.toLowerCase());
|
|
11080
|
+
if (dimIndex < 0)
|
|
11081
|
+
return false;
|
|
11082
|
+
for (let i = 0; i <= dimIndex; i++) {
|
|
11083
|
+
if (String(currentRow[dims[i]] ?? '') !== String(prevRow[dims[i]] ?? ''))
|
|
11084
|
+
return false;
|
|
11085
|
+
}
|
|
11086
|
+
return true;
|
|
11087
|
+
}
|
|
11088
|
+
/**
|
|
11089
|
+
* Returns true for the first row of each dimension group — used to draw a visual separator.
|
|
11090
|
+
*/
|
|
11091
|
+
isPivotGroupStart(rowIndex, columnName) {
|
|
11092
|
+
if (!this.isRowDimensionColumn(columnName))
|
|
11093
|
+
return false;
|
|
11094
|
+
return rowIndex === 0 || !this.isRepeatedDimensionValue(rowIndex, columnName);
|
|
11095
|
+
}
|
|
11101
11096
|
/**
|
|
11102
11097
|
* Handle body scroll to synchronize header and grand total horizontal scroll
|
|
11103
11098
|
*/
|
|
@@ -11108,15 +11103,32 @@ class EruGridComponent {
|
|
|
11108
11103
|
*/
|
|
11109
11104
|
onGroupsViewportScroll(event) {
|
|
11110
11105
|
// Debounce to avoid too many calls during scrolling
|
|
11111
|
-
// Using a simple timeout mechanism
|
|
11112
11106
|
if (this.groupsScrollTimeout) {
|
|
11113
11107
|
clearTimeout(this.groupsScrollTimeout);
|
|
11114
11108
|
}
|
|
11115
11109
|
this.groupsScrollTimeout = setTimeout(() => {
|
|
11116
|
-
|
|
11117
|
-
|
|
11110
|
+
// IntersectionObserver fires automatically for newly visible groups during scroll,
|
|
11111
|
+
// so we only need to check inner CDK viewport pagination here.
|
|
11112
|
+
this.checkPaginationForAllGroups();
|
|
11113
|
+
}, 150);
|
|
11118
11114
|
}
|
|
11119
11115
|
groupsScrollTimeout = null;
|
|
11116
|
+
/**
|
|
11117
|
+
* Check if any group's inner CDK viewport is near the end of its loaded rows.
|
|
11118
|
+
* Called when the outer groups-scroll-container scrolls, so users scrolling the
|
|
11119
|
+
* outer container also triggers pagination for groups that need more rows.
|
|
11120
|
+
*/
|
|
11121
|
+
checkPaginationForAllGroups() {
|
|
11122
|
+
const groups = this.groups();
|
|
11123
|
+
groups.forEach(group => {
|
|
11124
|
+
if (!group.isExpanded || !group.hasMoreRows || group.isLoading)
|
|
11125
|
+
return;
|
|
11126
|
+
const viewport = this.getViewportByGroupId(group.id);
|
|
11127
|
+
if (!viewport)
|
|
11128
|
+
return;
|
|
11129
|
+
this.checkAndLoadMoreRows(group, viewport);
|
|
11130
|
+
});
|
|
11131
|
+
}
|
|
11120
11132
|
onTableBodyScroll(event) {
|
|
11121
11133
|
const target = event.target;
|
|
11122
11134
|
if (!target)
|
|
@@ -11183,7 +11195,6 @@ class EruGridComponent {
|
|
|
11183
11195
|
* Manually trigger scrollbar compensation recalculation (for testing)
|
|
11184
11196
|
*/
|
|
11185
11197
|
recalculateScrollbarCompensation() {
|
|
11186
|
-
console.log('Manual recalculation triggered');
|
|
11187
11198
|
this.adjustHeaderScrollbarCompensation();
|
|
11188
11199
|
}
|
|
11189
11200
|
/**
|
|
@@ -11238,10 +11249,58 @@ class EruGridComponent {
|
|
|
11238
11249
|
}
|
|
11239
11250
|
return this.columns().length;
|
|
11240
11251
|
}
|
|
11252
|
+
// ─── Board mode ──────────────────────────────────────────────────────────
|
|
11253
|
+
BOARD_CARD_ITEM_HEIGHT = 208;
|
|
11254
|
+
isBoardMode = computed(() => this.gridStore.currentMode() === 'board', ...(ngDevMode ? [{ debugName: "isBoardMode" }] : []));
|
|
11255
|
+
visibleBoardFields = computed(() => {
|
|
11256
|
+
console.log('Cols', this.columns());
|
|
11257
|
+
const mCols = this.columns().filter(col => col.show_mobile);
|
|
11258
|
+
console.log('mCols', mCols);
|
|
11259
|
+
if (mCols.length > 0) {
|
|
11260
|
+
return mCols;
|
|
11261
|
+
}
|
|
11262
|
+
const gCols = this.columns().filter(col => col.show_grid == 'yes');
|
|
11263
|
+
console.log('gCols', gCols);
|
|
11264
|
+
if (gCols.length > 0) {
|
|
11265
|
+
return gCols.slice(0, 3);
|
|
11266
|
+
}
|
|
11267
|
+
console.log('this.columns().slice(0, 3)', this.columns().slice(0, 3));
|
|
11268
|
+
return this.columns(); //.slice(0, 3)
|
|
11269
|
+
}, ...(ngDevMode ? [{ debugName: "visibleBoardFields" }] : []));
|
|
11270
|
+
onBoardScrolledIndexChange(firstVisibleIndex, group) {
|
|
11271
|
+
const rows = this.getRowsForGroupSignal(group.id)();
|
|
11272
|
+
const totalLoaded = rows.length;
|
|
11273
|
+
const threshold = 5;
|
|
11274
|
+
if (totalLoaded > 0 &&
|
|
11275
|
+
firstVisibleIndex + threshold >= totalLoaded - 1 &&
|
|
11276
|
+
group.hasMoreRows &&
|
|
11277
|
+
!group.isLoading) {
|
|
11278
|
+
this.requestBoardRowsForGroup(group);
|
|
11279
|
+
}
|
|
11280
|
+
}
|
|
11281
|
+
requestBoardRowsForGroup(group) {
|
|
11282
|
+
const request = {
|
|
11283
|
+
groupId: group.id,
|
|
11284
|
+
groupKey: group.key,
|
|
11285
|
+
page: group.currentPage || 0,
|
|
11286
|
+
pageSize: 20,
|
|
11287
|
+
timestamp: Date.now(),
|
|
11288
|
+
groupTitle: group.title,
|
|
11289
|
+
};
|
|
11290
|
+
this.gridStore.addToRequestQueue(request);
|
|
11291
|
+
this.gridStore.startGroupLoading(group.id);
|
|
11292
|
+
}
|
|
11293
|
+
loadBoardAll() {
|
|
11294
|
+
this.groups().forEach(group => {
|
|
11295
|
+
if (group.hasMoreRows && !group.isLoading) {
|
|
11296
|
+
this.requestBoardRowsForGroup(group);
|
|
11297
|
+
}
|
|
11298
|
+
});
|
|
11299
|
+
}
|
|
11241
11300
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: EruGridComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
11242
11301
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: EruGridComponent, isStandalone: true, selector: "eru-grid", inputs: { gridConfig: "gridConfig" }, providers: [EruGridStore, EruGridService,
|
|
11243
11302
|
...MATERIAL_PROVIDERS
|
|
11244
|
-
], viewQueries: [{ propertyName: "rowContainer", first: true, predicate: ["rowContainer"], descendants: true }, { propertyName: "headerScroller", first: true, predicate: ["headerScroller"], descendants: true, read: ElementRef }, { propertyName: "gtScroller", first: true, predicate: ["gtScroller"], descendants: true, read: ElementRef }, { propertyName: "viewport", first: true, predicate: ["vp"], descendants: true }, { propertyName: "groupsViewport", first: true, predicate: ["groupsViewport"], descendants: true }, { propertyName: "allViewports", predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "headerScrollers", predicate: ["headerScroller"], descendants: true }], ngImport: i0, template: "<!-- <div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\ncurrentPivotScrollIndex {{currentPivotScrollIndex()}} |\nfirstDataRowIndex {{firstDataRowIndex()}} |\nfirstTr {{firstTr}} |\nmaxDepth {{maxDepth()}}\n</div> -->\n<div class=\"incremental-row-container eru-grid\" #rowContainer\n [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode()\">\n <!-- Pivot Mode Template -->\n @if (gridStore.isPivotMode()) {\n <ng-container >\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%;\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <!-- Debug info for first visible row -->\n\n\n <div class=\"pivot-single-table\" style=\"height: 100%; width: 100%; overflow: hidden; display: flex; flex-direction: column;\">\n @if (freezeHeader()) {\n <div #headerScroller class=\"header-shell\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n @if(grandTotalPosition() === 'before' && freezeGrandTotal()) {\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n }\n </table>\n </div>\n }\n <!-- Virtual Scrolled Table Body -->\n <div>\n <cdk-virtual-scroll-viewport\n #vp\n [itemSize]=\"50\"\n class=\"viewport pivot-viewport\"\n [class.apply-cdk-width]=\"applyCdkWidth()\"\n (scrolledIndexChange)=\"onPivotScroll($event)\"\n (scroll)=\"onBodyScroll($event)\"\n style=\"overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\"\n >\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n @if (!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n }\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\n\n <tr *cdkVirtualFor=\"let pivotRow of gridStore.pivotDisplayData(); \n trackBy: trackByPivotRowFn; \n let i = index\"\n class=\"pivot-row\"\n [class.subtotal-row]=\"pivotRow._isSubtotal\"\n [class.grand-total-row]=\"pivotRow._isGrandTotal\"\n [class.subtotal-bold]=\"pivotRow._isSubtotal && subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"pivotRow._isSubtotal && subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"pivotRow._isSubtotal && subTotalStyle() === 'highlighted'\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n @if ((!pivotRow._isGrandTotal && freezeGrandTotal() ) || (!freezeGrandTotal() )) {\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n @if (!shouldSkipCell(i, column.name)) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [class.aggregation]=\"!!column.aggregationFunction\"\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n </div>\n </td>\n }\n }\n } @else {\n <td [style.height.px]=\"50\" [attr.colspan]=\"getLeafColumns().length\"> </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n\n </div>\n @if (freezeGrandTotal() && grandTotalPosition() === 'after') {\n <div #gtScroller class=\"header-shell gt-shell\"\n [class.adjust-bottom]=\"!applyCdkWidth()\"\n [class.adjust-bottom-vs]=\"adjustScrollWidth()\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n\n </table>\n </div>\n }\n\n\n </div>\n </div>\n </ng-container>\n } @else {\n\n <!-- Table Mode Template -->\n <!-- Outer virtual scroll viewport for groups -->\n\n <cdk-virtual-scroll-viewport\n #groupsViewport\n [itemSize]=\"200\"\n class=\"viewport groups-viewport\"\n (scrolledIndexChange)=\"onGroupsViewportScroll($event)\"\n >\n\n <div class=\"group-container\" *cdkVirtualFor=\"let group of groups(); trackBy: trackByGroupFn; let i = index\"\n >\n <!-- Combined sitcky header with group info and table -->\n <div style=\"\n background:var(--grid-surface);\n position: sticky;\n top: 0;\n z-index: 115;\n \">\n <div class=\"custom-collapse-header\"\n (click)=\"toggleGroupCollapse(group.id)\">\n <span class=\"collapse-arrow\" [ngClass]=\"{\n 'rotate-arrow': group.isExpanded,\n }\">\u25BC</span>\n <span class=\"f-12\">\n {{ group?.title || \"\" }}\n {{ group?.currentLoadedRows || 0 }} -\n {{ group?.totalRowCount || 0 }} rows...</span>\n </div>\n\n @if(freezeHeader() && group.isExpanded) {\n <div #headerScroller class=\"header-shell\"\n [attr.data-group-id]=\"'header-shell-' + group.id\"\n [style]=\"'--table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <table class=\"eru-grid-table\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n <!-- Grand Total row after sticky header (position: before) - only for first group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after sticky header (position: before) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n </table>\n </div>\n }\n </div>\n @if(group.isExpanded) {\n <ng-container>\n <cdk-virtual-scroll-viewport\n [attr.data-group-id]=\"group.id\"\n [itemSize]=\"30\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event, group)\"\n (scroll)=\"onTableBodyScroll($event)\"\n [style]=\"'--table-height: ' + getGroupContentHeight(group.id) + 'px; --table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n >\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n @if(!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n }\n <!-- Grand Total row after normal header (position: before) - only for first group -->\n @if(!freezeHeader() && enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after normal header (position: before) -->\n @if(!freezeHeader() && enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n <tbody>\n @if (columns(); as columnsList) {\n <!-- <tr *ngIf=\"groupItem.type === 'table-header' && groups().length > 1\" style=\"background:#fafafa\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n }\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr> -->\n <!-- @if(getRowsForGroup(group.id).length > 0 && group.isExpanded) { -->\n <!-- *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); \n trackBy: trackByRowFn; \n let i = index\" -->\n <!-- @for(row of getRowsForGroupSignal(group.id)(); track trackByRowFn($index, row); let i = $index) { -->\n <tr *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id || '')(); trackBy: trackByRowFn; let i = index\"\n class=\"row-item\"\n [attr.data-row-id]=\"i\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isRowSelected(row?.entity_id)\"\n (change)=\"toggleRowSelection($event, row)\"\n >\n </td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td #cell\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\"\n [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\"\n >\n <div class=\"cell-content\">\n <data-cell\n #datacell\n [td]=cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"row?.['entity_data']?.[column.name] || 'xx'\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [drillable]=\"column.enableDrilldown || false\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\"\n ></data-cell>\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n </tr>\n <!-- } -->\n <!-- } -->\n @if(group.isLoading && group.isExpanded) {\n @for(i of [].constructor(ghostRows()); let j = $index; track j) {\n <tr\n class=\"ghost-loading-row\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\"\n >\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n </tr>\n }\n }\n <!-- <tr\n *ngIf=\"getRowsForGroup(group.id).length === 0 && !group.isExpanded\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"groupSeperatorColSpan()\" class=\"separator-cell\"></td>\n </tr> -->\n <!-- Subtotal row at end of group (position: after) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'after' && hasSubtotalData(group)) {\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n }\n <!-- Grand Total row at end of group (position: after) - only for last group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'after' && hasGrandTotalData() && i === groups().length - 1) {\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n }\n }\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n }\n </div>\n</cdk-virtual-scroll-viewport>\n}\n</div>\n\n<!-- Pivot Table Header Template -->\n<ng-template #pivotTableHead>\n <thead>\n @if (hasNestedHeaders()) {\n <ng-container >\n @for (headerRow of getHeaderRows(); track headerRow; let rowIndex = $index) {\n <tr class=\"pivot-header pivot-header-container\"\n [class.pivot-header-level]=\"'level-' + rowIndex\">\n @for (header of headerRow; track trackByHeaderFn($index, header); let colIndex = $index) {\n <th\n [attr.colspan]=\"header.colspan\"\n [attr.rowspan]=\"header.rowspan\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable') && header.level === 0 && !isRowDimensionHeader(header)\"\n [columnConfig]=\"getFieldForPivotHeader(header)\"\n class=\"column-header pivot-column-header nested-header\"\n [class.row-dimension-header]=\"isRowDimensionHeader(header)\"\n [class.column-dimension-header]=\"!isRowDimensionHeader(header)\"\n [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\"\n [class.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n\n <data-cell\n [fieldSize]=\"header.field_size\"\n [columnDatatype]=\"header.dataType\"\n [columnName]=\"header.name\"\n [value]=\"header.label\"\n [column]=\"header\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"header.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + $index + '_' + header.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n <!-- <span class=\"header-label header-wrap-text\">{{header.label}}</span> -->\n <!-- <button *ngIf=\"!isRowDimensionHeader(header)\"\n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button> -->\n </div>\n </th>\n }\n </tr>\n }\n </ng-container>\n } @else {\n <!-- Simple header fallback -->\n <ng-container>\n <tr class=\"pivot-header\" [class.freeze-header-enabled]=\"freezeHeader()\">\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <th [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n class=\"column-header pivot-column-header\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 100 : 1\"\n style = \"min-height: 40px;height: auto;padding: 8px 6px;position: relative;left: 0px;z-index: 1\">\n {{column.label}}\n </th>\n }\n </tr>\n </ng-container>\n }\n\n</thead>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #pivotColGroup>\n <colgroup>\n @for (column of getLeafColumns(); track trackByColumnFn($index, column)) {\n <col [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n</colgroup>\n</ng-template>\n\n<ng-template #pivotGrandTotal>\n <tbody class=\"pivot-tbody\">\n @for (pivotRow of gridStore.pivotGrandTotalData(); track trackByPivotRowFn($index, pivotRow); let i = $index) {\n <tr\n class=\"pivot-row grand-total-row\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #tableColGroup>\n <colgroup>\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <col [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n</colgroup>\n</ng-template>\n\n\n<ng-template #tableHeader>\n\n <thead>\n @if(shouldShowRequiredToggleRow()) {\n <tr class=\"required-toggle-row\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllGroupsSelected()\"\n (change)=\"toggleAllGroups($event)\"\n >\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"required-toggle-cell\">\n @if(i === 0) {\n <span class=\"required-label\">required</span>\n }\n <mat-checkbox\n [checked]=\"column.required || false\"\n (change)=\"onColumnRequiredChange(column.name, $event.checked)\"\n [title]=\"'Make ' + column.label + ' required'\">\n </mat-checkbox>\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n </tr>\n }\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllGroupsSelected()\"\n (change)=\"toggleAllGroups($event)\"\n >\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th\n [style.width.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"gridStore.isFeatureEnabled('columnReorderable') ? i : null\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header table-column-header\">\n @if(gridStore.isFeatureEnabled('columnReorderable')) {\n <div class=\"column-drag-handle\"></div>\n }\n <!-- <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"column.label\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell> -->\n {{column.label}}\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n </tr>\n</thead>\n</ng-template>\n\n<!-- Table Subtotal Row Template -->\n<ng-template #tableSubtotal let-group=\"group\">\n <tr class=\"subtotal-row\"\n [class.subtotal-bold]=\"subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"subTotalStyle() === 'highlighted'\"\n [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"subtotal-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getSubtotalValue(group, column.name) === null) {\n <span class=\"subtotal-label\">{{subtotalLabel()}}</span>\n } @else {\n @if(getSubtotalValue(group, column.name) !== null) {\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getSubtotalValue(group, column.name)\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"false\"\n [id]=\"'subtotal_' + group.id + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>\n\n<!-- Table Grand Total Row Template -->\n<ng-template #tableGrandTotal>\n <tr class=\"grand-total-row\"\n [class.grand-total-bold]=\"grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"grand-total-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getGrandTotalValue(column.name) === null) {\n <span class=\"grand-total-label\">Grand Total</span>\n } @else {\n @if(getGrandTotalValue(column.name) !== null) {\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getGrandTotalValue(column.name)\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"false\"\n [id]=\"'grandtotal_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>", styles: ["@charset \"UTF-8\";:host{display:block!important;width:100%;height:100%;flex:1 1 0%;min-height:var(--grid-height, 400px);font-family:var(--grid-font-family);--grid-primary: #6750a4;--grid-on-primary: #ffffff;--grid-surface: #fef7ff;--grid-surface-variant: #e7e0ec;--grid-surface-container: #f3edf7;--grid-surface-container-high: #ede7f0;--grid-on-surface: #1d1b20;--grid-on-surface-variant: #49454f;--grid-outline: #79757f;--grid-outline-variant: #cac4d0;--grid-error: #ba1a1a;--grid-error-container: #ffdad6;--grid-font-family: \"Poppins\", \"Roboto\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--grid-font-size-body: 12px;--grid-font-size-caption: 12px !important;--grid-line-height-body: 1;--grid-aggregation-text-align: right;--grid-number-text-align: right;--grid-spacing-xxs: 2px;--grid-spacing-xs: 4px;--grid-spacing-sm: 8px;--grid-spacing-md: 16px;--grid-spacing-lg: 24px;--grid-border-radius: 4px;--grid-elevation-1: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 1px 3px 1px rgba(0, 0, 0, .15);--grid-elevation-2: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 2px 6px 2px rgba(0, 0, 0, .15)}.group-container{padding-bottom:8px}.incremental-row-container{width:100%;height:100%;min-height:400px;max-height:none;overflow:auto;position:relative;background-color:var(--grid-surface);border-radius:var(--grid-border-radius);font-family:var(--grid-font-family)}.viewport{height:100%;min-height:300px;overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface);scrollbar-gutter:stable}.viewport.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.groups-viewport{height:100%;min-height:300px}.table-viewport{background-color:var(--grid-surface);height:var(--table-height, auto);min-height:var(--table-min-height, 100px);overflow-x:auto;overflow-y:none}.pivot-viewport{min-height:var(--table-min-height, 300px);overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface)}.pivot-viewport .cdk-virtual-scroll-content-wrapper{width:auto;height:auto}.table-wrapper{min-width:100%;overflow-x:visible}.incremental-row-container .eru-grid-table,.eru-grid-table{width:100%!important;border-collapse:separate;border-spacing:0;table-layout:fixed!important;background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body);line-height:var(--grid-line-height-body)}.eru-grid-table th,.eru-grid-table td{text-align:left;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;background-color:var(--grid-surface);color:var(--grid-on-surface);min-width:0;max-width:100%!important;box-sizing:border-box;position:relative}.eru-grid-table th:hover,.eru-grid-table td:hover{background-color:var(--grid-surface-variant)}.eru-grid-table thead{background-color:var(--grid-surface-container);transform:translateZ(0);will-change:transform;backface-visibility:hidden}.eru-grid-table thead.freeze-header-enabled{position:sticky!important;top:0!important;z-index:100!important}.eru-grid-table thead th{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-weight:500;font-size:var(--grid-font-size-caption)}.checkbox-column{width:50px;min-width:50px;max-width:50px;text-align:center;background-color:var(--grid-surface-container)}.checkbox-column input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:var(--grid-primary);border-radius:var(--grid-border-radius)}.checkbox-column input[type=checkbox]:focus{outline:2px solid var(--grid-primary);outline-offset:2px}.action-column{width:40px;min-width:40px;max-width:40px;text-align:center;background-color:var(--grid-surface-container)}.action-column mat-icon{font-size:20px;width:20px;height:20px;line-height:20px;color:var(--grid-on-surface-variant);cursor:pointer}.action-column mat-icon:hover{color:var(--grid-primary)}.group-header{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-size:var(--grid-font-size-caption);font-weight:500;border-bottom:1px solid var(--grid-outline);cursor:pointer;transition:background-color .2s ease}.group-header:hover{background-color:var(--grid-surface-container-high)}.group-header .group-title{font-weight:600;color:var(--grid-primary)}.group-header .group-row-count{color:var(--grid-on-surface-variant);font-size:var(--grid-font-size-caption);margin-left:var(--grid-spacing-sm)}.row-item{border:1px solid var(--grid-outline);background-color:var(--grid-surface);transition:background-color .2s ease,box-shadow .2s ease}.row-item:hover{background-color:var(--grid-surface-variant);box-shadow:var(--grid-elevation-1)}.required-toggle-row{background-color:var(--grid-surface-container, #f3edf7);border-bottom:1px solid var(--grid-outline-variant, #cac4d0)}.required-toggle-row .required-toggle-cell{padding:4px 8px!important;text-align:center;vertical-align:middle;position:relative}.required-toggle-row .required-toggle-cell .required-label{position:absolute;top:2px;left:4px;font-size:10px;color:var(--grid-on-surface-variant, #49454f);font-weight:400;text-transform:lowercase}.required-toggle-row .required-toggle-cell mat-checkbox{display:flex;justify-content:center;align-items:center}.table-column-header{padding:12px 8px}.column-header{font-weight:500;text-align:center!important;font-size:var(--grid-font-size-caption, 12px);position:relative;-webkit-user-select:none;user-select:none;background-color:var(--grid-surface-container);color:var(--grid-on-surface)}.column-header:hover{background-color:var(--grid-surface-container-high)}.column-drag-handle{position:absolute;left:0;top:0;bottom:0;width:12px;cursor:grab;opacity:0;transition:opacity .2s ease,background-color .2s ease;z-index:2;display:flex;align-items:center;justify-content:center;border-right:1px solid transparent}.column-drag-handle:after{content:\"\\22ee\\22ee\";font-size:14px;color:var(--grid-on-surface-variant);transform:rotate(90deg)}.column-drag-handle:hover{background-color:var(--grid-surface-container-high);border-right-color:var(--grid-outline)}.column-header:hover .column-drag-handle{opacity:1}.column-drag-handle:active{cursor:grabbing}.dragging{opacity:1;background-color:var(--grid-surface-container);box-shadow:var(--grid-elevation-2)}.drag-over{background-color:var(--grid-surface-container);border-color:var(--grid-primary)}.data-cell{background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body)}.cell-content{align-items:center}.cell-content .mdc-text-field{padding:0px var(--grid-spacing-xxs)!important}.cell-display-text{align-items:center;padding:0px var(--grid-spacing-xs)}.ghost-loading-row{background-color:transparent}.ghost-cell-container{padding:var(--grid-spacing-sm)}.ghost-cell{height:20px;width:100%;background-color:var(--grid-surface-container);animation:pulse 1.5s ease-in-out infinite;border-radius:var(--grid-border-radius)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.column-resizer{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background-color:transparent;transition:background-color .2s ease}.column-resizer:hover{background-color:var(--grid-primary)}.group-separator{height:var(--grid-spacing-sm);background-color:var(--grid-surface-variant)}.group-separator .separator-cell{background-color:var(--grid-surface-variant);border:none;height:var(--grid-spacing-sm)}.error-state{background-color:var(--grid-error-container);color:var(--grid-error);border-color:var(--grid-error)}.error-message{background-color:var(--grid-error);color:#fff;padding:var(--grid-spacing-sm);border-radius:var(--grid-border-radius);font-size:var(--grid-font-size-caption)}.incremental-row-container .eru-grid-table tbody,.incremental-row-container .eru-grid-table{position:relative}.incremental-row-container .eru-grid-table.show-column-lines{border-right:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-top:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table:not(.show-column-lines){border:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table thead:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:calc(var(--grid-outline-width, 1px) * 2);background-color:var(--grid-outline, #e0e0e0);pointer-events:none;z-index:10}.incremental-row-container .eru-grid-table.show-column-lines thead th{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-column-lines tbody td{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines thead th{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines tbody td{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}@media(max-width:768px){.incremental-row-container{height:600px}.eru-grid-table th,.eru-grid-table td{font-size:var(--grid-font-size-caption)}.checkbox-column{width:40px;min-width:40px;max-width:40px}}@media(prefers-contrast:high){.eru-grid-table th,.eru-grid-table td{border-width:2px}.row-item:hover{border-width:2px;border-color:var(--grid-primary)}}@media(prefers-reduced-motion:reduce){.row-item,.column-drag-handle,.ghost-cell{transition:none;animation:none}}.pivot-table .nested-header{text-align:center;font-weight:600;background:var(--grid-surface-container)}.pivot-table .nested-header.row-dimension-header{background:var(--grid-surface-container);font-weight:600}.pivot-table .pivot-header-leafcols{padding:0;margin:0;height:0}.pivot-table .pivot-header-level.level-0 .nested-header{font-size:14px;padding:12px 8px}.pivot-table .pivot-header-level.level-1 .nested-header{font-size:13px;padding:10px 6px}.pivot-table .pivot-header-level.level-2 .nested-header{font-size:12px;padding:8px 4px}.pivot-table .nested-header:hover{background:var(--grid-surface-variant);color:var(--grid-primary);transition:all .2s ease}.pivot-table .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-table .pivot-cell-content{display:flex;justify-content:center;align-items:center;min-height:38px}.pivot-table .rowspan-cell{vertical-align:middle}.pivot-table .rowspan-cell .pivot-cell-content{height:100%}.pivot-mode .incremental-row-container{display:flex;flex-direction:column;height:auto;max-height:85vh;overflow:auto}.pivot-mode .h-shell{position:relative;width:calc(100% - var(--scrollbar-width, 17px))!important;top:0;z-index:1;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .h-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell{position:relative;bottom:50px;flex-shrink:0;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .gt-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell table{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.pivot-mode .gt-shell.adjust-bottom-vs{bottom:66px!important}.pivot-mode .gt-shell.adjust-bottom:not(.adjust-bottom-vs){bottom:calc(66px - var(--scrollbar-width, 17px))!important}.pivot-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .header-shell::-webkit-scrollbar{display:none}.pivot-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.pivot-mode .header-shell .eru-grid-table{margin-bottom:0;width:100%;table-layout:fixed}.pivot-mode .header-shell .eru-grid-table thead{background:var(--grid-surface-container)}.pivot-mode .header-shell .eru-grid-table thead th{background:var(--grid-surface-container);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .header-shell .eru-grid-table thead th.sticky-column{position:sticky;background:var(--grid-surface-container);z-index:111}.pivot-mode .header-shell .eru-grid-table tbody td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-container{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.pivot-mode .pivot-table{width:auto!important;min-width:100%!important;table-layout:fixed!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important}.pivot-mode .pivot-table td,.pivot-mode .pivot-table th{box-sizing:border-box!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-table{table-layout:fixed!important;width:100%!important}.pivot-mode .pivot-table *{max-width:var(--col-width)!important;box-sizing:border-box!important}.pivot-mode .pivot-table colgroup{width:100%!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex-basis:var(--col-width)!important;flex:0 0 var(--col-width)!important}.pivot-mode .pivot-table table{width:100%!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important}.pivot-mode .pivot-table[style*=--table-total-width]{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:0 0 var(--col-width)!important;flex-basis:var(--col-width)!important;flex-grow:0!important;flex-shrink:0!important;overflow:hidden!important}.pivot-mode .pivot-table tbody td,.pivot-mode .pivot-table thead th{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.pivot-mode .pivot-table .cell-content,.pivot-mode .pivot-table data-cell{width:100%!important;max-width:100%!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;display:block!important}.pivot-mode .pivot-table table{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-tbody tr.pivot-row{min-height:50px!important;height:50px!important}.pivot-mode .pivot-tbody tr.pivot-row:hover{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-tbody tr.pivot-row:nth-child(2n){background-color:#00000005}.pivot-mode .pivot-tbody tr.pivot-row td{min-height:50px!important;height:50px!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content{min-height:48px;display:flex;align-items:center;justify-content:center}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content data-cell{width:100%;min-height:46px;display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.pivot-mode .pivot-cell{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-mode .pivot-cell .cell-content{display:flex;justify-content:center;align-items:center;min-height:40px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.pivot-mode .pivot-table .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.pivot-mode .pivot-table .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .subtotal-row td:first-child{color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row td.aggregated-value{font-weight:500;color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.pivot-mode .pivot-table .subtotal-bold td{font-weight:600!important;font-style:normal!important}.pivot-mode .pivot-table .subtotal-bold td.aggregated-value{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td{font-style:italic!important}.pivot-mode .pivot-table .subtotal-italic td:first-child{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.pivot-mode .pivot-table .subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted td.aggregated-value{font-weight:500!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted:hover,.pivot-mode .pivot-table .subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-row{background-color:var(--grid-surface-container-high)!important;font-weight:700;font-size:var(--grid-font-size-body)}.pivot-mode .pivot-table .grand-total-row td{background-color:var(--grid-surface-container-high)!important;color:var(--grid-on-surface)}.pivot-mode .pivot-table .grand-total-row td:first-child{font-style:normal;font-weight:800;color:var(--grid-primary)}.pivot-mode .pivot-table .grand-total-row td.aggregated-value{font-weight:500;color:var(--grid-primary);font-family:Roboto Mono,monospace}.pivot-mode .pivot-table .grand-total-row:hover,.pivot-mode .pivot-table .grand-total-row:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-bold td{font-weight:700!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-bold td.aggregated-value{font-weight:700!important}.pivot-mode .pivot-table .grand-total-italic td,.pivot-mode .pivot-table .grand-total-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted{background-color:var(--grid-primary)!important;box-shadow:var(--grid-elevation-2)!important}.pivot-mode .pivot-table .grand-total-highlighted td{background-color:var(--grid-primary)!important;color:var(--grid-on-primary)!important;font-weight:500!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-highlighted td.aggregated-value{color:var(--grid-on-primary)!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted:hover,.pivot-mode .pivot-table .grand-total-highlighted:hover td{background-color:var(--grid-primary)!important}.pivot-mode .pivot-table .collapsible-header{position:relative}.pivot-mode .pivot-table .collapsible-header .header-content{display:flex;align-items:center;justify-content:space-between;gap:var(--grid-spacing-xs);padding:var(--grid-spacing-xs) var(--grid-spacing-sm)}.pivot-mode .pivot-table .collapsible-header .header-label{flex:1;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn{background:none;border:none;cursor:pointer;padding:var(--grid-spacing-xxs);margin:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:var(--grid-border-radius);color:var(--grid-on-surface-variant);transition:all .2s ease;font-size:12px;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:hover{background-color:var(--grid-surface-container);color:var(--grid-primary);transform:scale(1.1)}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:focus{outline:2px solid var(--grid-primary);outline-offset:1px}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn .collapse-icon{display:block;line-height:1;font-family:monospace;font-size:14px}.pivot-mode .pivot-table .collapsible-header.expanded .collapse-toggle-btn .collapse-icon{color:var(--grid-primary)}.pivot-mode .pivot-table .collapsible-header.collapsed{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .header-label{font-style:italic;color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .collapse-toggle-btn .collapse-icon{color:var(--grid-outline)}.pivot-mode .pivot-table .collapsible-header:hover{background-color:var(--grid-surface-container)}.pivot-mode .pivot-table .collapsible-header:hover .header-label{color:var(--grid-on-surface)}.pivot-mode .pivot-table .pivot-single-table{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden;min-height:var(--table-min-height)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container{flex-shrink:0;background:var(--grid-surface)!important;overflow-x:auto;overflow-y:hidden;min-height:100px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table{width:auto;min-width:100%;height:auto!important;min-height:100px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th{background:var(--grid-surface-container)!important;padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:40px!important;height:auto!important;position:relative;visibility:visible!important;color:var(--grid-on-surface)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:101!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container{flex:1;overflow:auto;min-height:300px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-viewport{height:100%!important;width:100%!important;overflow-x:auto!important;overflow-y:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table{width:auto;min-width:100%;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td{padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:32px!important;height:auto!important;background:var(--grid-surface)!important;color:var(--grid-on-surface)!important;visibility:visible!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td.sticky-column,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:100!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr{height:auto!important;min-height:50px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr.pivot-row,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr.pivot-row{visibility:visible!important;display:table-row!important}.pivot-mode .pivot-table .collapsed-column-group{background-color:var(--grid-surface-container);border-left:3px solid var(--grid-primary)}.pivot-mode .pivot-table .collapsed-column-group:hover{background-color:var(--grid-surface-container-high)}.pivot-row.subtotal-row{background-color:var(--grid-surface-variant);font-weight:500}.pivot-row.subtotal-row.subtotal-bold{font-weight:500}.pivot-row.subtotal-row.subtotal-italic{font-style:italic}.pivot-row.subtotal-row.subtotal-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.grand-total-row{background-color:var(--grid-surface-container);font-weight:600}.pivot-row.grand-total-row.grand-total-bold{font-weight:800}.pivot-row.grand-total-row.grand-total-italic{font-style:italic}.pivot-row.grand-total-row.grand-total-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.first-visible-row{background-color:#6750a41a!important;position:relative}.pivot-row.first-visible-row:before{content:\"\\1f441\\fe0f First Visible\";position:absolute;top:-20px;left:0;background:var(--grid-primary);color:var(--grid-on-primary);padding:2px 6px;font-size:10px;border-radius:2px;z-index:1000}.header-wrap-text{white-space:pre-wrap;word-break:auto-phrase}.custom-collapse-header{background-color:var(--grid-surface-variant);padding:8px 20px;border-top-left-radius:12px;border-top-right-radius:12px;cursor:pointer;display:flex;width:fit-content;align-items:center;-webkit-user-select:none;user-select:none;min-width:200px;margin-bottom:10px;position:sticky;left:1px;z-index:116}.custom-collapse-header .collapse-arrow{display:inline-block;margin-right:8px;font-size:12px;color:var(--grid-on-surface-variant);transition:transform .2s ease;transform:rotate(0)}.custom-collapse-header .collapse-arrow.rotate-arrow{transform:rotate(270deg)}.custom-collapse-header .f-12{font-size:12px;color:var(--grid-on-surface)}.table-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .header-shell::-webkit-scrollbar{display:none}.table-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.table-mode .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.table-mode .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.table-mode .subtotal-row td:first-child{color:var(--grid-primary)}.table-mode .subtotal-row td.subtotal-cell{font-weight:500}.table-mode .subtotal-row td.subtotal-cell .subtotal-label{font-weight:600;color:var(--grid-primary)}.table-mode .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.table-mode .subtotal-row.subtotal-bold td{font-weight:600!important;font-style:normal!important}.table-mode .subtotal-row.subtotal-italic td{font-style:italic!important}.table-mode .subtotal-row.subtotal-italic td:first-child{font-weight:600!important}.table-mode .subtotal-row.subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.table-mode .subtotal-row.subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.table-mode .subtotal-row.subtotal-highlighted:hover,.table-mode .subtotal-row.subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row-shell{width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .subtotal-row-shell::-webkit-scrollbar{display:none}\n"], dependencies: [{ kind: "component", type: DataCellComponent, selector: "data-cell", inputs: ["eruGridStore", "fieldSize", "columnDatatype", "columnName", "column", "value", "id", "frozenGrandTotalCell", "td", "drillable", "mode", "isEditable"], outputs: ["tdChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1$3.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1$3.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1$3.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: ResizeColumnDirective, selector: "[resizeColumn]", inputs: ["resizeColumn", "index", "columnConfig", "gridConfig"] }, { kind: "directive", type: ColumnDragDirective, selector: "[columnDraggable]", inputs: ["columnDraggable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
11303
|
+
], viewQueries: [{ propertyName: "rowContainer", first: true, predicate: ["rowContainer"], descendants: true }, { propertyName: "headerScroller", first: true, predicate: ["headerScroller"], descendants: true, read: ElementRef }, { propertyName: "gtScroller", first: true, predicate: ["gtScroller"], descendants: true, read: ElementRef }, { propertyName: "viewport", first: true, predicate: ["vp"], descendants: true }, { propertyName: "groupsViewport", first: true, predicate: ["groupsViewport"], descendants: true }, { propertyName: "groupsScrollContainerEl", first: true, predicate: ["groupsScrollContainer"], descendants: true }, { propertyName: "allViewports", predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "headerScrollers", predicate: ["headerScroller"], descendants: true }], ngImport: i0, template: "<!-- <div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\ncurrentPivotScrollIndex {{currentPivotScrollIndex()}} |\nfirstDataRowIndex {{firstDataRowIndex()}} |\nfirstTr {{firstTr}} |\nmaxDepth {{maxDepth()}}\n</div> -->\n<div class=\"incremental-row-container eru-grid\" #rowContainer [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode() && !isBoardMode()\" [class.board-mode-host]=\"isBoardMode()\">\n <!-- Pivot Mode Template -->\n @if (gridStore.isPivotMode()) {\n <ng-container>\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%;\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <!-- Debug info for first visible row -->\n\n\n <div class=\"pivot-single-table\"\n style=\"height: 100%; width: 100%; overflow: hidden; display: flex; flex-direction: column;\">\n @if (freezeHeader()) {\n <div #headerScroller class=\"header-shell\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n @if(grandTotalPosition() === 'before' && freezeGrandTotal()) {\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n }\n </table>\n </div>\n }\n <!-- Virtual Scrolled Table Body -->\n <div>\n <cdk-virtual-scroll-viewport #vp [itemSize]=\"50\" class=\"viewport pivot-viewport\"\n [class.apply-cdk-width]=\"applyCdkWidth()\" (scrolledIndexChange)=\"onPivotScroll($event)\"\n (scroll)=\"onBodyScroll($event)\" style=\"overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n @if (!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n }\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\n\n <tr *cdkVirtualFor=\"let pivotRow of gridStore.pivotDisplayData(); \n trackBy: trackByPivotRowFn; \n let i = index\" class=\"pivot-row\" [class.subtotal-row]=\"pivotRow._isSubtotal\"\n [class.grand-total-row]=\"pivotRow._isGrandTotal\"\n [class.subtotal-bold]=\"pivotRow._isSubtotal && subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"pivotRow._isSubtotal && subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"pivotRow._isSubtotal && subTotalStyle() === 'highlighted'\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\" [attr.data-pivot-row]=\"i\">\n @if ((!pivotRow._isGrandTotal && freezeGrandTotal() ) || (!freezeGrandTotal() )) {\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.pivot-repeated-value]=\"isRepeatedDimensionValue(i, column.name)\"\n [class.pivot-group-start]=\"isPivotGroupStart(i, column.name)\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\" [style.height.px]=\"50\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell [class.aggregation]=\"!!column.aggregationFunction\" [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\" [value]=\"pivotRow[column.name]\"\n [column]=\"column\" [drillable]=\"column.enableDrilldown || false\" [mode]=\"mode()\"\n [isEditable]=\"isEditable()\" [id]=\"'pivot_' + i + '_' + column.name\" [eruGridStore]=\"gridStore\"\n [row]=\"pivotRow\">\n </data-cell>\n </div>\n </td>\n }\n } @else {\n <td [style.height.px]=\"50\" [attr.colspan]=\"getLeafColumns().length\"> </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n\n </div>\n @if (freezeGrandTotal() && grandTotalPosition() === 'after') {\n <div #gtScroller class=\"header-shell gt-shell\" [class.adjust-bottom]=\"!applyCdkWidth()\"\n [class.adjust-bottom-vs]=\"adjustScrollWidth()\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n\n </table>\n </div>\n }\n\n\n </div>\n </div>\n </ng-container>\n } @else if (isBoardMode()) {\n <!-- Board Mode Template -->\n <div class=\"board-view-container\">\n <div class=\"board-columns-wrapper\">\n @for (group of groups(); track group.id) {\n <div class=\"board-column\">\n <div class=\"column-header\">\n <span class=\"column-header-title\">{{ group.title }}</span>\n <span class=\"column-header-count\">{{ group.currentLoadedRows || 0 }} of {{ group.totalRowCount || 0 }}</span>\n </div>\n <cdk-virtual-scroll-viewport [itemSize]=\"BOARD_CARD_ITEM_HEIGHT\" class=\"board-column-body\"\n (scrolledIndexChange)=\"onBoardScrolledIndexChange($event, group)\">\n <div *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); templateCacheSize: 0\"\n class=\"board-card-container\">\n <mat-card class=\"board-card\">\n <!-- <mat-card-header>\n <mat-card-title>#{{ row?.entity_id?.substring(0,8) }}</mat-card-title>\n <mat-card-subtitle>{{ row?.entity_data?.['name'] || row?.entity_id }}</mat-card-subtitle>\n </mat-card-header>\n --> <mat-card-content>\n @for (column of visibleBoardFields(); track column.name) {\n @if (row?.entity_data?.[column.name] !== undefined) {\n\n <div class=\"board-card-field\">\n <span class=\"board-field-label\">{{ column.label }}</span>\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\" [column]=\"column\" [value]=\"row?.entity_data?.[column.name]\"\n [id]=\"row?.entity_id + '_' + column.name\" [eruGridStore]=\"gridStore\" [mode]=\"'board'\" [row]=\"row\">\n </data-cell>\n </div>\n }\n }\n\n </mat-card-content>\n <mat-card-actions align=\"end\">\n <button mat-icon-button (click)=\"onActionClick($event, row)\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n </mat-card-actions>\n </mat-card>\n </div>\n </cdk-virtual-scroll-viewport>\n @if (group.isLoading) {\n <div class=\"board-ghost-card\">\n <div class=\"board-ghost-line\"></div>\n <div class=\"board-ghost-line board-ghost-line--short\"></div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n\n <!-- Table Mode Template -->\n <!-- Scrollable groups container \u2014 plain iteration avoids CDK fixed-height estimation errors -->\n <div #groupsScrollContainer class=\"groups-scroll-container\" (scroll)=\"onGroupsViewportScroll($event)\">\n\n @for (group of groups(); track trackByGroupFn($index, group); let i = $index) {\n <div class=\"group-container\" [attr.data-group-id]=\"group.id || ''\">\n <!-- Combined sitcky header with group info and table -->\n <div style=\"\n background:var(--grid-surface);\n position: sticky;\n top: 0;\n z-index: 115;\n \">\n <div class=\"custom-collapse-header\" (click)=\"toggleGroupCollapse(group.id)\">\n <span class=\"collapse-arrow\" [ngClass]=\"{\n 'rotate-arrow': group.isExpanded,\n }\">\u25BC</span>\n <span class=\"f-12\">\n {{ group?.title || \"\" }}\n {{ group?.currentLoadedRows || 0 }} -\n {{ group?.totalRowCount || 0 }} rows...</span>\n </div>\n\n @if(freezeHeader() && group.isExpanded) {\n <div #headerScroller class=\"header-shell\" [attr.data-group-id]=\"'header-shell-' + group.id\"\n [style]=\"'--table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <table class=\"eru-grid-table\" [class.freeze-header]=\"freezeHeader()\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n <!-- Grand Total row after sticky header (position: before) - only for first group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after sticky header (position: before) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n </table>\n </div>\n }\n </div>\n @if(group.isExpanded) {\n <ng-container>\n <cdk-virtual-scroll-viewport [attr.data-group-id]=\"group.id\" [itemSize]=\"30\" class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event, group)\" (scroll)=\"onTableBodyScroll($event)\"\n [style]=\"'--table-height: ' + getGroupContentHeight(group.id) + 'px; --table-min-height: ' + getGroupContentHeight(group.id) + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\"\n [class.show-column-lines]=\"showColumnLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n @if(!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n }\n <!-- Grand Total row after normal header (position: before) - only for first group -->\n @if(!freezeHeader() && enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' &&\n hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after normal header (position: before) -->\n @if(!freezeHeader() && enableColumnSubtotals() && subtotalPositionColumn() === 'before' &&\n hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n <tbody>\n @if (columns(); as columnsList) {\n <!-- <tr *ngIf=\"groupItem.type === 'table-header' && groups().length > 1\" style=\"background:#fafafa\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n }\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr> -->\n <!-- @if(getRowsForGroup(group.id).length > 0 && group.isExpanded) { -->\n <!-- *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); \n trackBy: trackByRowFn; \n let i = index\" -->\n <!-- @for(row of getRowsForGroupSignal(group.id)(); track trackByRowFn($index, row); let i = $index) { -->\n <tr\n *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id || '')(); trackBy: trackByRowFn; let i = index\"\n class=\"row-item\" [attr.data-row-id]=\"i\" [style.height.px]=\"30\" [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input type=\"checkbox\" [checked]=\"isRowSelected(row?.entity_id)\"\n (change)=\"toggleRowSelection($event, row)\">\n </td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\"\n style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td #cell [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\" [style.height.px]=\"30\" [style.minHeight.px]=\"30\" [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\" [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\">\n <div class=\"cell-content\">\n <data-cell #datacell [td]=cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\" [value]=\"row?.['entity_data']?.[column.name] || ''\" [column]=\"column\"\n [mode]=\"mode()\" [isEditable]=\"isEditable()\" [drillable]=\"column.enableDrilldown || false\"\n [id]=\"i + '_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"row\"></data-cell>\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\"\n style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n </tr>\n <!-- } -->\n <!-- } -->\n @if(group.isLoading && group.isExpanded) {\n @for(i of [].constructor(ghostRows()); let j = $index; track j) {\n <tr class=\"ghost-loading-row\" [style.height.px]=\"30\" [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n </tr>\n }\n }\n <!-- <tr\n *ngIf=\"getRowsForGroup(group.id).length === 0 && !group.isExpanded\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"groupSeperatorColSpan()\" class=\"separator-cell\"></td>\n </tr> -->\n <!-- Subtotal row at end of group (position: after) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'after' && hasSubtotalData(group)) {\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n }\n <!-- Grand Total row at end of group (position: after) - only for last group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'after' && hasGrandTotalData() && i ===\n groups().length - 1) {\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n }\n }\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n }\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Pivot Table Header Template -->\n<ng-template #pivotTableHead>\n <thead>\n @if (hasNestedHeaders()) {\n <ng-container>\n @for (headerRow of getHeaderRows(); track headerRow; let rowIndex = $index) {\n <tr class=\"pivot-header pivot-header-container\" [class.pivot-header-level]=\"'level-' + rowIndex\">\n @for (header of headerRow; track trackByHeaderFn($index, header); let colIndex = $index) {\n <th [attr.colspan]=\"header.colspan\" [attr.rowspan]=\"header.rowspan\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable') && header.level === 0 && !isRowDimensionHeader(header)\"\n [columnConfig]=\"getFieldForPivotHeader(header)\" class=\"column-header pivot-column-header nested-header\"\n [class.row-dimension-header]=\"isRowDimensionHeader(header)\"\n [class.column-dimension-header]=\"!isRowDimensionHeader(header)\" [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\" [class.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n\n <data-cell [fieldSize]=\"header.field_size\" [columnDatatype]=\"header.dataType\" [columnName]=\"header.name\"\n [value]=\"header.label\" [column]=\"header\" [frozenGrandTotalCell]=\"true\"\n [drillable]=\"header.enableDrilldown || false\" [mode]=\"mode()\" [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + $index + '_' + header.name\" [eruGridStore]=\"gridStore\" [row]=\"header\">\n </data-cell>\n <!-- <span class=\"header-label header-wrap-text\">{{header.label}}</span> -->\n <!-- <button *ngIf=\"!isRowDimensionHeader(header)\"\n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button> -->\n </div>\n </th>\n }\n </tr>\n }\n </ng-container>\n } @else {\n <!-- Simple header fallback -->\n <ng-container>\n <tr class=\"pivot-header\" [class.freeze-header-enabled]=\"freezeHeader()\">\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <th [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\" [columnConfig]=\"column\"\n class=\"column-header pivot-column-header\" [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px;height: auto;padding: 8px 6px\">\n {{column.label}}\n </th>\n }\n </tr>\n </ng-container>\n }\n\n </thead>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #pivotColGroup>\n <colgroup>\n @for (column of getLeafColumns(); track trackByColumnFn($index, column)) {\n <col\n [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n </colgroup>\n</ng-template>\n\n<ng-template #pivotGrandTotal>\n <tbody class=\"pivot-tbody\">\n @for (pivotRow of gridStore.pivotGrandTotalData(); track trackByPivotRowFn($index, pivotRow); let i = $index) {\n <tr class=\"pivot-row grand-total-row\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\" [attr.data-pivot-row]=\"i\">\n <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\" [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\" class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\" [style.height.px]=\"50\" [attr.xx]=\"i\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\" [column]=\"column\" [frozenGrandTotalCell]=\"true\"\n [drillable]=\"column.enableDrilldown || false\" [mode]=\"mode()\" [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"pivotRow\">\n </data-cell>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #tableColGroup>\n <colgroup>\n @if(gridStore.configuration().config.allowSelection) {\n <col style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n }\n @if(shouldShowActionColumn('before')) {\n <col style=\"width: 60px; min-width: 60px; max-width: 60px;\">\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <col\n [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n @if(shouldShowActionColumn('after')) {\n <col style=\"width: 60px; min-width: 60px; max-width: 60px;\">\n }\n </colgroup>\n</ng-template>\n\n\n<ng-template #tableHeader>\n\n <thead>\n @if(shouldShowRequiredToggleRow()) {\n <tr class=\"required-toggle-row\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input type=\"checkbox\" [checked]=\"isAllGroupsSelected()\" (change)=\"toggleAllGroups($event)\">\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"required-toggle-cell\">\n @if(i === 0) {\n <span class=\"required-label\">required</span>\n }\n <mat-checkbox [checked]=\"column.required || false\"\n (change)=\"onColumnRequiredChange(column.name, $event.checked)\" [title]=\"'Make ' + column.label + ' required'\">\n </mat-checkbox>\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n </tr>\n }\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input type=\"checkbox\" [checked]=\"isAllGroupsSelected()\" (change)=\"toggleAllGroups($event)\">\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th [style.width.px]=\"column.field_size\" [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\" [index]=\"i\"\n [columnDraggable]=\"gridStore.isFeatureEnabled('columnReorderable') ? i : null\"\n [style.minWidth.px]=\"column.field_size\" class=\"column-header table-column-header\">\n @if(gridStore.isFeatureEnabled('columnReorderable')) {\n <div class=\"column-drag-handle\"></div>\n }\n <!-- <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"column.label\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell> -->\n {{column.label}}\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n </tr>\n </thead>\n</ng-template>\n\n<!-- Table Subtotal Row Template -->\n<ng-template #tableSubtotal let-group=\"group\">\n <tr class=\"subtotal-row\" [class.subtotal-bold]=\"subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"subTotalStyle() === 'highlighted'\" [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"subtotal-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getSubtotalValue(group, column.name) === null) {\n <span class=\"subtotal-label\">{{subtotalLabel()}}</span>\n } @else {\n @if(getSubtotalValue(group, column.name) !== null) {\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\"\n [value]=\"getSubtotalValue(group, column.name)\" [column]=\"column\" [mode]=\"mode()\" [isEditable]=\"false\"\n [id]=\"'subtotal_' + group.id + '_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"group.subtotal\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>\n\n<!-- Table Grand Total Row Template -->\n<ng-template #tableGrandTotal>\n <tr class=\"grand-total-row\" [class.grand-total-bold]=\"grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"grandTotalStyle() === 'highlighted'\" [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"grand-total-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getGrandTotalValue(column.name) === null) {\n <span class=\"grand-total-label\">Grand Total</span>\n } @else {\n @if(getGrandTotalValue(column.name) !== null) {\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\"\n [value]=\"getGrandTotalValue(column.name)\" [column]=\"column\" [mode]=\"mode()\" [isEditable]=\"false\"\n [id]=\"'grandtotal_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"gridStore.rowGrandTotal()\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>", styles: ["@charset \"UTF-8\";:host{display:block!important;width:100%;height:100%;flex:1 1 0%;min-height:var(--grid-height, 300px);font-family:var(--grid-font-family);--grid-primary: #6750a4;--grid-on-primary: #ffffff;--grid-surface: #fef7ff;--grid-surface-variant: #e7e0ec;--grid-surface-container: #f3edf7;--grid-surface-container-high: #ede7f0;--grid-on-surface: #1d1b20;--grid-on-surface-variant: #49454f;--grid-outline: #79757f;--grid-outline-variant: #cac4d0;--grid-error: #ba1a1a;--grid-error-container: #ffdad6;--grid-font-family: \"Poppins\", \"Roboto\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--grid-font-size-body: 12px;--grid-font-size-caption: 12px !important;--grid-line-height-body: 1;--grid-aggregation-text-align: right;--grid-number-text-align: right;--grid-spacing-xxs: 2px;--grid-spacing-xs: 4px;--grid-spacing-sm: 8px;--grid-spacing-md: 16px;--grid-spacing-lg: 24px;--grid-border-radius: 4px;--grid-elevation-1: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 1px 3px 1px rgba(0, 0, 0, .15);--grid-elevation-2: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 2px 6px 2px rgba(0, 0, 0, .15)}.group-container{padding-bottom:8px}.incremental-row-container{width:100%;height:100%;min-height:var(--grid-height, 300px);max-height:none;overflow:auto;position:relative;background-color:var(--grid-surface);border-radius:var(--grid-border-radius);font-family:var(--grid-font-family)}.viewport{height:100%;min-height:300px;overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface);scrollbar-gutter:stable}.viewport.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.groups-viewport{height:100%;min-height:300px}.groups-scroll-container{height:var(--grid-height, 600px);overflow-y:auto;overflow-x:hidden}.table-viewport{background-color:var(--grid-surface);height:var(--table-height, auto);min-height:var(--table-min-height, 100px);overflow-x:auto;overflow-y:auto}.pivot-viewport{min-height:var(--table-min-height, 300px);overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface)}.pivot-viewport .cdk-virtual-scroll-content-wrapper{width:auto;height:auto}.table-wrapper{min-width:100%;overflow-x:visible}.incremental-row-container .eru-grid-table,.eru-grid-table{width:100%!important;border-collapse:separate;border-spacing:0;table-layout:fixed!important;background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body);line-height:var(--grid-line-height-body)}.eru-grid-table th,.eru-grid-table td{text-align:left;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;background-color:var(--grid-surface);color:var(--grid-on-surface);min-width:0;max-width:100%!important;box-sizing:border-box;position:relative}.eru-grid-table th:hover,.eru-grid-table td:hover{background-color:var(--grid-surface-variant)}.eru-grid-table thead{background-color:var(--grid-surface-container);transform:translateZ(0);will-change:transform;backface-visibility:hidden}.eru-grid-table thead.freeze-header-enabled{position:sticky!important;top:0!important;z-index:100!important}.eru-grid-table thead th{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-weight:500;font-size:var(--grid-font-size-caption)}.checkbox-column{width:50px;min-width:50px;max-width:50px;text-align:center;background-color:var(--grid-surface-container)}.checkbox-column input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:var(--grid-primary);border-radius:var(--grid-border-radius)}.checkbox-column input[type=checkbox]:focus{outline:2px solid var(--grid-primary);outline-offset:2px}.action-column{width:40px;min-width:40px;max-width:40px;text-align:center;background-color:var(--grid-surface-container)}.action-column mat-icon{font-size:20px;width:20px;height:20px;line-height:20px;color:var(--grid-on-surface-variant);cursor:pointer}.action-column mat-icon:hover{color:var(--grid-primary)}.group-header{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-size:var(--grid-font-size-caption);font-weight:500;border-bottom:1px solid var(--grid-outline);cursor:pointer;transition:background-color .2s ease}.group-header:hover{background-color:var(--grid-surface-container-high)}.group-header .group-title{font-weight:600;color:var(--grid-primary)}.group-header .group-row-count{color:var(--grid-on-surface-variant);font-size:var(--grid-font-size-caption);margin-left:var(--grid-spacing-sm)}.row-item{border:1px solid var(--grid-outline);background-color:var(--grid-surface);transition:background-color .2s ease,box-shadow .2s ease}.row-item:hover{background-color:var(--grid-surface-variant);box-shadow:var(--grid-elevation-1)}.required-toggle-row{background-color:var(--grid-surface-container, #f3edf7);border-bottom:1px solid var(--grid-outline-variant, #cac4d0)}.required-toggle-row .required-toggle-cell{padding:4px 8px!important;text-align:center;vertical-align:middle;position:relative}.required-toggle-row .required-toggle-cell .required-label{position:absolute;top:2px;left:4px;font-size:10px;color:var(--grid-on-surface-variant, #49454f);font-weight:400;text-transform:lowercase}.required-toggle-row .required-toggle-cell mat-checkbox{display:flex;justify-content:center;align-items:center}.table-column-header{padding:12px 8px}.column-header{font-weight:500;text-align:center!important;font-size:var(--grid-font-size-caption, 12px);position:relative;-webkit-user-select:none;user-select:none;background-color:var(--grid-surface-container);color:var(--grid-on-surface)}.column-header:hover{background-color:var(--grid-surface-container-high)}.column-drag-handle{position:absolute;left:0;top:0;bottom:0;width:12px;cursor:grab;opacity:0;transition:opacity .2s ease,background-color .2s ease;z-index:2;display:flex;align-items:center;justify-content:center;border-right:1px solid transparent}.column-drag-handle:after{content:\"\\22ee\\22ee\";font-size:14px;color:var(--grid-on-surface-variant);transform:rotate(90deg)}.column-drag-handle:hover{background-color:var(--grid-surface-container-high);border-right-color:var(--grid-outline)}.column-header:hover .column-drag-handle{opacity:1}.column-drag-handle:active{cursor:grabbing}.dragging{opacity:1;background-color:var(--grid-surface-container);box-shadow:var(--grid-elevation-2)}.drag-over{background-color:var(--grid-surface-container);border-color:var(--grid-primary)}.data-cell{background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body)}.cell-content{align-items:center}.cell-content .mdc-text-field{padding:0px var(--grid-spacing-xxs)!important}.cell-display-text{align-items:center;padding:0px var(--grid-spacing-xs)}.ghost-loading-row{background-color:transparent}.ghost-cell-container{padding:var(--grid-spacing-sm)}.ghost-cell{height:20px;width:100%;background-color:var(--grid-surface-container);animation:pulse 1.5s ease-in-out infinite;border-radius:var(--grid-border-radius)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.column-resizer{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background-color:transparent;transition:background-color .2s ease}.column-resizer:hover{background-color:var(--grid-primary)}.group-separator{height:var(--grid-spacing-sm);background-color:var(--grid-surface-variant)}.group-separator .separator-cell{background-color:var(--grid-surface-variant);border:none;height:var(--grid-spacing-sm)}.error-state{background-color:var(--grid-error-container);color:var(--grid-error);border-color:var(--grid-error)}.error-message{background-color:var(--grid-error);color:#fff;padding:var(--grid-spacing-sm);border-radius:var(--grid-border-radius);font-size:var(--grid-font-size-caption)}.incremental-row-container .eru-grid-table tbody,.incremental-row-container .eru-grid-table{position:relative}.incremental-row-container .eru-grid-table.show-column-lines{border-right:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-top:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-column-lines:not(.freeze-header){border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table:not(.show-column-lines){border:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table thead:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:calc(var(--grid-outline-width, 1px) * 2);background-color:var(--grid-outline, #e0e0e0);pointer-events:none;z-index:10}.incremental-row-container .eru-grid-table.show-column-lines thead th,.incremental-row-container .eru-grid-table.show-column-lines tbody td{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines thead th{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines tbody td{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}@media(max-width:768px){.incremental-row-container{height:600px}.eru-grid-table th,.eru-grid-table td{font-size:var(--grid-font-size-caption)}.checkbox-column{width:40px;min-width:40px;max-width:40px}}@media(prefers-contrast:high){.eru-grid-table th,.eru-grid-table td{border-width:2px}.row-item:hover{border-width:2px;border-color:var(--grid-primary)}}@media(prefers-reduced-motion:reduce){.row-item,.column-drag-handle,.ghost-cell{transition:none;animation:none}}.pivot-table .nested-header{text-align:center;font-weight:600;background:var(--grid-surface-container)}.pivot-table .nested-header.row-dimension-header{background:var(--grid-surface-container);font-weight:600}.pivot-table .pivot-header-leafcols{padding:0;margin:0;height:0}.pivot-table .pivot-header-level.level-0 .nested-header{font-size:14px;padding:12px 8px}.pivot-table .pivot-header-level.level-1 .nested-header{font-size:13px;padding:10px 6px}.pivot-table .pivot-header-level.level-2 .nested-header{font-size:12px;padding:8px 4px}.pivot-table .nested-header:hover{background:var(--grid-surface-variant);color:var(--grid-primary);transition:all .2s ease}.pivot-table .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-table .pivot-cell-content{display:flex;justify-content:center;align-items:center;min-height:38px}.pivot-table .pivot-repeated-value .cell-content,.pivot-table .pivot-repeated-value .pivot-cell-content{visibility:hidden}.pivot-table .pivot-group-start.row-dimension-cell{border-top:1px solid var(--grid-outline, #79757f)}.pivot-mode .incremental-row-container{display:flex;flex-direction:column;height:auto;max-height:85vh;overflow:auto}.pivot-mode .h-shell{position:relative;width:calc(100% - var(--scrollbar-width, 17px))!important;top:0;z-index:1;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .h-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell{position:relative;bottom:50px;flex-shrink:0;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .gt-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell table{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.pivot-mode .gt-shell.adjust-bottom-vs{bottom:66px!important}.pivot-mode .gt-shell.adjust-bottom:not(.adjust-bottom-vs){bottom:calc(66px - var(--scrollbar-width, 17px))!important}.pivot-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .header-shell::-webkit-scrollbar{display:none}.pivot-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.pivot-mode .header-shell .eru-grid-table{margin-bottom:0;width:100%;table-layout:fixed}.pivot-mode .header-shell .eru-grid-table thead{background:var(--grid-surface-container)}.pivot-mode .header-shell .eru-grid-table thead th{background:var(--grid-surface-container);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .header-shell .eru-grid-table thead th.sticky-column{position:sticky;background:var(--grid-surface-container);z-index:111}.pivot-mode .header-shell .eru-grid-table tbody td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-container{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.pivot-mode .pivot-table{width:auto!important;min-width:100%!important;table-layout:fixed!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important}.pivot-mode .pivot-table td,.pivot-mode .pivot-table th{box-sizing:border-box!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-table{table-layout:fixed!important;width:100%!important}.pivot-mode .pivot-table *{max-width:var(--col-width)!important;box-sizing:border-box!important}.pivot-mode .pivot-table colgroup{width:100%!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex-basis:var(--col-width)!important;flex:0 0 var(--col-width)!important}.pivot-mode .pivot-table table{width:100%!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important}.pivot-mode .pivot-table[style*=--table-total-width]{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:0 0 var(--col-width)!important;flex-basis:var(--col-width)!important;flex-grow:0!important;flex-shrink:0!important;overflow:hidden!important}.pivot-mode .pivot-table tbody td,.pivot-mode .pivot-table thead th{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.pivot-mode .pivot-table .cell-content,.pivot-mode .pivot-table data-cell{width:100%!important;max-width:100%!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;display:block!important}.pivot-mode .pivot-table table{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-tbody tr.pivot-row{min-height:50px!important;height:50px!important}.pivot-mode .pivot-tbody tr.pivot-row:hover{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-tbody tr.pivot-row:nth-child(2n){background-color:#00000005}.pivot-mode .pivot-tbody tr.pivot-row td{min-height:50px!important;height:50px!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content{min-height:48px;display:flex;align-items:center;justify-content:center}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content data-cell{width:100%;min-height:46px;display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.pivot-mode .pivot-cell{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-mode .pivot-cell .cell-content{display:flex;justify-content:center;align-items:center;min-height:40px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.pivot-mode .pivot-table .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.pivot-mode .pivot-table .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .subtotal-row td:first-child{color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row td.aggregated-value{font-weight:500;color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.pivot-mode .pivot-table .subtotal-bold td{font-weight:600!important;font-style:normal!important}.pivot-mode .pivot-table .subtotal-bold td.aggregated-value{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td{font-style:italic!important}.pivot-mode .pivot-table .subtotal-italic td:first-child{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.pivot-mode .pivot-table .subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted td.aggregated-value{font-weight:500!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted:hover,.pivot-mode .pivot-table .subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-row{background-color:var(--grid-surface-container-high)!important;font-weight:700;font-size:var(--grid-font-size-body)}.pivot-mode .pivot-table .grand-total-row td{background-color:var(--grid-surface-container-high)!important;color:var(--grid-on-surface)}.pivot-mode .pivot-table .grand-total-row td:first-child{font-style:normal;font-weight:800;color:var(--grid-primary)}.pivot-mode .pivot-table .grand-total-row td.aggregated-value{font-weight:500;color:var(--grid-primary);font-family:Roboto Mono,monospace}.pivot-mode .pivot-table .grand-total-row:hover,.pivot-mode .pivot-table .grand-total-row:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-bold td{font-weight:700!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-bold td.aggregated-value{font-weight:700!important}.pivot-mode .pivot-table .grand-total-italic td,.pivot-mode .pivot-table .grand-total-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted{background-color:var(--grid-primary)!important;box-shadow:var(--grid-elevation-2)!important}.pivot-mode .pivot-table .grand-total-highlighted td{background-color:var(--grid-primary)!important;color:var(--grid-on-primary)!important;font-weight:500!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-highlighted td.aggregated-value{color:var(--grid-on-primary)!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted:hover,.pivot-mode .pivot-table .grand-total-highlighted:hover td{background-color:var(--grid-primary)!important}.pivot-mode .pivot-table .collapsible-header{position:relative}.pivot-mode .pivot-table .collapsible-header .header-content{display:flex;align-items:center;justify-content:space-between;gap:var(--grid-spacing-xs);padding:var(--grid-spacing-xs) var(--grid-spacing-sm)}.pivot-mode .pivot-table .collapsible-header .header-label{flex:1;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn{background:none;border:none;cursor:pointer;padding:var(--grid-spacing-xxs);margin:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:var(--grid-border-radius);color:var(--grid-on-surface-variant);transition:all .2s ease;font-size:12px;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:hover{background-color:var(--grid-surface-container);color:var(--grid-primary);transform:scale(1.1)}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:focus{outline:2px solid var(--grid-primary);outline-offset:1px}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn .collapse-icon{display:block;line-height:1;font-family:monospace;font-size:14px}.pivot-mode .pivot-table .collapsible-header.expanded .collapse-toggle-btn .collapse-icon{color:var(--grid-primary)}.pivot-mode .pivot-table .collapsible-header.collapsed{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .header-label{font-style:italic;color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .collapse-toggle-btn .collapse-icon{color:var(--grid-outline)}.pivot-mode .pivot-table .collapsible-header:hover{background-color:var(--grid-surface-container)}.pivot-mode .pivot-table .collapsible-header:hover .header-label{color:var(--grid-on-surface)}.pivot-mode .pivot-table .pivot-single-table{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden;min-height:var(--table-min-height)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container{flex-shrink:0;background:var(--grid-surface)!important;overflow-x:auto;overflow-y:hidden;min-height:100px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table{width:auto;min-width:100%;height:auto!important;min-height:100px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th{background:var(--grid-surface-container)!important;padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:40px!important;height:auto!important;position:relative;visibility:visible!important;color:var(--grid-on-surface)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:101!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container{flex:1;overflow:auto;min-height:300px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-viewport{height:100%!important;width:100%!important;overflow-x:auto!important;overflow-y:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table{width:auto;min-width:100%;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td{padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:32px!important;height:auto!important;background:var(--grid-surface)!important;color:var(--grid-on-surface)!important;visibility:visible!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td.sticky-column,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:100!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr{height:auto!important;min-height:50px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr.pivot-row,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr.pivot-row{visibility:visible!important;display:table-row!important}.pivot-mode .pivot-table .collapsed-column-group{background-color:var(--grid-surface-container);border-left:3px solid var(--grid-primary)}.pivot-mode .pivot-table .collapsed-column-group:hover{background-color:var(--grid-surface-container-high)}.pivot-row.subtotal-row{background-color:var(--grid-surface-variant);font-weight:500}.pivot-row.subtotal-row.subtotal-bold{font-weight:500}.pivot-row.subtotal-row.subtotal-italic{font-style:italic}.pivot-row.subtotal-row.subtotal-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.grand-total-row{background-color:var(--grid-surface-container);font-weight:600}.pivot-row.grand-total-row.grand-total-bold{font-weight:800}.pivot-row.grand-total-row.grand-total-italic{font-style:italic}.pivot-row.grand-total-row.grand-total-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.first-visible-row{background-color:#6750a41a!important;position:relative}.pivot-row.first-visible-row:before{content:\"\\1f441\\fe0f First Visible\";position:absolute;top:-20px;left:0;background:var(--grid-primary);color:var(--grid-on-primary);padding:2px 6px;font-size:10px;border-radius:2px;z-index:1000}.header-wrap-text{white-space:pre-wrap;word-break:auto-phrase}.custom-collapse-header{background-color:var(--grid-surface-variant);padding:8px 20px;border-top-left-radius:12px;border-top-right-radius:12px;cursor:pointer;display:flex;width:fit-content;align-items:center;-webkit-user-select:none;user-select:none;min-width:200px;margin-bottom:10px;position:sticky;left:1px;z-index:116}.custom-collapse-header .collapse-arrow{display:inline-block;margin-right:8px;font-size:12px;color:var(--grid-on-surface-variant);transition:transform .2s ease;transform:rotate(0)}.custom-collapse-header .collapse-arrow.rotate-arrow{transform:rotate(270deg)}.custom-collapse-header .f-12{font-size:12px;color:var(--grid-on-surface)}.table-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .header-shell::-webkit-scrollbar{display:none}.table-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.table-mode .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.table-mode .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.table-mode .subtotal-row td:first-child{color:var(--grid-primary)}.table-mode .subtotal-row td.subtotal-cell{font-weight:500}.table-mode .subtotal-row td.subtotal-cell .subtotal-label{font-weight:600;color:var(--grid-primary)}.table-mode .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.table-mode .subtotal-row.subtotal-bold td{font-weight:600!important;font-style:normal!important}.table-mode .subtotal-row.subtotal-italic td{font-style:italic!important}.table-mode .subtotal-row.subtotal-italic td:first-child{font-weight:600!important}.table-mode .subtotal-row.subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.table-mode .subtotal-row.subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.table-mode .subtotal-row.subtotal-highlighted:hover,.table-mode .subtotal-row.subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row-shell{width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .subtotal-row-shell::-webkit-scrollbar{display:none}.board-mode-host{overflow:hidden;display:flex;flex-direction:column;height:var(--grid-height, 600px)}.board-mode-host .board-view-container{display:flex;flex-direction:column;flex:1;min-height:0}.board-mode-host .board-columns-wrapper{display:flex;flex-direction:row;flex:1;min-height:0;overflow-x:auto;overflow-y:hidden;gap:16px;padding:16px;align-items:stretch}.board-mode-host .board-column{flex:0 0 320px;display:flex;flex-direction:column;background:var(--grid-surface-container, #f3edf7);border-radius:12px;min-height:0;overflow:hidden}.board-mode-host .board-column .column-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;font-weight:600;border-bottom:1px solid var(--grid-outline, #79757f);flex-shrink:0}.board-mode-host .board-column .column-header .column-header-title{font-size:14px;color:var(--grid-on-surface, #1d1b20)}.board-mode-host .board-column .column-header .column-header-count{font-size:12px;color:var(--grid-on-surface-variant, #49454f);background:var(--grid-surface-variant, #e7e0ec);border-radius:10px;padding:2px 8px}.board-mode-host .board-column-body{flex:1;min-height:0;height:0}.board-mode-host .board-card-container{height:208px;padding:4px 8px;box-sizing:border-box}.board-mode-host .board-card{height:196px;overflow:hidden;cursor:pointer}.board-mode-host .board-card mat-card-title{font-size:13px}.board-mode-host .board-card mat-card-subtitle{font-size:12px}.board-mode-host .board-card-field{display:flex;flex-direction:column;margin-bottom:4px}.board-mode-host .board-field-label{font-size:10px;color:var(--grid-on-surface-variant, #49454f);font-weight:500;text-transform:uppercase;letter-spacing:.5px}.board-mode-host .board-ghost-card{margin:8px;padding:16px;background:var(--grid-surface, #fef7ff);border-radius:8px;animation:board-pulse 1.5s ease-in-out infinite}.board-mode-host .board-ghost-line{height:12px;background:var(--grid-surface-variant, #e7e0ec);border-radius:4px;margin-bottom:8px}.board-mode-host .board-ghost-line--short{width:60%}@keyframes board-pulse{0%,to{opacity:1}50%{opacity:.5}}\n"], dependencies: [{ kind: "component", type: DataCellComponent, selector: "data-cell", inputs: ["eruGridStore", "fieldSize", "columnDatatype", "columnName", "column", "value", "id", "frozenGrandTotalCell", "td", "drillable", "mode", "isEditable", "row"], outputs: ["tdChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i4$3.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4$3.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4$3.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i1$3.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: ResizeColumnDirective, selector: "[resizeColumn]", inputs: ["resizeColumn", "index", "columnConfig", "gridConfig"] }, { kind: "directive", type: ColumnDragDirective, selector: "[columnDraggable]", inputs: ["columnDraggable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
11245
11304
|
}
|
|
11246
11305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: EruGridComponent, decorators: [{
|
|
11247
11306
|
type: Component,
|
|
@@ -11255,9 +11314,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
11255
11314
|
MatTooltipModule,
|
|
11256
11315
|
MatIconModule,
|
|
11257
11316
|
MatCheckboxModule,
|
|
11317
|
+
MatCardModule,
|
|
11318
|
+
MatButtonModule,
|
|
11258
11319
|
ResizeColumnDirective,
|
|
11259
11320
|
ColumnDragDirective
|
|
11260
|
-
], template: "<!-- <div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\ncurrentPivotScrollIndex {{currentPivotScrollIndex()}} |\nfirstDataRowIndex {{firstDataRowIndex()}} |\nfirstTr {{firstTr}} |\nmaxDepth {{maxDepth()}}\n</div> -->\n<div class=\"incremental-row-container eru-grid\" #rowContainer\n [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode()\">\n <!-- Pivot Mode Template -->\n @if (gridStore.isPivotMode()) {\n <ng-container >\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%;\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <!-- Debug info for first visible row -->\n\n\n <div class=\"pivot-single-table\" style=\"height: 100%; width: 100%; overflow: hidden; display: flex; flex-direction: column;\">\n @if (freezeHeader()) {\n <div #headerScroller class=\"header-shell\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n @if(grandTotalPosition() === 'before' && freezeGrandTotal()) {\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n }\n </table>\n </div>\n }\n <!-- Virtual Scrolled Table Body -->\n <div>\n <cdk-virtual-scroll-viewport\n #vp\n [itemSize]=\"50\"\n class=\"viewport pivot-viewport\"\n [class.apply-cdk-width]=\"applyCdkWidth()\"\n (scrolledIndexChange)=\"onPivotScroll($event)\"\n (scroll)=\"onBodyScroll($event)\"\n style=\"overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\"\n >\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n @if (!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n }\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\n\n <tr *cdkVirtualFor=\"let pivotRow of gridStore.pivotDisplayData(); \n trackBy: trackByPivotRowFn; \n let i = index\"\n class=\"pivot-row\"\n [class.subtotal-row]=\"pivotRow._isSubtotal\"\n [class.grand-total-row]=\"pivotRow._isGrandTotal\"\n [class.subtotal-bold]=\"pivotRow._isSubtotal && subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"pivotRow._isSubtotal && subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"pivotRow._isSubtotal && subTotalStyle() === 'highlighted'\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n @if ((!pivotRow._isGrandTotal && freezeGrandTotal() ) || (!freezeGrandTotal() )) {\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n @if (!shouldSkipCell(i, column.name)) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [class.aggregation]=\"!!column.aggregationFunction\"\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n </div>\n </td>\n }\n }\n } @else {\n <td [style.height.px]=\"50\" [attr.colspan]=\"getLeafColumns().length\"> </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n\n </div>\n @if (freezeGrandTotal() && grandTotalPosition() === 'after') {\n <div #gtScroller class=\"header-shell gt-shell\"\n [class.adjust-bottom]=\"!applyCdkWidth()\"\n [class.adjust-bottom-vs]=\"adjustScrollWidth()\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n\n </table>\n </div>\n }\n\n\n </div>\n </div>\n </ng-container>\n } @else {\n\n <!-- Table Mode Template -->\n <!-- Outer virtual scroll viewport for groups -->\n\n <cdk-virtual-scroll-viewport\n #groupsViewport\n [itemSize]=\"200\"\n class=\"viewport groups-viewport\"\n (scrolledIndexChange)=\"onGroupsViewportScroll($event)\"\n >\n\n <div class=\"group-container\" *cdkVirtualFor=\"let group of groups(); trackBy: trackByGroupFn; let i = index\"\n >\n <!-- Combined sitcky header with group info and table -->\n <div style=\"\n background:var(--grid-surface);\n position: sticky;\n top: 0;\n z-index: 115;\n \">\n <div class=\"custom-collapse-header\"\n (click)=\"toggleGroupCollapse(group.id)\">\n <span class=\"collapse-arrow\" [ngClass]=\"{\n 'rotate-arrow': group.isExpanded,\n }\">\u25BC</span>\n <span class=\"f-12\">\n {{ group?.title || \"\" }}\n {{ group?.currentLoadedRows || 0 }} -\n {{ group?.totalRowCount || 0 }} rows...</span>\n </div>\n\n @if(freezeHeader() && group.isExpanded) {\n <div #headerScroller class=\"header-shell\"\n [attr.data-group-id]=\"'header-shell-' + group.id\"\n [style]=\"'--table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <table class=\"eru-grid-table\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n <!-- Grand Total row after sticky header (position: before) - only for first group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after sticky header (position: before) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n </table>\n </div>\n }\n </div>\n @if(group.isExpanded) {\n <ng-container>\n <cdk-virtual-scroll-viewport\n [attr.data-group-id]=\"group.id\"\n [itemSize]=\"30\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event, group)\"\n (scroll)=\"onTableBodyScroll($event)\"\n [style]=\"'--table-height: ' + getGroupContentHeight(group.id) + 'px; --table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n >\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n @if(!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n }\n <!-- Grand Total row after normal header (position: before) - only for first group -->\n @if(!freezeHeader() && enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after normal header (position: before) -->\n @if(!freezeHeader() && enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n <tbody>\n @if (columns(); as columnsList) {\n <!-- <tr *ngIf=\"groupItem.type === 'table-header' && groups().length > 1\" style=\"background:#fafafa\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n }\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr> -->\n <!-- @if(getRowsForGroup(group.id).length > 0 && group.isExpanded) { -->\n <!-- *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); \n trackBy: trackByRowFn; \n let i = index\" -->\n <!-- @for(row of getRowsForGroupSignal(group.id)(); track trackByRowFn($index, row); let i = $index) { -->\n <tr *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id || '')(); trackBy: trackByRowFn; let i = index\"\n class=\"row-item\"\n [attr.data-row-id]=\"i\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isRowSelected(row?.entity_id)\"\n (change)=\"toggleRowSelection($event, row)\"\n >\n </td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td #cell\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\"\n [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\"\n >\n <div class=\"cell-content\">\n <data-cell\n #datacell\n [td]=cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"row?.['entity_data']?.[column.name] || 'xx'\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [drillable]=\"column.enableDrilldown || false\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\"\n ></data-cell>\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n </tr>\n <!-- } -->\n <!-- } -->\n @if(group.isLoading && group.isExpanded) {\n @for(i of [].constructor(ghostRows()); let j = $index; track j) {\n <tr\n class=\"ghost-loading-row\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\"\n >\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n </tr>\n }\n }\n <!-- <tr\n *ngIf=\"getRowsForGroup(group.id).length === 0 && !group.isExpanded\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"groupSeperatorColSpan()\" class=\"separator-cell\"></td>\n </tr> -->\n <!-- Subtotal row at end of group (position: after) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'after' && hasSubtotalData(group)) {\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n }\n <!-- Grand Total row at end of group (position: after) - only for last group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'after' && hasGrandTotalData() && i === groups().length - 1) {\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n }\n }\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n }\n </div>\n</cdk-virtual-scroll-viewport>\n}\n</div>\n\n<!-- Pivot Table Header Template -->\n<ng-template #pivotTableHead>\n <thead>\n @if (hasNestedHeaders()) {\n <ng-container >\n @for (headerRow of getHeaderRows(); track headerRow; let rowIndex = $index) {\n <tr class=\"pivot-header pivot-header-container\"\n [class.pivot-header-level]=\"'level-' + rowIndex\">\n @for (header of headerRow; track trackByHeaderFn($index, header); let colIndex = $index) {\n <th\n [attr.colspan]=\"header.colspan\"\n [attr.rowspan]=\"header.rowspan\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable') && header.level === 0 && !isRowDimensionHeader(header)\"\n [columnConfig]=\"getFieldForPivotHeader(header)\"\n class=\"column-header pivot-column-header nested-header\"\n [class.row-dimension-header]=\"isRowDimensionHeader(header)\"\n [class.column-dimension-header]=\"!isRowDimensionHeader(header)\"\n [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\"\n [class.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n\n <data-cell\n [fieldSize]=\"header.field_size\"\n [columnDatatype]=\"header.dataType\"\n [columnName]=\"header.name\"\n [value]=\"header.label\"\n [column]=\"header\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"header.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + $index + '_' + header.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n <!-- <span class=\"header-label header-wrap-text\">{{header.label}}</span> -->\n <!-- <button *ngIf=\"!isRowDimensionHeader(header)\"\n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button> -->\n </div>\n </th>\n }\n </tr>\n }\n </ng-container>\n } @else {\n <!-- Simple header fallback -->\n <ng-container>\n <tr class=\"pivot-header\" [class.freeze-header-enabled]=\"freezeHeader()\">\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <th [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n class=\"column-header pivot-column-header\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 100 : 1\"\n style = \"min-height: 40px;height: auto;padding: 8px 6px;position: relative;left: 0px;z-index: 1\">\n {{column.label}}\n </th>\n }\n </tr>\n </ng-container>\n }\n\n</thead>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #pivotColGroup>\n <colgroup>\n @for (column of getLeafColumns(); track trackByColumnFn($index, column)) {\n <col [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n</colgroup>\n</ng-template>\n\n<ng-template #pivotGrandTotal>\n <tbody class=\"pivot-tbody\">\n @for (pivotRow of gridStore.pivotGrandTotalData(); track trackByPivotRowFn($index, pivotRow); let i = $index) {\n <tr\n class=\"pivot-row grand-total-row\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #tableColGroup>\n <colgroup>\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <col [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n</colgroup>\n</ng-template>\n\n\n<ng-template #tableHeader>\n\n <thead>\n @if(shouldShowRequiredToggleRow()) {\n <tr class=\"required-toggle-row\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllGroupsSelected()\"\n (change)=\"toggleAllGroups($event)\"\n >\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"required-toggle-cell\">\n @if(i === 0) {\n <span class=\"required-label\">required</span>\n }\n <mat-checkbox\n [checked]=\"column.required || false\"\n (change)=\"onColumnRequiredChange(column.name, $event.checked)\"\n [title]=\"'Make ' + column.label + ' required'\">\n </mat-checkbox>\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n </tr>\n }\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllGroupsSelected()\"\n (change)=\"toggleAllGroups($event)\"\n >\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th\n [style.width.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"gridStore.isFeatureEnabled('columnReorderable') ? i : null\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header table-column-header\">\n @if(gridStore.isFeatureEnabled('columnReorderable')) {\n <div class=\"column-drag-handle\"></div>\n }\n <!-- <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"column.label\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell> -->\n {{column.label}}\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n </tr>\n</thead>\n</ng-template>\n\n<!-- Table Subtotal Row Template -->\n<ng-template #tableSubtotal let-group=\"group\">\n <tr class=\"subtotal-row\"\n [class.subtotal-bold]=\"subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"subTotalStyle() === 'highlighted'\"\n [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"subtotal-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getSubtotalValue(group, column.name) === null) {\n <span class=\"subtotal-label\">{{subtotalLabel()}}</span>\n } @else {\n @if(getSubtotalValue(group, column.name) !== null) {\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getSubtotalValue(group, column.name)\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"false\"\n [id]=\"'subtotal_' + group.id + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>\n\n<!-- Table Grand Total Row Template -->\n<ng-template #tableGrandTotal>\n <tr class=\"grand-total-row\"\n [class.grand-total-bold]=\"grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"grand-total-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getGrandTotalValue(column.name) === null) {\n <span class=\"grand-total-label\">Grand Total</span>\n } @else {\n @if(getGrandTotalValue(column.name) !== null) {\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getGrandTotalValue(column.name)\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"false\"\n [id]=\"'grandtotal_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>", styles: ["@charset \"UTF-8\";:host{display:block!important;width:100%;height:100%;flex:1 1 0%;min-height:var(--grid-height, 400px);font-family:var(--grid-font-family);--grid-primary: #6750a4;--grid-on-primary: #ffffff;--grid-surface: #fef7ff;--grid-surface-variant: #e7e0ec;--grid-surface-container: #f3edf7;--grid-surface-container-high: #ede7f0;--grid-on-surface: #1d1b20;--grid-on-surface-variant: #49454f;--grid-outline: #79757f;--grid-outline-variant: #cac4d0;--grid-error: #ba1a1a;--grid-error-container: #ffdad6;--grid-font-family: \"Poppins\", \"Roboto\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--grid-font-size-body: 12px;--grid-font-size-caption: 12px !important;--grid-line-height-body: 1;--grid-aggregation-text-align: right;--grid-number-text-align: right;--grid-spacing-xxs: 2px;--grid-spacing-xs: 4px;--grid-spacing-sm: 8px;--grid-spacing-md: 16px;--grid-spacing-lg: 24px;--grid-border-radius: 4px;--grid-elevation-1: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 1px 3px 1px rgba(0, 0, 0, .15);--grid-elevation-2: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 2px 6px 2px rgba(0, 0, 0, .15)}.group-container{padding-bottom:8px}.incremental-row-container{width:100%;height:100%;min-height:400px;max-height:none;overflow:auto;position:relative;background-color:var(--grid-surface);border-radius:var(--grid-border-radius);font-family:var(--grid-font-family)}.viewport{height:100%;min-height:300px;overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface);scrollbar-gutter:stable}.viewport.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.groups-viewport{height:100%;min-height:300px}.table-viewport{background-color:var(--grid-surface);height:var(--table-height, auto);min-height:var(--table-min-height, 100px);overflow-x:auto;overflow-y:none}.pivot-viewport{min-height:var(--table-min-height, 300px);overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface)}.pivot-viewport .cdk-virtual-scroll-content-wrapper{width:auto;height:auto}.table-wrapper{min-width:100%;overflow-x:visible}.incremental-row-container .eru-grid-table,.eru-grid-table{width:100%!important;border-collapse:separate;border-spacing:0;table-layout:fixed!important;background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body);line-height:var(--grid-line-height-body)}.eru-grid-table th,.eru-grid-table td{text-align:left;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;background-color:var(--grid-surface);color:var(--grid-on-surface);min-width:0;max-width:100%!important;box-sizing:border-box;position:relative}.eru-grid-table th:hover,.eru-grid-table td:hover{background-color:var(--grid-surface-variant)}.eru-grid-table thead{background-color:var(--grid-surface-container);transform:translateZ(0);will-change:transform;backface-visibility:hidden}.eru-grid-table thead.freeze-header-enabled{position:sticky!important;top:0!important;z-index:100!important}.eru-grid-table thead th{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-weight:500;font-size:var(--grid-font-size-caption)}.checkbox-column{width:50px;min-width:50px;max-width:50px;text-align:center;background-color:var(--grid-surface-container)}.checkbox-column input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:var(--grid-primary);border-radius:var(--grid-border-radius)}.checkbox-column input[type=checkbox]:focus{outline:2px solid var(--grid-primary);outline-offset:2px}.action-column{width:40px;min-width:40px;max-width:40px;text-align:center;background-color:var(--grid-surface-container)}.action-column mat-icon{font-size:20px;width:20px;height:20px;line-height:20px;color:var(--grid-on-surface-variant);cursor:pointer}.action-column mat-icon:hover{color:var(--grid-primary)}.group-header{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-size:var(--grid-font-size-caption);font-weight:500;border-bottom:1px solid var(--grid-outline);cursor:pointer;transition:background-color .2s ease}.group-header:hover{background-color:var(--grid-surface-container-high)}.group-header .group-title{font-weight:600;color:var(--grid-primary)}.group-header .group-row-count{color:var(--grid-on-surface-variant);font-size:var(--grid-font-size-caption);margin-left:var(--grid-spacing-sm)}.row-item{border:1px solid var(--grid-outline);background-color:var(--grid-surface);transition:background-color .2s ease,box-shadow .2s ease}.row-item:hover{background-color:var(--grid-surface-variant);box-shadow:var(--grid-elevation-1)}.required-toggle-row{background-color:var(--grid-surface-container, #f3edf7);border-bottom:1px solid var(--grid-outline-variant, #cac4d0)}.required-toggle-row .required-toggle-cell{padding:4px 8px!important;text-align:center;vertical-align:middle;position:relative}.required-toggle-row .required-toggle-cell .required-label{position:absolute;top:2px;left:4px;font-size:10px;color:var(--grid-on-surface-variant, #49454f);font-weight:400;text-transform:lowercase}.required-toggle-row .required-toggle-cell mat-checkbox{display:flex;justify-content:center;align-items:center}.table-column-header{padding:12px 8px}.column-header{font-weight:500;text-align:center!important;font-size:var(--grid-font-size-caption, 12px);position:relative;-webkit-user-select:none;user-select:none;background-color:var(--grid-surface-container);color:var(--grid-on-surface)}.column-header:hover{background-color:var(--grid-surface-container-high)}.column-drag-handle{position:absolute;left:0;top:0;bottom:0;width:12px;cursor:grab;opacity:0;transition:opacity .2s ease,background-color .2s ease;z-index:2;display:flex;align-items:center;justify-content:center;border-right:1px solid transparent}.column-drag-handle:after{content:\"\\22ee\\22ee\";font-size:14px;color:var(--grid-on-surface-variant);transform:rotate(90deg)}.column-drag-handle:hover{background-color:var(--grid-surface-container-high);border-right-color:var(--grid-outline)}.column-header:hover .column-drag-handle{opacity:1}.column-drag-handle:active{cursor:grabbing}.dragging{opacity:1;background-color:var(--grid-surface-container);box-shadow:var(--grid-elevation-2)}.drag-over{background-color:var(--grid-surface-container);border-color:var(--grid-primary)}.data-cell{background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body)}.cell-content{align-items:center}.cell-content .mdc-text-field{padding:0px var(--grid-spacing-xxs)!important}.cell-display-text{align-items:center;padding:0px var(--grid-spacing-xs)}.ghost-loading-row{background-color:transparent}.ghost-cell-container{padding:var(--grid-spacing-sm)}.ghost-cell{height:20px;width:100%;background-color:var(--grid-surface-container);animation:pulse 1.5s ease-in-out infinite;border-radius:var(--grid-border-radius)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.column-resizer{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background-color:transparent;transition:background-color .2s ease}.column-resizer:hover{background-color:var(--grid-primary)}.group-separator{height:var(--grid-spacing-sm);background-color:var(--grid-surface-variant)}.group-separator .separator-cell{background-color:var(--grid-surface-variant);border:none;height:var(--grid-spacing-sm)}.error-state{background-color:var(--grid-error-container);color:var(--grid-error);border-color:var(--grid-error)}.error-message{background-color:var(--grid-error);color:#fff;padding:var(--grid-spacing-sm);border-radius:var(--grid-border-radius);font-size:var(--grid-font-size-caption)}.incremental-row-container .eru-grid-table tbody,.incremental-row-container .eru-grid-table{position:relative}.incremental-row-container .eru-grid-table.show-column-lines{border-right:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-top:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table:not(.show-column-lines){border:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table thead:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:calc(var(--grid-outline-width, 1px) * 2);background-color:var(--grid-outline, #e0e0e0);pointer-events:none;z-index:10}.incremental-row-container .eru-grid-table.show-column-lines thead th{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-column-lines tbody td{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines thead th{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines tbody td{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}@media(max-width:768px){.incremental-row-container{height:600px}.eru-grid-table th,.eru-grid-table td{font-size:var(--grid-font-size-caption)}.checkbox-column{width:40px;min-width:40px;max-width:40px}}@media(prefers-contrast:high){.eru-grid-table th,.eru-grid-table td{border-width:2px}.row-item:hover{border-width:2px;border-color:var(--grid-primary)}}@media(prefers-reduced-motion:reduce){.row-item,.column-drag-handle,.ghost-cell{transition:none;animation:none}}.pivot-table .nested-header{text-align:center;font-weight:600;background:var(--grid-surface-container)}.pivot-table .nested-header.row-dimension-header{background:var(--grid-surface-container);font-weight:600}.pivot-table .pivot-header-leafcols{padding:0;margin:0;height:0}.pivot-table .pivot-header-level.level-0 .nested-header{font-size:14px;padding:12px 8px}.pivot-table .pivot-header-level.level-1 .nested-header{font-size:13px;padding:10px 6px}.pivot-table .pivot-header-level.level-2 .nested-header{font-size:12px;padding:8px 4px}.pivot-table .nested-header:hover{background:var(--grid-surface-variant);color:var(--grid-primary);transition:all .2s ease}.pivot-table .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-table .pivot-cell-content{display:flex;justify-content:center;align-items:center;min-height:38px}.pivot-table .rowspan-cell{vertical-align:middle}.pivot-table .rowspan-cell .pivot-cell-content{height:100%}.pivot-mode .incremental-row-container{display:flex;flex-direction:column;height:auto;max-height:85vh;overflow:auto}.pivot-mode .h-shell{position:relative;width:calc(100% - var(--scrollbar-width, 17px))!important;top:0;z-index:1;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .h-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell{position:relative;bottom:50px;flex-shrink:0;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .gt-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell table{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.pivot-mode .gt-shell.adjust-bottom-vs{bottom:66px!important}.pivot-mode .gt-shell.adjust-bottom:not(.adjust-bottom-vs){bottom:calc(66px - var(--scrollbar-width, 17px))!important}.pivot-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .header-shell::-webkit-scrollbar{display:none}.pivot-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.pivot-mode .header-shell .eru-grid-table{margin-bottom:0;width:100%;table-layout:fixed}.pivot-mode .header-shell .eru-grid-table thead{background:var(--grid-surface-container)}.pivot-mode .header-shell .eru-grid-table thead th{background:var(--grid-surface-container);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .header-shell .eru-grid-table thead th.sticky-column{position:sticky;background:var(--grid-surface-container);z-index:111}.pivot-mode .header-shell .eru-grid-table tbody td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-container{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.pivot-mode .pivot-table{width:auto!important;min-width:100%!important;table-layout:fixed!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important}.pivot-mode .pivot-table td,.pivot-mode .pivot-table th{box-sizing:border-box!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-table{table-layout:fixed!important;width:100%!important}.pivot-mode .pivot-table *{max-width:var(--col-width)!important;box-sizing:border-box!important}.pivot-mode .pivot-table colgroup{width:100%!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex-basis:var(--col-width)!important;flex:0 0 var(--col-width)!important}.pivot-mode .pivot-table table{width:100%!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important}.pivot-mode .pivot-table[style*=--table-total-width]{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:0 0 var(--col-width)!important;flex-basis:var(--col-width)!important;flex-grow:0!important;flex-shrink:0!important;overflow:hidden!important}.pivot-mode .pivot-table tbody td,.pivot-mode .pivot-table thead th{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.pivot-mode .pivot-table .cell-content,.pivot-mode .pivot-table data-cell{width:100%!important;max-width:100%!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;display:block!important}.pivot-mode .pivot-table table{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-tbody tr.pivot-row{min-height:50px!important;height:50px!important}.pivot-mode .pivot-tbody tr.pivot-row:hover{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-tbody tr.pivot-row:nth-child(2n){background-color:#00000005}.pivot-mode .pivot-tbody tr.pivot-row td{min-height:50px!important;height:50px!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content{min-height:48px;display:flex;align-items:center;justify-content:center}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content data-cell{width:100%;min-height:46px;display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.pivot-mode .pivot-cell{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-mode .pivot-cell .cell-content{display:flex;justify-content:center;align-items:center;min-height:40px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.pivot-mode .pivot-table .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.pivot-mode .pivot-table .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .subtotal-row td:first-child{color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row td.aggregated-value{font-weight:500;color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.pivot-mode .pivot-table .subtotal-bold td{font-weight:600!important;font-style:normal!important}.pivot-mode .pivot-table .subtotal-bold td.aggregated-value{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td{font-style:italic!important}.pivot-mode .pivot-table .subtotal-italic td:first-child{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.pivot-mode .pivot-table .subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted td.aggregated-value{font-weight:500!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted:hover,.pivot-mode .pivot-table .subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-row{background-color:var(--grid-surface-container-high)!important;font-weight:700;font-size:var(--grid-font-size-body)}.pivot-mode .pivot-table .grand-total-row td{background-color:var(--grid-surface-container-high)!important;color:var(--grid-on-surface)}.pivot-mode .pivot-table .grand-total-row td:first-child{font-style:normal;font-weight:800;color:var(--grid-primary)}.pivot-mode .pivot-table .grand-total-row td.aggregated-value{font-weight:500;color:var(--grid-primary);font-family:Roboto Mono,monospace}.pivot-mode .pivot-table .grand-total-row:hover,.pivot-mode .pivot-table .grand-total-row:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-bold td{font-weight:700!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-bold td.aggregated-value{font-weight:700!important}.pivot-mode .pivot-table .grand-total-italic td,.pivot-mode .pivot-table .grand-total-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted{background-color:var(--grid-primary)!important;box-shadow:var(--grid-elevation-2)!important}.pivot-mode .pivot-table .grand-total-highlighted td{background-color:var(--grid-primary)!important;color:var(--grid-on-primary)!important;font-weight:500!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-highlighted td.aggregated-value{color:var(--grid-on-primary)!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted:hover,.pivot-mode .pivot-table .grand-total-highlighted:hover td{background-color:var(--grid-primary)!important}.pivot-mode .pivot-table .collapsible-header{position:relative}.pivot-mode .pivot-table .collapsible-header .header-content{display:flex;align-items:center;justify-content:space-between;gap:var(--grid-spacing-xs);padding:var(--grid-spacing-xs) var(--grid-spacing-sm)}.pivot-mode .pivot-table .collapsible-header .header-label{flex:1;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn{background:none;border:none;cursor:pointer;padding:var(--grid-spacing-xxs);margin:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:var(--grid-border-radius);color:var(--grid-on-surface-variant);transition:all .2s ease;font-size:12px;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:hover{background-color:var(--grid-surface-container);color:var(--grid-primary);transform:scale(1.1)}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:focus{outline:2px solid var(--grid-primary);outline-offset:1px}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn .collapse-icon{display:block;line-height:1;font-family:monospace;font-size:14px}.pivot-mode .pivot-table .collapsible-header.expanded .collapse-toggle-btn .collapse-icon{color:var(--grid-primary)}.pivot-mode .pivot-table .collapsible-header.collapsed{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .header-label{font-style:italic;color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .collapse-toggle-btn .collapse-icon{color:var(--grid-outline)}.pivot-mode .pivot-table .collapsible-header:hover{background-color:var(--grid-surface-container)}.pivot-mode .pivot-table .collapsible-header:hover .header-label{color:var(--grid-on-surface)}.pivot-mode .pivot-table .pivot-single-table{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden;min-height:var(--table-min-height)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container{flex-shrink:0;background:var(--grid-surface)!important;overflow-x:auto;overflow-y:hidden;min-height:100px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table{width:auto;min-width:100%;height:auto!important;min-height:100px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th{background:var(--grid-surface-container)!important;padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:40px!important;height:auto!important;position:relative;visibility:visible!important;color:var(--grid-on-surface)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:101!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container{flex:1;overflow:auto;min-height:300px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-viewport{height:100%!important;width:100%!important;overflow-x:auto!important;overflow-y:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table{width:auto;min-width:100%;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td{padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:32px!important;height:auto!important;background:var(--grid-surface)!important;color:var(--grid-on-surface)!important;visibility:visible!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td.sticky-column,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:100!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr{height:auto!important;min-height:50px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr.pivot-row,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr.pivot-row{visibility:visible!important;display:table-row!important}.pivot-mode .pivot-table .collapsed-column-group{background-color:var(--grid-surface-container);border-left:3px solid var(--grid-primary)}.pivot-mode .pivot-table .collapsed-column-group:hover{background-color:var(--grid-surface-container-high)}.pivot-row.subtotal-row{background-color:var(--grid-surface-variant);font-weight:500}.pivot-row.subtotal-row.subtotal-bold{font-weight:500}.pivot-row.subtotal-row.subtotal-italic{font-style:italic}.pivot-row.subtotal-row.subtotal-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.grand-total-row{background-color:var(--grid-surface-container);font-weight:600}.pivot-row.grand-total-row.grand-total-bold{font-weight:800}.pivot-row.grand-total-row.grand-total-italic{font-style:italic}.pivot-row.grand-total-row.grand-total-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.first-visible-row{background-color:#6750a41a!important;position:relative}.pivot-row.first-visible-row:before{content:\"\\1f441\\fe0f First Visible\";position:absolute;top:-20px;left:0;background:var(--grid-primary);color:var(--grid-on-primary);padding:2px 6px;font-size:10px;border-radius:2px;z-index:1000}.header-wrap-text{white-space:pre-wrap;word-break:auto-phrase}.custom-collapse-header{background-color:var(--grid-surface-variant);padding:8px 20px;border-top-left-radius:12px;border-top-right-radius:12px;cursor:pointer;display:flex;width:fit-content;align-items:center;-webkit-user-select:none;user-select:none;min-width:200px;margin-bottom:10px;position:sticky;left:1px;z-index:116}.custom-collapse-header .collapse-arrow{display:inline-block;margin-right:8px;font-size:12px;color:var(--grid-on-surface-variant);transition:transform .2s ease;transform:rotate(0)}.custom-collapse-header .collapse-arrow.rotate-arrow{transform:rotate(270deg)}.custom-collapse-header .f-12{font-size:12px;color:var(--grid-on-surface)}.table-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .header-shell::-webkit-scrollbar{display:none}.table-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.table-mode .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.table-mode .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.table-mode .subtotal-row td:first-child{color:var(--grid-primary)}.table-mode .subtotal-row td.subtotal-cell{font-weight:500}.table-mode .subtotal-row td.subtotal-cell .subtotal-label{font-weight:600;color:var(--grid-primary)}.table-mode .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.table-mode .subtotal-row.subtotal-bold td{font-weight:600!important;font-style:normal!important}.table-mode .subtotal-row.subtotal-italic td{font-style:italic!important}.table-mode .subtotal-row.subtotal-italic td:first-child{font-weight:600!important}.table-mode .subtotal-row.subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.table-mode .subtotal-row.subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.table-mode .subtotal-row.subtotal-highlighted:hover,.table-mode .subtotal-row.subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row-shell{width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .subtotal-row-shell::-webkit-scrollbar{display:none}\n"] }]
|
|
11321
|
+
], template: "<!-- <div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\ncurrentPivotScrollIndex {{currentPivotScrollIndex()}} |\nfirstDataRowIndex {{firstDataRowIndex()}} |\nfirstTr {{firstTr}} |\nmaxDepth {{maxDepth()}}\n</div> -->\n<div class=\"incremental-row-container eru-grid\" #rowContainer [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode() && !isBoardMode()\" [class.board-mode-host]=\"isBoardMode()\">\n <!-- Pivot Mode Template -->\n @if (gridStore.isPivotMode()) {\n <ng-container>\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%;\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <!-- Debug info for first visible row -->\n\n\n <div class=\"pivot-single-table\"\n style=\"height: 100%; width: 100%; overflow: hidden; display: flex; flex-direction: column;\">\n @if (freezeHeader()) {\n <div #headerScroller class=\"header-shell\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n @if(grandTotalPosition() === 'before' && freezeGrandTotal()) {\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n }\n </table>\n </div>\n }\n <!-- Virtual Scrolled Table Body -->\n <div>\n <cdk-virtual-scroll-viewport #vp [itemSize]=\"50\" class=\"viewport pivot-viewport\"\n [class.apply-cdk-width]=\"applyCdkWidth()\" (scrolledIndexChange)=\"onPivotScroll($event)\"\n (scroll)=\"onBodyScroll($event)\" style=\"overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n @if (!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n }\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\n\n <tr *cdkVirtualFor=\"let pivotRow of gridStore.pivotDisplayData(); \n trackBy: trackByPivotRowFn; \n let i = index\" class=\"pivot-row\" [class.subtotal-row]=\"pivotRow._isSubtotal\"\n [class.grand-total-row]=\"pivotRow._isGrandTotal\"\n [class.subtotal-bold]=\"pivotRow._isSubtotal && subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"pivotRow._isSubtotal && subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"pivotRow._isSubtotal && subTotalStyle() === 'highlighted'\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\" [attr.data-pivot-row]=\"i\">\n @if ((!pivotRow._isGrandTotal && freezeGrandTotal() ) || (!freezeGrandTotal() )) {\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.pivot-repeated-value]=\"isRepeatedDimensionValue(i, column.name)\"\n [class.pivot-group-start]=\"isPivotGroupStart(i, column.name)\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\" [style.height.px]=\"50\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell [class.aggregation]=\"!!column.aggregationFunction\" [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\" [value]=\"pivotRow[column.name]\"\n [column]=\"column\" [drillable]=\"column.enableDrilldown || false\" [mode]=\"mode()\"\n [isEditable]=\"isEditable()\" [id]=\"'pivot_' + i + '_' + column.name\" [eruGridStore]=\"gridStore\"\n [row]=\"pivotRow\">\n </data-cell>\n </div>\n </td>\n }\n } @else {\n <td [style.height.px]=\"50\" [attr.colspan]=\"getLeafColumns().length\"> </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n\n </div>\n @if (freezeGrandTotal() && grandTotalPosition() === 'after') {\n <div #gtScroller class=\"header-shell gt-shell\" [class.adjust-bottom]=\"!applyCdkWidth()\"\n [class.adjust-bottom-vs]=\"adjustScrollWidth()\">\n <table class=\"eru-grid-table pivot-table\"\n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n\n </table>\n </div>\n }\n\n\n </div>\n </div>\n </ng-container>\n } @else if (isBoardMode()) {\n <!-- Board Mode Template -->\n <div class=\"board-view-container\">\n <div class=\"board-columns-wrapper\">\n @for (group of groups(); track group.id) {\n <div class=\"board-column\">\n <div class=\"column-header\">\n <span class=\"column-header-title\">{{ group.title }}</span>\n <span class=\"column-header-count\">{{ group.currentLoadedRows || 0 }} of {{ group.totalRowCount || 0 }}</span>\n </div>\n <cdk-virtual-scroll-viewport [itemSize]=\"BOARD_CARD_ITEM_HEIGHT\" class=\"board-column-body\"\n (scrolledIndexChange)=\"onBoardScrolledIndexChange($event, group)\">\n <div *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); templateCacheSize: 0\"\n class=\"board-card-container\">\n <mat-card class=\"board-card\">\n <!-- <mat-card-header>\n <mat-card-title>#{{ row?.entity_id?.substring(0,8) }}</mat-card-title>\n <mat-card-subtitle>{{ row?.entity_data?.['name'] || row?.entity_id }}</mat-card-subtitle>\n </mat-card-header>\n --> <mat-card-content>\n @for (column of visibleBoardFields(); track column.name) {\n @if (row?.entity_data?.[column.name] !== undefined) {\n\n <div class=\"board-card-field\">\n <span class=\"board-field-label\">{{ column.label }}</span>\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\" [column]=\"column\" [value]=\"row?.entity_data?.[column.name]\"\n [id]=\"row?.entity_id + '_' + column.name\" [eruGridStore]=\"gridStore\" [mode]=\"'board'\" [row]=\"row\">\n </data-cell>\n </div>\n }\n }\n\n </mat-card-content>\n <mat-card-actions align=\"end\">\n <button mat-icon-button (click)=\"onActionClick($event, row)\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n </mat-card-actions>\n </mat-card>\n </div>\n </cdk-virtual-scroll-viewport>\n @if (group.isLoading) {\n <div class=\"board-ghost-card\">\n <div class=\"board-ghost-line\"></div>\n <div class=\"board-ghost-line board-ghost-line--short\"></div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n\n <!-- Table Mode Template -->\n <!-- Scrollable groups container \u2014 plain iteration avoids CDK fixed-height estimation errors -->\n <div #groupsScrollContainer class=\"groups-scroll-container\" (scroll)=\"onGroupsViewportScroll($event)\">\n\n @for (group of groups(); track trackByGroupFn($index, group); let i = $index) {\n <div class=\"group-container\" [attr.data-group-id]=\"group.id || ''\">\n <!-- Combined sitcky header with group info and table -->\n <div style=\"\n background:var(--grid-surface);\n position: sticky;\n top: 0;\n z-index: 115;\n \">\n <div class=\"custom-collapse-header\" (click)=\"toggleGroupCollapse(group.id)\">\n <span class=\"collapse-arrow\" [ngClass]=\"{\n 'rotate-arrow': group.isExpanded,\n }\">\u25BC</span>\n <span class=\"f-12\">\n {{ group?.title || \"\" }}\n {{ group?.currentLoadedRows || 0 }} -\n {{ group?.totalRowCount || 0 }} rows...</span>\n </div>\n\n @if(freezeHeader() && group.isExpanded) {\n <div #headerScroller class=\"header-shell\" [attr.data-group-id]=\"'header-shell-' + group.id\"\n [style]=\"'--table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <table class=\"eru-grid-table\" [class.freeze-header]=\"freezeHeader()\"\n [class.show-column-lines]=\"showColumnLines()\" [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n <!-- Grand Total row after sticky header (position: before) - only for first group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after sticky header (position: before) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n </table>\n </div>\n }\n </div>\n @if(group.isExpanded) {\n <ng-container>\n <cdk-virtual-scroll-viewport [attr.data-group-id]=\"group.id\" [itemSize]=\"30\" class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event, group)\" (scroll)=\"onTableBodyScroll($event)\"\n [style]=\"'--table-height: ' + getGroupContentHeight(group.id) + 'px; --table-min-height: ' + getGroupContentHeight(group.id) + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\"\n [class.show-column-lines]=\"showColumnLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n @if(!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n }\n <!-- Grand Total row after normal header (position: before) - only for first group -->\n @if(!freezeHeader() && enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' &&\n hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after normal header (position: before) -->\n @if(!freezeHeader() && enableColumnSubtotals() && subtotalPositionColumn() === 'before' &&\n hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n <tbody>\n @if (columns(); as columnsList) {\n <!-- <tr *ngIf=\"groupItem.type === 'table-header' && groups().length > 1\" style=\"background:#fafafa\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n }\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr> -->\n <!-- @if(getRowsForGroup(group.id).length > 0 && group.isExpanded) { -->\n <!-- *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); \n trackBy: trackByRowFn; \n let i = index\" -->\n <!-- @for(row of getRowsForGroupSignal(group.id)(); track trackByRowFn($index, row); let i = $index) { -->\n <tr\n *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id || '')(); trackBy: trackByRowFn; let i = index\"\n class=\"row-item\" [attr.data-row-id]=\"i\" [style.height.px]=\"30\" [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input type=\"checkbox\" [checked]=\"isRowSelected(row?.entity_id)\"\n (change)=\"toggleRowSelection($event, row)\">\n </td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\"\n style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td #cell [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\" [style.height.px]=\"30\" [style.minHeight.px]=\"30\" [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\" [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\">\n <div class=\"cell-content\">\n <data-cell #datacell [td]=cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\" [value]=\"row?.['entity_data']?.[column.name] || ''\" [column]=\"column\"\n [mode]=\"mode()\" [isEditable]=\"isEditable()\" [drillable]=\"column.enableDrilldown || false\"\n [id]=\"i + '_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"row\"></data-cell>\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\"\n style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n </tr>\n <!-- } -->\n <!-- } -->\n @if(group.isLoading && group.isExpanded) {\n @for(i of [].constructor(ghostRows()); let j = $index; track j) {\n <tr class=\"ghost-loading-row\" [style.height.px]=\"30\" [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n </tr>\n }\n }\n <!-- <tr\n *ngIf=\"getRowsForGroup(group.id).length === 0 && !group.isExpanded\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"groupSeperatorColSpan()\" class=\"separator-cell\"></td>\n </tr> -->\n <!-- Subtotal row at end of group (position: after) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'after' && hasSubtotalData(group)) {\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n }\n <!-- Grand Total row at end of group (position: after) - only for last group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'after' && hasGrandTotalData() && i ===\n groups().length - 1) {\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n }\n }\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n }\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Pivot Table Header Template -->\n<ng-template #pivotTableHead>\n <thead>\n @if (hasNestedHeaders()) {\n <ng-container>\n @for (headerRow of getHeaderRows(); track headerRow; let rowIndex = $index) {\n <tr class=\"pivot-header pivot-header-container\" [class.pivot-header-level]=\"'level-' + rowIndex\">\n @for (header of headerRow; track trackByHeaderFn($index, header); let colIndex = $index) {\n <th [attr.colspan]=\"header.colspan\" [attr.rowspan]=\"header.rowspan\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable') && header.level === 0 && !isRowDimensionHeader(header)\"\n [columnConfig]=\"getFieldForPivotHeader(header)\" class=\"column-header pivot-column-header nested-header\"\n [class.row-dimension-header]=\"isRowDimensionHeader(header)\"\n [class.column-dimension-header]=\"!isRowDimensionHeader(header)\" [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\" [class.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n\n <data-cell [fieldSize]=\"header.field_size\" [columnDatatype]=\"header.dataType\" [columnName]=\"header.name\"\n [value]=\"header.label\" [column]=\"header\" [frozenGrandTotalCell]=\"true\"\n [drillable]=\"header.enableDrilldown || false\" [mode]=\"mode()\" [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + $index + '_' + header.name\" [eruGridStore]=\"gridStore\" [row]=\"header\">\n </data-cell>\n <!-- <span class=\"header-label header-wrap-text\">{{header.label}}</span> -->\n <!-- <button *ngIf=\"!isRowDimensionHeader(header)\"\n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button> -->\n </div>\n </th>\n }\n </tr>\n }\n </ng-container>\n } @else {\n <!-- Simple header fallback -->\n <ng-container>\n <tr class=\"pivot-header\" [class.freeze-header-enabled]=\"freezeHeader()\">\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <th [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\" [columnConfig]=\"column\"\n class=\"column-header pivot-column-header\" [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px;height: auto;padding: 8px 6px\">\n {{column.label}}\n </th>\n }\n </tr>\n </ng-container>\n }\n\n </thead>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #pivotColGroup>\n <colgroup>\n @for (column of getLeafColumns(); track trackByColumnFn($index, column)) {\n <col\n [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n </colgroup>\n</ng-template>\n\n<ng-template #pivotGrandTotal>\n <tbody class=\"pivot-tbody\">\n @for (pivotRow of gridStore.pivotGrandTotalData(); track trackByPivotRowFn($index, pivotRow); let i = $index) {\n <tr class=\"pivot-row grand-total-row\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\" [attr.data-pivot-row]=\"i\">\n <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\" [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\" class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\" [style.height.px]=\"50\" [attr.xx]=\"i\">\n <div class=\"cell-content pivot-cell-content\">\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\" [column]=\"column\" [frozenGrandTotalCell]=\"true\"\n [drillable]=\"column.enableDrilldown || false\" [mode]=\"mode()\" [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"pivotRow\">\n </data-cell>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #tableColGroup>\n <colgroup>\n @if(gridStore.configuration().config.allowSelection) {\n <col style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n }\n @if(shouldShowActionColumn('before')) {\n <col style=\"width: 60px; min-width: 60px; max-width: 60px;\">\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <col\n [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n @if(shouldShowActionColumn('after')) {\n <col style=\"width: 60px; min-width: 60px; max-width: 60px;\">\n }\n </colgroup>\n</ng-template>\n\n\n<ng-template #tableHeader>\n\n <thead>\n @if(shouldShowRequiredToggleRow()) {\n <tr class=\"required-toggle-row\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input type=\"checkbox\" [checked]=\"isAllGroupsSelected()\" (change)=\"toggleAllGroups($event)\">\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"required-toggle-cell\">\n @if(i === 0) {\n <span class=\"required-label\">required</span>\n }\n <mat-checkbox [checked]=\"column.required || false\"\n (change)=\"onColumnRequiredChange(column.name, $event.checked)\" [title]=\"'Make ' + column.label + ' required'\">\n </mat-checkbox>\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n </tr>\n }\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input type=\"checkbox\" [checked]=\"isAllGroupsSelected()\" (change)=\"toggleAllGroups($event)\">\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th [style.width.px]=\"column.field_size\" [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\" [index]=\"i\"\n [columnDraggable]=\"gridStore.isFeatureEnabled('columnReorderable') ? i : null\"\n [style.minWidth.px]=\"column.field_size\" class=\"column-header table-column-header\">\n @if(gridStore.isFeatureEnabled('columnReorderable')) {\n <div class=\"column-drag-handle\"></div>\n }\n <!-- <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"column.label\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell> -->\n {{column.label}}\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\"\n style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n </tr>\n </thead>\n</ng-template>\n\n<!-- Table Subtotal Row Template -->\n<ng-template #tableSubtotal let-group=\"group\">\n <tr class=\"subtotal-row\" [class.subtotal-bold]=\"subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"subTotalStyle() === 'highlighted'\" [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"subtotal-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getSubtotalValue(group, column.name) === null) {\n <span class=\"subtotal-label\">{{subtotalLabel()}}</span>\n } @else {\n @if(getSubtotalValue(group, column.name) !== null) {\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\"\n [value]=\"getSubtotalValue(group, column.name)\" [column]=\"column\" [mode]=\"mode()\" [isEditable]=\"false\"\n [id]=\"'subtotal_' + group.id + '_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"group.subtotal\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>\n\n<!-- Table Grand Total Row Template -->\n<ng-template #tableGrandTotal>\n <tr class=\"grand-total-row\" [class.grand-total-bold]=\"grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"grandTotalStyle() === 'highlighted'\" [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\" [style.minWidth.px]=\"column.field_size\" class=\"grand-total-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getGrandTotalValue(column.name) === null) {\n <span class=\"grand-total-label\">Grand Total</span>\n } @else {\n @if(getGrandTotalValue(column.name) !== null) {\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\" [columnName]=\"column.name\"\n [value]=\"getGrandTotalValue(column.name)\" [column]=\"column\" [mode]=\"mode()\" [isEditable]=\"false\"\n [id]=\"'grandtotal_' + column.name\" [eruGridStore]=\"gridStore\" [row]=\"gridStore.rowGrandTotal()\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>", styles: ["@charset \"UTF-8\";:host{display:block!important;width:100%;height:100%;flex:1 1 0%;min-height:var(--grid-height, 300px);font-family:var(--grid-font-family);--grid-primary: #6750a4;--grid-on-primary: #ffffff;--grid-surface: #fef7ff;--grid-surface-variant: #e7e0ec;--grid-surface-container: #f3edf7;--grid-surface-container-high: #ede7f0;--grid-on-surface: #1d1b20;--grid-on-surface-variant: #49454f;--grid-outline: #79757f;--grid-outline-variant: #cac4d0;--grid-error: #ba1a1a;--grid-error-container: #ffdad6;--grid-font-family: \"Poppins\", \"Roboto\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;--grid-font-size-body: 12px;--grid-font-size-caption: 12px !important;--grid-line-height-body: 1;--grid-aggregation-text-align: right;--grid-number-text-align: right;--grid-spacing-xxs: 2px;--grid-spacing-xs: 4px;--grid-spacing-sm: 8px;--grid-spacing-md: 16px;--grid-spacing-lg: 24px;--grid-border-radius: 4px;--grid-elevation-1: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 1px 3px 1px rgba(0, 0, 0, .15);--grid-elevation-2: 0px 1px 2px 0px rgba(0, 0, 0, .3), 0px 2px 6px 2px rgba(0, 0, 0, .15)}.group-container{padding-bottom:8px}.incremental-row-container{width:100%;height:100%;min-height:var(--grid-height, 300px);max-height:none;overflow:auto;position:relative;background-color:var(--grid-surface);border-radius:var(--grid-border-radius);font-family:var(--grid-font-family)}.viewport{height:100%;min-height:300px;overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface);scrollbar-gutter:stable}.viewport.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.groups-viewport{height:100%;min-height:300px}.groups-scroll-container{height:var(--grid-height, 600px);overflow-y:auto;overflow-x:hidden}.table-viewport{background-color:var(--grid-surface);height:var(--table-height, auto);min-height:var(--table-min-height, 100px);overflow-x:auto;overflow-y:auto}.pivot-viewport{min-height:var(--table-min-height, 300px);overflow-x:auto;overflow-y:auto;background-color:var(--grid-surface)}.pivot-viewport .cdk-virtual-scroll-content-wrapper{width:auto;height:auto}.table-wrapper{min-width:100%;overflow-x:visible}.incremental-row-container .eru-grid-table,.eru-grid-table{width:100%!important;border-collapse:separate;border-spacing:0;table-layout:fixed!important;background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body);line-height:var(--grid-line-height-body)}.eru-grid-table th,.eru-grid-table td{text-align:left;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;background-color:var(--grid-surface);color:var(--grid-on-surface);min-width:0;max-width:100%!important;box-sizing:border-box;position:relative}.eru-grid-table th:hover,.eru-grid-table td:hover{background-color:var(--grid-surface-variant)}.eru-grid-table thead{background-color:var(--grid-surface-container);transform:translateZ(0);will-change:transform;backface-visibility:hidden}.eru-grid-table thead.freeze-header-enabled{position:sticky!important;top:0!important;z-index:100!important}.eru-grid-table thead th{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-weight:500;font-size:var(--grid-font-size-caption)}.checkbox-column{width:50px;min-width:50px;max-width:50px;text-align:center;background-color:var(--grid-surface-container)}.checkbox-column input[type=checkbox]{width:16px;height:16px;cursor:pointer;accent-color:var(--grid-primary);border-radius:var(--grid-border-radius)}.checkbox-column input[type=checkbox]:focus{outline:2px solid var(--grid-primary);outline-offset:2px}.action-column{width:40px;min-width:40px;max-width:40px;text-align:center;background-color:var(--grid-surface-container)}.action-column mat-icon{font-size:20px;width:20px;height:20px;line-height:20px;color:var(--grid-on-surface-variant);cursor:pointer}.action-column mat-icon:hover{color:var(--grid-primary)}.group-header{background-color:var(--grid-surface-container);color:var(--grid-on-surface);font-size:var(--grid-font-size-caption);font-weight:500;border-bottom:1px solid var(--grid-outline);cursor:pointer;transition:background-color .2s ease}.group-header:hover{background-color:var(--grid-surface-container-high)}.group-header .group-title{font-weight:600;color:var(--grid-primary)}.group-header .group-row-count{color:var(--grid-on-surface-variant);font-size:var(--grid-font-size-caption);margin-left:var(--grid-spacing-sm)}.row-item{border:1px solid var(--grid-outline);background-color:var(--grid-surface);transition:background-color .2s ease,box-shadow .2s ease}.row-item:hover{background-color:var(--grid-surface-variant);box-shadow:var(--grid-elevation-1)}.required-toggle-row{background-color:var(--grid-surface-container, #f3edf7);border-bottom:1px solid var(--grid-outline-variant, #cac4d0)}.required-toggle-row .required-toggle-cell{padding:4px 8px!important;text-align:center;vertical-align:middle;position:relative}.required-toggle-row .required-toggle-cell .required-label{position:absolute;top:2px;left:4px;font-size:10px;color:var(--grid-on-surface-variant, #49454f);font-weight:400;text-transform:lowercase}.required-toggle-row .required-toggle-cell mat-checkbox{display:flex;justify-content:center;align-items:center}.table-column-header{padding:12px 8px}.column-header{font-weight:500;text-align:center!important;font-size:var(--grid-font-size-caption, 12px);position:relative;-webkit-user-select:none;user-select:none;background-color:var(--grid-surface-container);color:var(--grid-on-surface)}.column-header:hover{background-color:var(--grid-surface-container-high)}.column-drag-handle{position:absolute;left:0;top:0;bottom:0;width:12px;cursor:grab;opacity:0;transition:opacity .2s ease,background-color .2s ease;z-index:2;display:flex;align-items:center;justify-content:center;border-right:1px solid transparent}.column-drag-handle:after{content:\"\\22ee\\22ee\";font-size:14px;color:var(--grid-on-surface-variant);transform:rotate(90deg)}.column-drag-handle:hover{background-color:var(--grid-surface-container-high);border-right-color:var(--grid-outline)}.column-header:hover .column-drag-handle{opacity:1}.column-drag-handle:active{cursor:grabbing}.dragging{opacity:1;background-color:var(--grid-surface-container);box-shadow:var(--grid-elevation-2)}.drag-over{background-color:var(--grid-surface-container);border-color:var(--grid-primary)}.data-cell{background-color:var(--grid-surface);color:var(--grid-on-surface);font-size:var(--grid-font-size-body)}.cell-content{align-items:center}.cell-content .mdc-text-field{padding:0px var(--grid-spacing-xxs)!important}.cell-display-text{align-items:center;padding:0px var(--grid-spacing-xs)}.ghost-loading-row{background-color:transparent}.ghost-cell-container{padding:var(--grid-spacing-sm)}.ghost-cell{height:20px;width:100%;background-color:var(--grid-surface-container);animation:pulse 1.5s ease-in-out infinite;border-radius:var(--grid-border-radius)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.column-resizer{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background-color:transparent;transition:background-color .2s ease}.column-resizer:hover{background-color:var(--grid-primary)}.group-separator{height:var(--grid-spacing-sm);background-color:var(--grid-surface-variant)}.group-separator .separator-cell{background-color:var(--grid-surface-variant);border:none;height:var(--grid-spacing-sm)}.error-state{background-color:var(--grid-error-container);color:var(--grid-error);border-color:var(--grid-error)}.error-message{background-color:var(--grid-error);color:#fff;padding:var(--grid-spacing-sm);border-radius:var(--grid-border-radius);font-size:var(--grid-font-size-caption)}.incremental-row-container .eru-grid-table tbody,.incremental-row-container .eru-grid-table{position:relative}.incremental-row-container .eru-grid-table.show-column-lines{border-right:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-top:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-column-lines:not(.freeze-header){border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table:not(.show-column-lines){border:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table thead:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:calc(var(--grid-outline-width, 1px) * 2);background-color:var(--grid-outline, #e0e0e0);pointer-events:none;z-index:10}.incremental-row-container .eru-grid-table.show-column-lines thead th,.incremental-row-container .eru-grid-table.show-column-lines tbody td{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines thead th{border-left:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important;border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.incremental-row-container .eru-grid-table.show-row-lines tbody td{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}@media(max-width:768px){.incremental-row-container{height:600px}.eru-grid-table th,.eru-grid-table td{font-size:var(--grid-font-size-caption)}.checkbox-column{width:40px;min-width:40px;max-width:40px}}@media(prefers-contrast:high){.eru-grid-table th,.eru-grid-table td{border-width:2px}.row-item:hover{border-width:2px;border-color:var(--grid-primary)}}@media(prefers-reduced-motion:reduce){.row-item,.column-drag-handle,.ghost-cell{transition:none;animation:none}}.pivot-table .nested-header{text-align:center;font-weight:600;background:var(--grid-surface-container)}.pivot-table .nested-header.row-dimension-header{background:var(--grid-surface-container);font-weight:600}.pivot-table .pivot-header-leafcols{padding:0;margin:0;height:0}.pivot-table .pivot-header-level.level-0 .nested-header{font-size:14px;padding:12px 8px}.pivot-table .pivot-header-level.level-1 .nested-header{font-size:13px;padding:10px 6px}.pivot-table .pivot-header-level.level-2 .nested-header{font-size:12px;padding:8px 4px}.pivot-table .nested-header:hover{background:var(--grid-surface-variant);color:var(--grid-primary);transition:all .2s ease}.pivot-table .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-table .pivot-cell-content{display:flex;justify-content:center;align-items:center;min-height:38px}.pivot-table .pivot-repeated-value .cell-content,.pivot-table .pivot-repeated-value .pivot-cell-content{visibility:hidden}.pivot-table .pivot-group-start.row-dimension-cell{border-top:1px solid var(--grid-outline, #79757f)}.pivot-mode .incremental-row-container{display:flex;flex-direction:column;height:auto;max-height:85vh;overflow:auto}.pivot-mode .h-shell{position:relative;width:calc(100% - var(--scrollbar-width, 17px))!important;top:0;z-index:1;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .h-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell{position:relative;bottom:50px;flex-shrink:0;overflow-x:hidden;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .gt-shell::-webkit-scrollbar{display:none}.pivot-mode .gt-shell table{border-bottom:var(--grid-outline-width, 1px) solid var(--grid-outline, #e0e0e0)!important}.pivot-mode .gt-shell.adjust-bottom-vs{bottom:66px!important}.pivot-mode .gt-shell.adjust-bottom:not(.adjust-bottom-vs){bottom:calc(66px - var(--scrollbar-width, 17px))!important}.pivot-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.pivot-mode .header-shell::-webkit-scrollbar{display:none}.pivot-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.pivot-mode .header-shell .eru-grid-table{margin-bottom:0;width:100%;table-layout:fixed}.pivot-mode .header-shell .eru-grid-table thead{background:var(--grid-surface-container)}.pivot-mode .header-shell .eru-grid-table thead th{background:var(--grid-surface-container);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .header-shell .eru-grid-table thead th.sticky-column{position:sticky;background:var(--grid-surface-container);z-index:111}.pivot-mode .header-shell .eru-grid-table tbody td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-container{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.pivot-mode .pivot-table{width:auto!important;min-width:100%!important;table-layout:fixed!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important}.pivot-mode .pivot-table td,.pivot-mode .pivot-table th{box-sizing:border-box!important;flex:none!important;flex-shrink:0!important;flex-grow:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-table{table-layout:fixed!important;width:100%!important}.pivot-mode .pivot-table *{max-width:var(--col-width)!important;box-sizing:border-box!important}.pivot-mode .pivot-table colgroup{width:100%!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex-basis:var(--col-width)!important;flex:0 0 var(--col-width)!important}.pivot-mode .pivot-table table{width:100%!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important}.pivot-mode .pivot-table[style*=--table-total-width]{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important}.pivot-mode .pivot-table colgroup col{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;flex:0 0 var(--col-width)!important;flex-basis:var(--col-width)!important;flex-grow:0!important;flex-shrink:0!important;overflow:hidden!important}.pivot-mode .pivot-table tbody td,.pivot-mode .pivot-table thead th{width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.pivot-mode .pivot-table .cell-content,.pivot-mode .pivot-table data-cell{width:100%!important;max-width:100%!important;overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important;display:block!important}.pivot-mode .pivot-table table{width:var(--table-total-width)!important;min-width:var(--table-total-width)!important;max-width:var(--table-total-width)!important;table-layout:fixed!important;border-collapse:collapse!important;border-spacing:0!important;word-wrap:break-word!important;word-break:break-all!important}.pivot-mode .pivot-tbody tr.pivot-row{min-height:50px!important;height:50px!important}.pivot-mode .pivot-tbody tr.pivot-row:hover{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-tbody tr.pivot-row:nth-child(2n){background-color:#00000005}.pivot-mode .pivot-tbody tr.pivot-row td{min-height:50px!important;height:50px!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content{min-height:48px;display:flex;align-items:center;justify-content:center}.pivot-mode .pivot-tbody tr.pivot-row td .cell-content data-cell{width:100%;min-height:46px;display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.pivot-mode .pivot-cell{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:var(--col-width)!important;min-width:var(--col-width)!important;max-width:var(--col-width)!important}.pivot-mode .pivot-cell.aggregated-value{font-weight:500;font-family:Roboto Mono,monospace}.pivot-mode .pivot-cell .cell-content{display:flex;justify-content:center;align-items:center;min-height:40px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.pivot-mode .pivot-table .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.pivot-mode .pivot-table .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .subtotal-row td:first-child{color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row td.aggregated-value{font-weight:500;color:var(--grid-primary)}.pivot-mode .pivot-table .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.pivot-mode .pivot-table .subtotal-bold td{font-weight:600!important;font-style:normal!important}.pivot-mode .pivot-table .subtotal-bold td.aggregated-value{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td{font-style:italic!important}.pivot-mode .pivot-table .subtotal-italic td:first-child{font-weight:600!important}.pivot-mode .pivot-table .subtotal-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.pivot-mode .pivot-table .subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted td.aggregated-value{font-weight:500!important;color:var(--grid-primary)!important}.pivot-mode .pivot-table .subtotal-highlighted:hover,.pivot-mode .pivot-table .subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-row{background-color:var(--grid-surface-container-high)!important;font-weight:700;font-size:var(--grid-font-size-body)}.pivot-mode .pivot-table .grand-total-row td{background-color:var(--grid-surface-container-high)!important;color:var(--grid-on-surface)}.pivot-mode .pivot-table .grand-total-row td:first-child{font-style:normal;font-weight:800;color:var(--grid-primary)}.pivot-mode .pivot-table .grand-total-row td.aggregated-value{font-weight:500;color:var(--grid-primary);font-family:Roboto Mono,monospace}.pivot-mode .pivot-table .grand-total-row:hover,.pivot-mode .pivot-table .grand-total-row:hover td{background-color:var(--grid-surface-container-high)!important}.pivot-mode .pivot-table .grand-total-bold td{font-weight:700!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-bold td.aggregated-value{font-weight:700!important}.pivot-mode .pivot-table .grand-total-italic td,.pivot-mode .pivot-table .grand-total-italic td.aggregated-value{font-style:italic!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted{background-color:var(--grid-primary)!important;box-shadow:var(--grid-elevation-2)!important}.pivot-mode .pivot-table .grand-total-highlighted td{background-color:var(--grid-primary)!important;color:var(--grid-on-primary)!important;font-weight:500!important;font-style:normal!important}.pivot-mode .pivot-table .grand-total-highlighted td.aggregated-value{color:var(--grid-on-primary)!important;font-weight:500!important}.pivot-mode .pivot-table .grand-total-highlighted:hover,.pivot-mode .pivot-table .grand-total-highlighted:hover td{background-color:var(--grid-primary)!important}.pivot-mode .pivot-table .collapsible-header{position:relative}.pivot-mode .pivot-table .collapsible-header .header-content{display:flex;align-items:center;justify-content:space-between;gap:var(--grid-spacing-xs);padding:var(--grid-spacing-xs) var(--grid-spacing-sm)}.pivot-mode .pivot-table .collapsible-header .header-label{flex:1;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn{background:none;border:none;cursor:pointer;padding:var(--grid-spacing-xxs);margin:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:var(--grid-border-radius);color:var(--grid-on-surface-variant);transition:all .2s ease;font-size:12px;font-weight:600}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:hover{background-color:var(--grid-surface-container);color:var(--grid-primary);transform:scale(1.1)}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn:focus{outline:2px solid var(--grid-primary);outline-offset:1px}.pivot-mode .pivot-table .collapsible-header .collapse-toggle-btn .collapse-icon{display:block;line-height:1;font-family:monospace;font-size:14px}.pivot-mode .pivot-table .collapsible-header.expanded .collapse-toggle-btn .collapse-icon{color:var(--grid-primary)}.pivot-mode .pivot-table .collapsible-header.collapsed{background-color:var(--grid-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .header-label{font-style:italic;color:var(--grid-on-surface-variant)}.pivot-mode .pivot-table .collapsible-header.collapsed .collapse-toggle-btn .collapse-icon{color:var(--grid-outline)}.pivot-mode .pivot-table .collapsible-header:hover{background-color:var(--grid-surface-container)}.pivot-mode .pivot-table .collapsible-header:hover .header-label{color:var(--grid-on-surface)}.pivot-mode .pivot-table .pivot-single-table{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden;min-height:var(--table-min-height)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container{flex-shrink:0;background:var(--grid-surface)!important;overflow-x:auto;overflow-y:hidden;min-height:100px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table{width:auto;min-width:100%;height:auto!important;min-height:100px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th{background:var(--grid-surface-container)!important;padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:40px!important;height:auto!important;position:relative;visibility:visible!important;color:var(--grid-on-surface)!important}.pivot-mode .pivot-table .pivot-single-table .pivot-header-container .pivot-table th.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:101!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container{flex:1;overflow:auto;min-height:300px!important;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-viewport{height:100%!important;width:100%!important;overflow-x:auto!important;overflow-y:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table{width:auto;min-width:100%;height:auto!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td{padding:8px 6px!important;white-space:nowrap;min-width:50px;min-height:32px!important;height:auto!important;background:var(--grid-surface)!important;color:var(--grid-on-surface)!important;visibility:visible!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table td.sticky-column,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table td.sticky-column{position:sticky!important;background:var(--grid-surface-container)!important;border-right:2px solid var(--grid-primary)!important;box-shadow:2px 0 4px #0000001a;z-index:100!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr{height:auto!important;min-height:50px!important}.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-table tbody tr.pivot-row,.pivot-mode .pivot-table .pivot-single-table .pivot-data-container .pivot-data-table tbody tr.pivot-row{visibility:visible!important;display:table-row!important}.pivot-mode .pivot-table .collapsed-column-group{background-color:var(--grid-surface-container);border-left:3px solid var(--grid-primary)}.pivot-mode .pivot-table .collapsed-column-group:hover{background-color:var(--grid-surface-container-high)}.pivot-row.subtotal-row{background-color:var(--grid-surface-variant);font-weight:500}.pivot-row.subtotal-row.subtotal-bold{font-weight:500}.pivot-row.subtotal-row.subtotal-italic{font-style:italic}.pivot-row.subtotal-row.subtotal-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.grand-total-row{background-color:var(--grid-surface-container);font-weight:600}.pivot-row.grand-total-row.grand-total-bold{font-weight:800}.pivot-row.grand-total-row.grand-total-italic{font-style:italic}.pivot-row.grand-total-row.grand-total-highlighted{background-color:var(--grid-primary);color:var(--grid-on-primary)}.pivot-row.first-visible-row{background-color:#6750a41a!important;position:relative}.pivot-row.first-visible-row:before{content:\"\\1f441\\fe0f First Visible\";position:absolute;top:-20px;left:0;background:var(--grid-primary);color:var(--grid-on-primary);padding:2px 6px;font-size:10px;border-radius:2px;z-index:1000}.header-wrap-text{white-space:pre-wrap;word-break:auto-phrase}.custom-collapse-header{background-color:var(--grid-surface-variant);padding:8px 20px;border-top-left-radius:12px;border-top-right-radius:12px;cursor:pointer;display:flex;width:fit-content;align-items:center;-webkit-user-select:none;user-select:none;min-width:200px;margin-bottom:10px;position:sticky;left:1px;z-index:116}.custom-collapse-header .collapse-arrow{display:inline-block;margin-right:8px;font-size:12px;color:var(--grid-on-surface-variant);transition:transform .2s ease;transform:rotate(0)}.custom-collapse-header .collapse-arrow.rotate-arrow{transform:rotate(270deg)}.custom-collapse-header .f-12{font-size:12px;color:var(--grid-on-surface)}.table-mode .header-shell{flex-shrink:0;width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .header-shell::-webkit-scrollbar{display:none}.table-mode .header-shell.apply-cdk-width{width:calc(var(--table-total-width) + 10px)!important}.table-mode .subtotal-row{background-color:var(--grid-surface-container)!important;font-weight:600}.table-mode .subtotal-row td{background-color:var(--grid-surface-container);color:var(--grid-on-surface-variant)}.table-mode .subtotal-row td:first-child{color:var(--grid-primary)}.table-mode .subtotal-row td.subtotal-cell{font-weight:500}.table-mode .subtotal-row td.subtotal-cell .subtotal-label{font-weight:600;color:var(--grid-primary)}.table-mode .subtotal-row:hover{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row:hover td{background-color:var(--grid-surface-container-high)}.table-mode .subtotal-row.subtotal-bold td{font-weight:600!important;font-style:normal!important}.table-mode .subtotal-row.subtotal-italic td{font-style:italic!important}.table-mode .subtotal-row.subtotal-italic td:first-child{font-weight:600!important}.table-mode .subtotal-row.subtotal-highlighted{background-color:var(--grid-surface-variant)!important}.table-mode .subtotal-row.subtotal-highlighted td{background-color:var(--grid-surface-variant)!important;font-weight:700!important;font-style:normal!important;color:var(--grid-primary)!important}.table-mode .subtotal-row.subtotal-highlighted:hover,.table-mode .subtotal-row.subtotal-highlighted:hover td{background-color:var(--grid-surface-container-high)!important}.table-mode .subtotal-row-shell{width:100%;box-sizing:border-box;padding-right:var(--scrollbar-width, 17px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.table-mode .subtotal-row-shell::-webkit-scrollbar{display:none}.board-mode-host{overflow:hidden;display:flex;flex-direction:column;height:var(--grid-height, 600px)}.board-mode-host .board-view-container{display:flex;flex-direction:column;flex:1;min-height:0}.board-mode-host .board-columns-wrapper{display:flex;flex-direction:row;flex:1;min-height:0;overflow-x:auto;overflow-y:hidden;gap:16px;padding:16px;align-items:stretch}.board-mode-host .board-column{flex:0 0 320px;display:flex;flex-direction:column;background:var(--grid-surface-container, #f3edf7);border-radius:12px;min-height:0;overflow:hidden}.board-mode-host .board-column .column-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;font-weight:600;border-bottom:1px solid var(--grid-outline, #79757f);flex-shrink:0}.board-mode-host .board-column .column-header .column-header-title{font-size:14px;color:var(--grid-on-surface, #1d1b20)}.board-mode-host .board-column .column-header .column-header-count{font-size:12px;color:var(--grid-on-surface-variant, #49454f);background:var(--grid-surface-variant, #e7e0ec);border-radius:10px;padding:2px 8px}.board-mode-host .board-column-body{flex:1;min-height:0;height:0}.board-mode-host .board-card-container{height:208px;padding:4px 8px;box-sizing:border-box}.board-mode-host .board-card{height:196px;overflow:hidden;cursor:pointer}.board-mode-host .board-card mat-card-title{font-size:13px}.board-mode-host .board-card mat-card-subtitle{font-size:12px}.board-mode-host .board-card-field{display:flex;flex-direction:column;margin-bottom:4px}.board-mode-host .board-field-label{font-size:10px;color:var(--grid-on-surface-variant, #49454f);font-weight:500;text-transform:uppercase;letter-spacing:.5px}.board-mode-host .board-ghost-card{margin:8px;padding:16px;background:var(--grid-surface, #fef7ff);border-radius:8px;animation:board-pulse 1.5s ease-in-out infinite}.board-mode-host .board-ghost-line{height:12px;background:var(--grid-surface-variant, #e7e0ec);border-radius:4px;margin-bottom:8px}.board-mode-host .board-ghost-line--short{width:60%}@keyframes board-pulse{0%,to{opacity:1}50%{opacity:.5}}\n"] }]
|
|
11261
11322
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { allViewports: [{
|
|
11262
11323
|
type: ViewChildren,
|
|
11263
11324
|
args: [CdkVirtualScrollViewport]
|
|
@@ -11281,6 +11342,112 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
11281
11342
|
}], groupsViewport: [{
|
|
11282
11343
|
type: ViewChild,
|
|
11283
11344
|
args: ['groupsViewport']
|
|
11345
|
+
}], groupsScrollContainerEl: [{
|
|
11346
|
+
type: ViewChild,
|
|
11347
|
+
args: ['groupsScrollContainer']
|
|
11348
|
+
}] } });
|
|
11349
|
+
|
|
11350
|
+
/** Height of each card item (card + bottom padding) — must match CSS .card-container height */
|
|
11351
|
+
const BOARD_CARD_ITEM_HEIGHT = 208;
|
|
11352
|
+
class BoardViewComponent {
|
|
11353
|
+
gridStore = inject(EruGridStore);
|
|
11354
|
+
/** Pixel height of each card item, used by cdk-virtual-scroll-viewport [itemSize] */
|
|
11355
|
+
cardItemHeight = BOARD_CARD_ITEM_HEIGHT;
|
|
11356
|
+
set gridConfig(config) {
|
|
11357
|
+
if (config) {
|
|
11358
|
+
this.gridStore.setConfiguration(config);
|
|
11359
|
+
}
|
|
11360
|
+
}
|
|
11361
|
+
groups = this.gridStore.groups;
|
|
11362
|
+
columns = this.gridStore.columns;
|
|
11363
|
+
// Show up to 3 visible fields to keep card height predictable for CDK virtual scroll
|
|
11364
|
+
visibleFields = computed(() => {
|
|
11365
|
+
return this.columns()
|
|
11366
|
+
.filter((col) => col.field_size > 0)
|
|
11367
|
+
.slice(0, 3);
|
|
11368
|
+
}, ...(ngDevMode ? [{ debugName: "visibleFields" }] : []));
|
|
11369
|
+
set_table_group(data) {
|
|
11370
|
+
this.gridStore.setGroups(data);
|
|
11371
|
+
// Small delay to allow the store to register groups before triggering loads
|
|
11372
|
+
setTimeout(() => { this.loadMoreAll(); }, 50);
|
|
11373
|
+
}
|
|
11374
|
+
setRowGrandTotal(grandTotal) {
|
|
11375
|
+
this.gridStore.setRowGrandTotal(grandTotal);
|
|
11376
|
+
}
|
|
11377
|
+
ngOnInit() { }
|
|
11378
|
+
ngAfterViewInit() { }
|
|
11379
|
+
// Cache computed signals per group to avoid re-creating them on every render cycle
|
|
11380
|
+
groupRowsSignals = new Map();
|
|
11381
|
+
getRowsForGroupSignal(groupId) {
|
|
11382
|
+
if (!this.groupRowsSignals.has(groupId)) {
|
|
11383
|
+
this.groupRowsSignals.set(groupId, computed(() => {
|
|
11384
|
+
return this.gridStore.getRowsForGroup(groupId);
|
|
11385
|
+
}));
|
|
11386
|
+
}
|
|
11387
|
+
return this.groupRowsSignals.get(groupId);
|
|
11388
|
+
}
|
|
11389
|
+
trackByRowFn(index, row) {
|
|
11390
|
+
return row?.entity_id || `row-${index}`;
|
|
11391
|
+
}
|
|
11392
|
+
/**
|
|
11393
|
+
* CDK virtual scroll pagination trigger.
|
|
11394
|
+
* Fired whenever the first visible item index changes.
|
|
11395
|
+
* Loads the next page when the user scrolls within `threshold` items of the end.
|
|
11396
|
+
*/
|
|
11397
|
+
onScrolledIndexChange(firstVisibleIndex, group) {
|
|
11398
|
+
const rows = this.getRowsForGroupSignal(group.id)();
|
|
11399
|
+
const totalLoaded = rows.length;
|
|
11400
|
+
const threshold = 5;
|
|
11401
|
+
if (totalLoaded > 0
|
|
11402
|
+
&& firstVisibleIndex + threshold >= totalLoaded - 1
|
|
11403
|
+
&& group.hasMoreRows
|
|
11404
|
+
&& !group.isLoading) {
|
|
11405
|
+
this.requestRowsForGroup(group);
|
|
11406
|
+
}
|
|
11407
|
+
}
|
|
11408
|
+
onBoardScroll(_event) {
|
|
11409
|
+
// Horizontal scroll handler — no action needed
|
|
11410
|
+
}
|
|
11411
|
+
// Trigger initial load for all groups
|
|
11412
|
+
loadMoreAll() {
|
|
11413
|
+
this.groups().forEach((group) => {
|
|
11414
|
+
if (group.hasMoreRows && !group.isLoading) {
|
|
11415
|
+
this.requestRowsForGroup(group);
|
|
11416
|
+
}
|
|
11417
|
+
});
|
|
11418
|
+
}
|
|
11419
|
+
// Enqueue a data request for the next page of a group
|
|
11420
|
+
requestRowsForGroup(group) {
|
|
11421
|
+
const request = {
|
|
11422
|
+
groupId: group.id,
|
|
11423
|
+
groupKey: group.key,
|
|
11424
|
+
page: group.currentPage || 0,
|
|
11425
|
+
pageSize: 20,
|
|
11426
|
+
timestamp: Date.now(),
|
|
11427
|
+
groupTitle: group.title
|
|
11428
|
+
};
|
|
11429
|
+
this.gridStore.addToRequestQueue(request);
|
|
11430
|
+
this.gridStore.startGroupLoading(group.id);
|
|
11431
|
+
}
|
|
11432
|
+
addRowsForGroup(groupId, rows, hasMore) {
|
|
11433
|
+
this.gridStore.addRowsForGroup(groupId, rows, hasMore);
|
|
11434
|
+
}
|
|
11435
|
+
onCardClick(_row) { }
|
|
11436
|
+
onActionClick(event, row) {
|
|
11437
|
+
event.stopPropagation();
|
|
11438
|
+
this.gridStore.setActionClick({
|
|
11439
|
+
rowId: row?.entity_id,
|
|
11440
|
+
rowData: row
|
|
11441
|
+
});
|
|
11442
|
+
}
|
|
11443
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: BoardViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11444
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: BoardViewComponent, isStandalone: true, selector: "board-view", inputs: { gridConfig: "gridConfig" }, providers: [EruGridStore, ...MATERIAL_PROVIDERS], ngImport: i0, template: "<div class=\"board-view-container\">\n <div class=\"board-columns-wrapper\" (scroll)=\"onBoardScroll($event)\">\n\n @for (group of groups(); track group.id) {\n <div class=\"board-column\">\n\n <!-- Column Header -->\n <div class=\"column-header\">\n <div class=\"column-title\">\n <span class=\"title-text\">{{ group.title || 'Untitled' }}</span>\n <span class=\"row-count\">{{ group.totalRowCount }} items</span>\n </div>\n <div class=\"column-actions\">\n <button mat-icon-button (click)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- CDK Virtual Scroll Viewport \u2014 renders only visible cards for performance -->\n <cdk-virtual-scroll-viewport [itemSize]=\"cardItemHeight\" class=\"column-body\"\n (scrolledIndexChange)=\"onScrolledIndexChange($event, group)\">\n\n <div *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)();\n trackBy: trackByRowFn;\n templateCacheSize: 0\" class=\"card-container\">\n\n <mat-card class=\"board-card\" (click)=\"onCardClick(row)\">\n\n <mat-card-header>\n <div mat-card-avatar class=\"card-avatar\">\n <mat-icon>assignment</mat-icon>\n </div>\n <mat-card-title class=\"card-id\">\n #{{ row?.entity_id?.substring(0, 8) || 'N/A' }}\n </mat-card-title>\n <mat-card-subtitle class=\"card-subtitle\">\n {{ row?.entity_data?.['name'] || row?.['title'] || row?.entity_id || 'No Title' }}\n </mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card-fields-container\">\n @for (column of visibleFields(); track column.name) {\n @if (row?.['entity_data']?.[column.name] !== undefined &&\n row?.['entity_data']?.[column.name] !== null) {\n <div class=\"card-field\">\n <span class=\"field-label\">{{ column.label }}</span>\n <div class=\"field-value\">\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\" [value]=\"row?.['entity_data']?.[column.name]\"\n [column]=\"column\" [mode]=\"'board'\" [isEditable]=\"false\"\n [id]=\"'board_' + group.id + '_' + $index + '_' + column.name\"\n [eruGridStore]=\"gridStore\" [row]=\"row\">\n </data-cell>\n </div>\n </div>\n }\n }\n </div>\n </mat-card-content>\n\n <mat-card-actions align=\"end\">\n <button mat-icon-button (click)=\"onActionClick($event, row)\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n </mat-card-actions>\n\n </mat-card>\n </div>\n\n </cdk-virtual-scroll-viewport>\n\n <!-- Loading Skeletons \u2014 displayed below the viewport during page fetch -->\n @if (group.isLoading) {\n <div class=\"loading-cards\">\n @for (i of [1,2,3]; track i) {\n <div class=\"ghost-card-skeleton\">\n <div class=\"skeleton-avatar\"></div>\n <div class=\"skeleton-lines\">\n <div class=\"skeleton-line skeleton-line-short\"></div>\n <div class=\"skeleton-line skeleton-line-long\"></div>\n <div class=\"skeleton-line skeleton-line-medium\"></div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n }\n\n </div>\n</div>", styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0;background-color:var(--grid-bg, #f4f7f9)}.board-view-container{display:flex;flex-direction:column;flex:1;min-height:0}.board-columns-wrapper{display:flex;flex-direction:row;flex:1;min-height:0;overflow-x:auto;overflow-y:hidden;padding:16px;gap:16px;align-items:stretch}.board-columns-wrapper::-webkit-scrollbar{height:8px}.board-columns-wrapper::-webkit-scrollbar-track{background:transparent}.board-columns-wrapper::-webkit-scrollbar-thumb{background:#0000001f;border-radius:4px}.board-columns-wrapper::-webkit-scrollbar-thumb:hover{background:#00000038}.board-column{flex:0 0 320px;display:flex;flex-direction:column;min-height:0;background:var(--grid-surface, #ebf0f4);border-radius:12px;border:1px solid rgba(0,0,0,.05);box-shadow:0 2px 4px #00000008}.column-header{flex:0 0 auto;padding:12px 16px;display:flex;justify-content:space-between;align-items:center;background:#fff9;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border-bottom:1px solid rgba(0,0,0,.06);border-radius:12px 12px 0 0}.column-header .column-title{display:flex;flex-direction:column;gap:2px}.column-header .column-title .title-text{font-weight:700;font-size:13px;color:#1a1a1a;text-transform:uppercase;letter-spacing:.6px}.column-header .column-title .row-count{font-size:11px;color:#888}.column-header .column-actions{opacity:.6}.column-header .column-actions:hover{opacity:1}cdk-virtual-scroll-viewport.column-body{flex:1;min-height:0}cdk-virtual-scroll-viewport.column-body::-webkit-scrollbar{width:5px}cdk-virtual-scroll-viewport.column-body::-webkit-scrollbar-track{background:transparent}cdk-virtual-scroll-viewport.column-body::-webkit-scrollbar-thumb{background:#0000001f;border-radius:3px}.card-container{height:208px;box-sizing:border-box;padding:8px 8px 0}.board-card{height:200px;overflow:hidden;border-radius:8px!important;border:1px solid rgba(0,0,0,.06)!important;box-shadow:0 1px 4px #0000000f!important;transition:transform .15s ease,box-shadow .15s ease;cursor:pointer;background:#fff!important;display:flex;flex-direction:column}.board-card:hover{transform:translateY(-1px);box-shadow:0 4px 12px #0000001a!important}.board-card .mat-mdc-card-header{flex:0 0 auto;padding:10px 12px 4px}.board-card .card-avatar{background:#eef2f7;color:#5b8dee;display:flex;justify-content:center;align-items:center;border-radius:6px;width:32px;height:32px}.board-card .card-avatar mat-icon{font-size:18px;width:18px;height:18px}.board-card .card-id{font-family:Roboto Mono,monospace,sans-serif;font-size:11px!important;color:#aaa!important;font-weight:500}.board-card .card-subtitle{font-size:12px!important;font-weight:500;color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.board-card .mat-mdc-card-content{flex:1;overflow:hidden;padding:0 12px 4px!important}.board-card .mat-mdc-card-actions{flex:0 0 auto;padding:0 8px 4px!important;min-height:28px!important}.card-fields-container{display:flex;flex-direction:column;gap:4px}.card-field{display:flex;flex-direction:column;gap:1px}.card-field .field-label{font-size:9px;color:#bbb;text-transform:uppercase;font-weight:600;letter-spacing:.4px}.card-field .field-value{font-size:12px;color:#444;line-height:1.4;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.loading-cards{flex:0 0 auto;padding:4px 8px;border-top:1px solid rgba(0,0,0,.04)}.ghost-card-skeleton{background:#fff;border-radius:8px;margin-bottom:6px;border:1px solid rgba(0,0,0,.05);padding:10px;display:flex;gap:10px;overflow:hidden;position:relative}.ghost-card-skeleton:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,#fff0,#ffffffb3,#fff0);animation:shimmer 1.4s infinite}.ghost-card-skeleton .skeleton-avatar{flex:0 0 28px;height:28px;border-radius:6px;background:#eef2f7}.ghost-card-skeleton .skeleton-lines{flex:1;display:flex;flex-direction:column;gap:5px;padding-top:2px}.ghost-card-skeleton .skeleton-line{height:9px;border-radius:4px;background:#eef2f7}.ghost-card-skeleton .skeleton-line-short{width:40%}.ghost-card-skeleton .skeleton-line-long{width:90%}.ghost-card-skeleton .skeleton-line-medium{width:65%}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i1$3.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i1$3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1$3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1$3.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i1$3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i4$3.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4$3.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4$3.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: DataCellComponent, selector: "data-cell", inputs: ["eruGridStore", "fieldSize", "columnDatatype", "columnName", "column", "value", "id", "frozenGrandTotalCell", "td", "drillable", "mode", "isEditable", "row"], outputs: ["tdChange"] }] });
|
|
11445
|
+
}
|
|
11446
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: BoardViewComponent, decorators: [{
|
|
11447
|
+
type: Component,
|
|
11448
|
+
args: [{ selector: 'board-view', standalone: true, imports: [CommonModule, MatCardModule, MatIconModule, MatButtonModule, ScrollingModule, DataCellComponent], providers: [EruGridStore, ...MATERIAL_PROVIDERS], template: "<div class=\"board-view-container\">\n <div class=\"board-columns-wrapper\" (scroll)=\"onBoardScroll($event)\">\n\n @for (group of groups(); track group.id) {\n <div class=\"board-column\">\n\n <!-- Column Header -->\n <div class=\"column-header\">\n <div class=\"column-title\">\n <span class=\"title-text\">{{ group.title || 'Untitled' }}</span>\n <span class=\"row-count\">{{ group.totalRowCount }} items</span>\n </div>\n <div class=\"column-actions\">\n <button mat-icon-button (click)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- CDK Virtual Scroll Viewport \u2014 renders only visible cards for performance -->\n <cdk-virtual-scroll-viewport [itemSize]=\"cardItemHeight\" class=\"column-body\"\n (scrolledIndexChange)=\"onScrolledIndexChange($event, group)\">\n\n <div *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)();\n trackBy: trackByRowFn;\n templateCacheSize: 0\" class=\"card-container\">\n\n <mat-card class=\"board-card\" (click)=\"onCardClick(row)\">\n\n <mat-card-header>\n <div mat-card-avatar class=\"card-avatar\">\n <mat-icon>assignment</mat-icon>\n </div>\n <mat-card-title class=\"card-id\">\n #{{ row?.entity_id?.substring(0, 8) || 'N/A' }}\n </mat-card-title>\n <mat-card-subtitle class=\"card-subtitle\">\n {{ row?.entity_data?.['name'] || row?.['title'] || row?.entity_id || 'No Title' }}\n </mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card-fields-container\">\n @for (column of visibleFields(); track column.name) {\n @if (row?.['entity_data']?.[column.name] !== undefined &&\n row?.['entity_data']?.[column.name] !== null) {\n <div class=\"card-field\">\n <span class=\"field-label\">{{ column.label }}</span>\n <div class=\"field-value\">\n <data-cell [fieldSize]=\"column.field_size\" [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\" [value]=\"row?.['entity_data']?.[column.name]\"\n [column]=\"column\" [mode]=\"'board'\" [isEditable]=\"false\"\n [id]=\"'board_' + group.id + '_' + $index + '_' + column.name\"\n [eruGridStore]=\"gridStore\" [row]=\"row\">\n </data-cell>\n </div>\n </div>\n }\n }\n </div>\n </mat-card-content>\n\n <mat-card-actions align=\"end\">\n <button mat-icon-button (click)=\"onActionClick($event, row)\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n </mat-card-actions>\n\n </mat-card>\n </div>\n\n </cdk-virtual-scroll-viewport>\n\n <!-- Loading Skeletons \u2014 displayed below the viewport during page fetch -->\n @if (group.isLoading) {\n <div class=\"loading-cards\">\n @for (i of [1,2,3]; track i) {\n <div class=\"ghost-card-skeleton\">\n <div class=\"skeleton-avatar\"></div>\n <div class=\"skeleton-lines\">\n <div class=\"skeleton-line skeleton-line-short\"></div>\n <div class=\"skeleton-line skeleton-line-long\"></div>\n <div class=\"skeleton-line skeleton-line-medium\"></div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n }\n\n </div>\n</div>", styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0;background-color:var(--grid-bg, #f4f7f9)}.board-view-container{display:flex;flex-direction:column;flex:1;min-height:0}.board-columns-wrapper{display:flex;flex-direction:row;flex:1;min-height:0;overflow-x:auto;overflow-y:hidden;padding:16px;gap:16px;align-items:stretch}.board-columns-wrapper::-webkit-scrollbar{height:8px}.board-columns-wrapper::-webkit-scrollbar-track{background:transparent}.board-columns-wrapper::-webkit-scrollbar-thumb{background:#0000001f;border-radius:4px}.board-columns-wrapper::-webkit-scrollbar-thumb:hover{background:#00000038}.board-column{flex:0 0 320px;display:flex;flex-direction:column;min-height:0;background:var(--grid-surface, #ebf0f4);border-radius:12px;border:1px solid rgba(0,0,0,.05);box-shadow:0 2px 4px #00000008}.column-header{flex:0 0 auto;padding:12px 16px;display:flex;justify-content:space-between;align-items:center;background:#fff9;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border-bottom:1px solid rgba(0,0,0,.06);border-radius:12px 12px 0 0}.column-header .column-title{display:flex;flex-direction:column;gap:2px}.column-header .column-title .title-text{font-weight:700;font-size:13px;color:#1a1a1a;text-transform:uppercase;letter-spacing:.6px}.column-header .column-title .row-count{font-size:11px;color:#888}.column-header .column-actions{opacity:.6}.column-header .column-actions:hover{opacity:1}cdk-virtual-scroll-viewport.column-body{flex:1;min-height:0}cdk-virtual-scroll-viewport.column-body::-webkit-scrollbar{width:5px}cdk-virtual-scroll-viewport.column-body::-webkit-scrollbar-track{background:transparent}cdk-virtual-scroll-viewport.column-body::-webkit-scrollbar-thumb{background:#0000001f;border-radius:3px}.card-container{height:208px;box-sizing:border-box;padding:8px 8px 0}.board-card{height:200px;overflow:hidden;border-radius:8px!important;border:1px solid rgba(0,0,0,.06)!important;box-shadow:0 1px 4px #0000000f!important;transition:transform .15s ease,box-shadow .15s ease;cursor:pointer;background:#fff!important;display:flex;flex-direction:column}.board-card:hover{transform:translateY(-1px);box-shadow:0 4px 12px #0000001a!important}.board-card .mat-mdc-card-header{flex:0 0 auto;padding:10px 12px 4px}.board-card .card-avatar{background:#eef2f7;color:#5b8dee;display:flex;justify-content:center;align-items:center;border-radius:6px;width:32px;height:32px}.board-card .card-avatar mat-icon{font-size:18px;width:18px;height:18px}.board-card .card-id{font-family:Roboto Mono,monospace,sans-serif;font-size:11px!important;color:#aaa!important;font-weight:500}.board-card .card-subtitle{font-size:12px!important;font-weight:500;color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.board-card .mat-mdc-card-content{flex:1;overflow:hidden;padding:0 12px 4px!important}.board-card .mat-mdc-card-actions{flex:0 0 auto;padding:0 8px 4px!important;min-height:28px!important}.card-fields-container{display:flex;flex-direction:column;gap:4px}.card-field{display:flex;flex-direction:column;gap:1px}.card-field .field-label{font-size:9px;color:#bbb;text-transform:uppercase;font-weight:600;letter-spacing:.4px}.card-field .field-value{font-size:12px;color:#444;line-height:1.4;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.loading-cards{flex:0 0 auto;padding:4px 8px;border-top:1px solid rgba(0,0,0,.04)}.ghost-card-skeleton{background:#fff;border-radius:8px;margin-bottom:6px;border:1px solid rgba(0,0,0,.05);padding:10px;display:flex;gap:10px;overflow:hidden;position:relative}.ghost-card-skeleton:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,#fff0,#ffffffb3,#fff0);animation:shimmer 1.4s infinite}.ghost-card-skeleton .skeleton-avatar{flex:0 0 28px;height:28px;border-radius:6px;background:#eef2f7}.ghost-card-skeleton .skeleton-lines{flex:1;display:flex;flex-direction:column;gap:5px;padding-top:2px}.ghost-card-skeleton .skeleton-line{height:9px;border-radius:4px;background:#eef2f7}.ghost-card-skeleton .skeleton-line-short{width:40%}.ghost-card-skeleton .skeleton-line-long{width:90%}.ghost-card-skeleton .skeleton-line-medium{width:65%}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}\n"] }]
|
|
11449
|
+
}], propDecorators: { gridConfig: [{
|
|
11450
|
+
type: Input
|
|
11284
11451
|
}] } });
|
|
11285
11452
|
|
|
11286
11453
|
class ThemeToggleComponent {
|
|
@@ -11336,7 +11503,7 @@ class ThemeToggleComponent {
|
|
|
11336
11503
|
</button>
|
|
11337
11504
|
}
|
|
11338
11505
|
</mat-menu>
|
|
11339
|
-
`, isInline: true, styles: [".theme-toggle-button{color:var(--grid-on-surface)}.theme-toggle-button:hover{background-color:var(--grid-surface-variant)}.active{background-color:var(--grid-primary-light);color:var(--grid-primary-color)}.check-icon{margin-left:auto;color:var(--grid-primary-color)}mat-menu-item{display:flex;align-items:center;gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type:
|
|
11506
|
+
`, isInline: true, styles: [".theme-toggle-button{color:var(--grid-on-surface)}.theme-toggle-button:hover{background-color:var(--grid-surface-variant)}.active{background-color:var(--grid-primary-light);color:var(--grid-primary-color)}.check-icon{margin-left:auto;color:var(--grid-primary-color)}mat-menu-item{display:flex;align-items:center;gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
11340
11507
|
}
|
|
11341
11508
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ThemeToggleComponent, decorators: [{
|
|
11342
11509
|
type: Component,
|
|
@@ -11371,33 +11538,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
11371
11538
|
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".theme-toggle-button{color:var(--grid-on-surface)}.theme-toggle-button:hover{background-color:var(--grid-surface-variant)}.active{background-color:var(--grid-primary-light);color:var(--grid-primary-color)}.check-icon{margin-left:auto;color:var(--grid-primary-color)}mat-menu-item{display:flex;align-items:center;gap:8px}\n"] }]
|
|
11372
11539
|
}] });
|
|
11373
11540
|
|
|
11374
|
-
class HelloWorldComponent {
|
|
11375
|
-
constructor() { }
|
|
11376
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: HelloWorldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11377
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.2", type: HelloWorldComponent, isStandalone: true, selector: "eru-hello-world", ngImport: i0, template: `
|
|
11378
|
-
<div class="hello-world-container">
|
|
11379
|
-
<h2 class="hello-world-title">Hello World!</h2>
|
|
11380
|
-
<p class="hello-world-message">Welcome to the Eru Grid Library</p>
|
|
11381
|
-
</div>
|
|
11382
|
-
`, isInline: true, styles: [".hello-world-container{padding:20px;text-align:center;background-color:var(--grid-surface, #f5f5f5);border-radius:8px;margin:10px 0;box-shadow:0 2px 4px #0000001a}.hello-world-title{color:var(--grid-primary-color, #1976d2);margin:0 0 10px;font-size:24px;font-weight:600}.hello-world-message{color:var(--grid-on-surface, #333);margin:0;font-size:16px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
11383
|
-
}
|
|
11384
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: HelloWorldComponent, decorators: [{
|
|
11385
|
-
type: Component,
|
|
11386
|
-
args: [{ selector: 'eru-hello-world', standalone: true, imports: [], template: `
|
|
11387
|
-
<div class="hello-world-container">
|
|
11388
|
-
<h2 class="hello-world-title">Hello World!</h2>
|
|
11389
|
-
<p class="hello-world-message">Welcome to the Eru Grid Library</p>
|
|
11390
|
-
</div>
|
|
11391
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".hello-world-container{padding:20px;text-align:center;background-color:var(--grid-surface, #f5f5f5);border-radius:8px;margin:10px 0;box-shadow:0 2px 4px #0000001a}.hello-world-title{color:var(--grid-primary-color, #1976d2);margin:0 0 10px;font-size:24px;font-weight:600}.hello-world-message{color:var(--grid-on-surface, #333);margin:0;font-size:16px}\n"] }]
|
|
11392
|
-
}], ctorParameters: () => [] });
|
|
11393
|
-
|
|
11394
11541
|
/*
|
|
11395
11542
|
* Public API Surface of eru-grid
|
|
11396
11543
|
*/
|
|
11544
|
+
// Core
|
|
11397
11545
|
|
|
11398
11546
|
/**
|
|
11399
11547
|
* Generated bundle index. Do not edit.
|
|
11400
11548
|
*/
|
|
11401
11549
|
|
|
11402
|
-
export { CheckboxComponent, ColumnConstraintsService, CurrencyComponent, CustomVirtualScrollStrategy, DateComponent, EmailComponent, EruGridComponent, EruGridService, EruGridStore,
|
|
11550
|
+
export { AttachmentComponent, BOARD_CARD_ITEM_HEIGHT, BoardViewComponent, CheckboxComponent, ColumnConstraintsService, CurrencyComponent, CustomVirtualScrollStrategy, DateComponent, DatetimeComponent, DurationComponent, EmailComponent, EruGridComponent, EruGridService, EruGridStore, LocationComponent, MATERIAL_MODULES, MATERIAL_PROVIDERS, NumberComponent, PeopleComponent, PhoneComponent, PriorityComponent, ProgressComponent, RatingComponent, SelectComponent, StatusComponent, TagComponent, TextareaComponent, TextboxComponent, ThemeService, ThemeToggleComponent, WebsiteComponent };
|
|
11403
11551
|
//# sourceMappingURL=eru-grid.mjs.map
|