@angular-bootstrap/ngbootstrap 2.0.2 → 2.1.0
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/CHANGELOG.md +26 -0
- package/README.md +25 -2
- package/RELEASE_NOTES.md +19 -10
- package/fesm2022/angular-bootstrap-ngbootstrap.mjs +1501 -251
- package/fesm2022/angular-bootstrap-ngbootstrap.mjs.map +1 -1
- package/package.json +6 -10
- package/types/angular-bootstrap-ngbootstrap.d.ts +429 -173
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component, ViewChild, Directive, inject, Injectable, signal, TemplateRef, HostBinding, ElementRef, Renderer2, ChangeDetectorRef, Optional, InjectionToken, Inject, HostListener, QueryList, forwardRef, ContentChildren, ContentChild, ViewEncapsulation, SkipSelf, ViewChildren } from '@angular/core';
|
|
2
|
+
import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component, ViewChild, Directive, inject, Injectable, signal, TemplateRef, HostBinding, input, computed, ElementRef, Renderer2, ChangeDetectorRef, Optional, InjectionToken, Inject, HostListener, QueryList, forwardRef, ContentChildren, ContentChild, ViewEncapsulation, SkipSelf, ViewChildren } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@angular/common';
|
|
4
4
|
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
5
5
|
import * as i1 from '@angular/forms';
|
|
@@ -704,6 +704,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
704
704
|
type: Directive,
|
|
705
705
|
args: [{ selector: 'ng-template[ngbPager]', standalone: true }]
|
|
706
706
|
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
707
|
+
class NgbDataGridGroupHeaderTemplateDirective {
|
|
708
|
+
template;
|
|
709
|
+
constructor(template) {
|
|
710
|
+
this.template = template;
|
|
711
|
+
}
|
|
712
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
713
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDataGridGroupHeaderTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupHeaderTemplate], ng-template[ngbGroupHeader]", ngImport: i0 });
|
|
714
|
+
}
|
|
715
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderTemplateDirective, decorators: [{
|
|
716
|
+
type: Directive,
|
|
717
|
+
args: [{ selector: 'ng-template[ngbDatagridGroupHeaderTemplate], ng-template[ngbGroupHeader]', standalone: true }]
|
|
718
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
719
|
+
class NgbDataGridGroupHeaderColumnTemplateDirective {
|
|
720
|
+
template;
|
|
721
|
+
// Preserve the explicit public template binding names for compatibility.
|
|
722
|
+
field;
|
|
723
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
724
|
+
set legacyField(value) {
|
|
725
|
+
this.field = value;
|
|
726
|
+
}
|
|
727
|
+
constructor(template) {
|
|
728
|
+
this.template = template;
|
|
729
|
+
}
|
|
730
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderColumnTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
731
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDataGridGroupHeaderColumnTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupHeaderColumnTemplate], ng-template[ngbGroupHeaderColumn]", inputs: { field: ["ngbDatagridGroupHeaderColumnTemplate", "field"], legacyField: ["ngbGroupHeaderColumn", "legacyField"] }, ngImport: i0 });
|
|
732
|
+
}
|
|
733
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderColumnTemplateDirective, decorators: [{
|
|
734
|
+
type: Directive,
|
|
735
|
+
args: [{ selector: 'ng-template[ngbDatagridGroupHeaderColumnTemplate], ng-template[ngbGroupHeaderColumn]', standalone: true }]
|
|
736
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
|
|
737
|
+
type: Input,
|
|
738
|
+
args: ['ngbDatagridGroupHeaderColumnTemplate']
|
|
739
|
+
}], legacyField: [{
|
|
740
|
+
type: Input,
|
|
741
|
+
args: ['ngbGroupHeaderColumn']
|
|
742
|
+
}] } });
|
|
743
|
+
class NgbDataGridGroupFooterTemplateDirective {
|
|
744
|
+
template;
|
|
745
|
+
// Preserve the explicit public template binding names for compatibility.
|
|
746
|
+
field;
|
|
747
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
748
|
+
set legacyField(value) {
|
|
749
|
+
this.field = value;
|
|
750
|
+
}
|
|
751
|
+
constructor(template) {
|
|
752
|
+
this.template = template;
|
|
753
|
+
}
|
|
754
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupFooterTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
755
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDataGridGroupFooterTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupFooterTemplate], ng-template[ngbGroupFooter]", inputs: { field: ["ngbDatagridGroupFooterTemplate", "field"], legacyField: ["ngbGroupFooter", "legacyField"] }, ngImport: i0 });
|
|
756
|
+
}
|
|
757
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupFooterTemplateDirective, decorators: [{
|
|
758
|
+
type: Directive,
|
|
759
|
+
args: [{ selector: 'ng-template[ngbDatagridGroupFooterTemplate], ng-template[ngbGroupFooter]', standalone: true }]
|
|
760
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
|
|
761
|
+
type: Input,
|
|
762
|
+
args: ['ngbDatagridGroupFooterTemplate']
|
|
763
|
+
}], legacyField: [{
|
|
764
|
+
type: Input,
|
|
765
|
+
args: ['ngbGroupFooter']
|
|
766
|
+
}] } });
|
|
707
767
|
/** Handy constant to import in consumer apps */
|
|
708
768
|
const DATAGRID_TEMPLATE_DIRECTIVES = [
|
|
709
769
|
NgbCellTemplate,
|
|
@@ -713,6 +773,9 @@ const DATAGRID_TEMPLATE_DIRECTIVES = [
|
|
|
713
773
|
NgbGlobalFilterTemplate,
|
|
714
774
|
NgbRowDetailTemplate,
|
|
715
775
|
NgbPagerTemplate,
|
|
776
|
+
NgbDataGridGroupHeaderTemplateDirective,
|
|
777
|
+
NgbDataGridGroupHeaderColumnTemplateDirective,
|
|
778
|
+
NgbDataGridGroupFooterTemplateDirective,
|
|
716
779
|
];
|
|
717
780
|
|
|
718
781
|
const NGB_TEXT_FILTER_OPERATORS = [
|
|
@@ -904,12 +967,23 @@ function ngbApplyDataGridOperations(data, options = {}) {
|
|
|
904
967
|
const total = sorted.length;
|
|
905
968
|
const aggregates = ngbCalculateDataGridAggregates(sorted, options.aggregates ?? []);
|
|
906
969
|
const page = options.page === false ? sorted : applyPage(sorted, state);
|
|
970
|
+
const groupedData = (state.group?.length ?? 0) > 0
|
|
971
|
+
? (options.groupedData?.length ? cloneGroupResults(options.groupedData) : ngbGroupData(page, state.group ?? []))
|
|
972
|
+
: undefined;
|
|
907
973
|
return {
|
|
908
974
|
data: page,
|
|
909
975
|
total,
|
|
910
976
|
...(Object.keys(aggregates).length ? { aggregates } : {}),
|
|
977
|
+
...(groupedData?.length ? { groupedData } : {}),
|
|
911
978
|
};
|
|
912
979
|
}
|
|
980
|
+
function ngbGroupData(data, descriptors) {
|
|
981
|
+
const rows = [...(data ?? [])];
|
|
982
|
+
const normalized = normalizeGroupDescriptors(descriptors);
|
|
983
|
+
if (!normalized.length || !rows.length)
|
|
984
|
+
return [];
|
|
985
|
+
return groupRows(rows, normalized, 0);
|
|
986
|
+
}
|
|
913
987
|
function ngbCalculateDataGridAggregates(data, descriptors) {
|
|
914
988
|
const rows = [...(data ?? [])];
|
|
915
989
|
const results = {};
|
|
@@ -919,16 +993,19 @@ function ngbCalculateDataGridAggregates(data, descriptors) {
|
|
|
919
993
|
const values = rows
|
|
920
994
|
.map((row) => row?.[field])
|
|
921
995
|
.filter((value) => value !== null && value !== undefined && value !== '');
|
|
922
|
-
|
|
996
|
+
const aggregate = normalizeAggregate(descriptor.aggregate);
|
|
997
|
+
switch (aggregate) {
|
|
923
998
|
case 'count':
|
|
924
999
|
bucket.count = values.length;
|
|
925
1000
|
break;
|
|
926
1001
|
case 'sum':
|
|
927
1002
|
bucket.sum = numericValues(values).reduce((sum, value) => sum + value, 0);
|
|
928
1003
|
break;
|
|
929
|
-
case '
|
|
1004
|
+
case 'avg': {
|
|
930
1005
|
const numbers = numericValues(values);
|
|
931
|
-
|
|
1006
|
+
const average = numbers.length ? numbers.reduce((sum, value) => sum + value, 0) / numbers.length : null;
|
|
1007
|
+
bucket.avg = average;
|
|
1008
|
+
bucket.average = average;
|
|
932
1009
|
break;
|
|
933
1010
|
}
|
|
934
1011
|
case 'min':
|
|
@@ -1043,6 +1120,80 @@ function applyPage(rows, state) {
|
|
|
1043
1120
|
: Math.max(0, (Math.max(1, Math.trunc(Number(state.page) || 1)) - 1) * pageSize);
|
|
1044
1121
|
return rows.slice(skip, skip + pageSize);
|
|
1045
1122
|
}
|
|
1123
|
+
function groupRows(rows, descriptors, level) {
|
|
1124
|
+
const descriptor = descriptors[level];
|
|
1125
|
+
if (!descriptor)
|
|
1126
|
+
return [];
|
|
1127
|
+
const buckets = new Map();
|
|
1128
|
+
for (const row of rows) {
|
|
1129
|
+
const value = row?.[descriptor.field];
|
|
1130
|
+
const key = groupValueKey(value);
|
|
1131
|
+
const bucket = buckets.get(key);
|
|
1132
|
+
if (bucket) {
|
|
1133
|
+
bucket.rows.push(row);
|
|
1134
|
+
}
|
|
1135
|
+
else {
|
|
1136
|
+
buckets.set(key, { value, rows: [row] });
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
const groups = Array.from(buckets.values()).sort((left, right) => {
|
|
1140
|
+
const result = compareValues(left.value, right.value);
|
|
1141
|
+
return descriptor.dir === 'desc' ? -result : result;
|
|
1142
|
+
});
|
|
1143
|
+
return groups.map((bucket) => {
|
|
1144
|
+
const childGroups = groupRows(bucket.rows, descriptors, level + 1);
|
|
1145
|
+
return {
|
|
1146
|
+
field: descriptor.field,
|
|
1147
|
+
value: bucket.value,
|
|
1148
|
+
dir: descriptor.dir,
|
|
1149
|
+
level,
|
|
1150
|
+
count: bucket.rows.length,
|
|
1151
|
+
...(descriptor.aggregates?.length ? { aggregates: ngbCalculateDataGridAggregates(bucket.rows, descriptor.aggregates) } : {}),
|
|
1152
|
+
items: childGroups.length ? childGroups : bucket.rows,
|
|
1153
|
+
};
|
|
1154
|
+
});
|
|
1155
|
+
}
|
|
1156
|
+
function normalizeGroupDescriptors(descriptors) {
|
|
1157
|
+
const seen = new Set();
|
|
1158
|
+
const normalized = [];
|
|
1159
|
+
for (const descriptor of descriptors ?? []) {
|
|
1160
|
+
const field = String(descriptor?.field ?? '').trim();
|
|
1161
|
+
if (!field || seen.has(field))
|
|
1162
|
+
continue;
|
|
1163
|
+
seen.add(field);
|
|
1164
|
+
normalized.push({
|
|
1165
|
+
field,
|
|
1166
|
+
dir: descriptor.dir === 'desc' ? 'desc' : 'asc',
|
|
1167
|
+
aggregates: [...(descriptor.aggregates ?? [])],
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
1170
|
+
return normalized;
|
|
1171
|
+
}
|
|
1172
|
+
function normalizeAggregate(aggregate) {
|
|
1173
|
+
return aggregate === 'average' ? 'avg' : aggregate;
|
|
1174
|
+
}
|
|
1175
|
+
function cloneGroupResults(groups) {
|
|
1176
|
+
return groups.map((group) => ({
|
|
1177
|
+
...group,
|
|
1178
|
+
...(group.aggregates ? { aggregates: cloneAggregateResults(group.aggregates) } : {}),
|
|
1179
|
+
items: group.items.map((item) => (isGroupResult(item) ? cloneGroupResults([item])[0] : item)),
|
|
1180
|
+
}));
|
|
1181
|
+
}
|
|
1182
|
+
function cloneAggregateResults(results) {
|
|
1183
|
+
const cloned = {};
|
|
1184
|
+
for (const field of Object.keys(results ?? {})) {
|
|
1185
|
+
cloned[field] = { ...results[field] };
|
|
1186
|
+
}
|
|
1187
|
+
return cloned;
|
|
1188
|
+
}
|
|
1189
|
+
function isGroupResult(item) {
|
|
1190
|
+
return typeof item === 'object' && item !== null && Array.isArray(item.items);
|
|
1191
|
+
}
|
|
1192
|
+
function groupValueKey(value) {
|
|
1193
|
+
if (value instanceof Date)
|
|
1194
|
+
return `date:${value.toISOString()}`;
|
|
1195
|
+
return `${typeof value}:${String(value)}`;
|
|
1196
|
+
}
|
|
1046
1197
|
function resolveFilterType(column, raw, value) {
|
|
1047
1198
|
if (column?.filterType)
|
|
1048
1199
|
return column.filterType;
|
|
@@ -1148,16 +1299,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
1148
1299
|
args: [{ providedIn: 'root' }]
|
|
1149
1300
|
}] });
|
|
1150
1301
|
|
|
1302
|
+
const hasStructuredClone = (value) => typeof value.structuredClone === 'function';
|
|
1151
1303
|
const clone = (value) => {
|
|
1152
1304
|
try {
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1305
|
+
if (hasStructuredClone(globalThis)) {
|
|
1306
|
+
return globalThis.structuredClone(value);
|
|
1307
|
+
}
|
|
1308
|
+
return JSON.parse(JSON.stringify(value));
|
|
1156
1309
|
}
|
|
1157
1310
|
catch {
|
|
1158
1311
|
return value;
|
|
1159
1312
|
}
|
|
1160
1313
|
};
|
|
1314
|
+
const asRecordLike = (value) => typeof value === 'object' && value !== null ? value : null;
|
|
1161
1315
|
const shallowEqual = (a, b) => {
|
|
1162
1316
|
if (a === b)
|
|
1163
1317
|
return true;
|
|
@@ -1214,9 +1368,9 @@ class NgbDatagridDefaultEditService {
|
|
|
1214
1368
|
const baseline = this.originals().find((it) => Object.is(it.id, rowId))?.row;
|
|
1215
1369
|
if (!baseline)
|
|
1216
1370
|
return false;
|
|
1217
|
-
return !shallowEqual(baseline, currentRow);
|
|
1371
|
+
return !shallowEqual(asRecordLike(baseline), asRecordLike(currentRow));
|
|
1218
1372
|
}
|
|
1219
|
-
saveChanges(data, _rowIndex, rowId,
|
|
1373
|
+
saveChanges(data, _rowIndex, rowId, _currentRow) {
|
|
1220
1374
|
this.newRows.update((ids) => ids.filter((id) => !Object.is(id, rowId)));
|
|
1221
1375
|
// Once saved, clear baseline tracking (no longer "dirty").
|
|
1222
1376
|
this.originals.update((items) => items.filter((it) => !Object.is(it.id, rowId)));
|
|
@@ -1249,13 +1403,104 @@ class NgbDatagridDefaultEditService {
|
|
|
1249
1403
|
}
|
|
1250
1404
|
}
|
|
1251
1405
|
|
|
1406
|
+
const PAGE_SIZES = {
|
|
1407
|
+
A4: [595.28, 841.89],
|
|
1408
|
+
Letter: [612, 792],
|
|
1409
|
+
};
|
|
1252
1410
|
class JsPdfAdapter {
|
|
1253
|
-
async export(
|
|
1254
|
-
const
|
|
1255
|
-
const
|
|
1256
|
-
const
|
|
1257
|
-
|
|
1258
|
-
|
|
1411
|
+
async export(payload) {
|
|
1412
|
+
const pdf = this.createPdf(payload);
|
|
1413
|
+
const blob = new Blob([pdf], { type: 'application/pdf' });
|
|
1414
|
+
const url = URL.createObjectURL(blob);
|
|
1415
|
+
const link = document.createElement('a');
|
|
1416
|
+
link.href = url;
|
|
1417
|
+
link.download = `${payload.fileName}.pdf`;
|
|
1418
|
+
link.click();
|
|
1419
|
+
URL.revokeObjectURL(url);
|
|
1420
|
+
}
|
|
1421
|
+
createPdf({ fileName, columns, rows, options }) {
|
|
1422
|
+
const requestedSize = String(options?.pageSize || 'A4');
|
|
1423
|
+
const baseSize = PAGE_SIZES[requestedSize] || PAGE_SIZES.A4;
|
|
1424
|
+
const landscape = Boolean(options?.landscape);
|
|
1425
|
+
const [pageWidth, pageHeight] = landscape ? [baseSize[1], baseSize[0]] : baseSize;
|
|
1426
|
+
const margin = this.resolveMargin(options?.margins);
|
|
1427
|
+
const lineHeight = 14;
|
|
1428
|
+
const maxLines = Math.max(1, Math.floor((pageHeight - margin.top - margin.bottom - 52) / lineHeight));
|
|
1429
|
+
const tableLines = this.toTableLines(columns, rows);
|
|
1430
|
+
const pages = this.chunk(tableLines, maxLines);
|
|
1431
|
+
const objects = [];
|
|
1432
|
+
const pageIds = [];
|
|
1433
|
+
objects.push('<< /Type /Catalog /Pages 2 0 R >>');
|
|
1434
|
+
objects.push('');
|
|
1435
|
+
for (const [index, lines] of pages.entries()) {
|
|
1436
|
+
const pageObjectId = objects.length + 1;
|
|
1437
|
+
const contentObjectId = pageObjectId + 1;
|
|
1438
|
+
pageIds.push(pageObjectId);
|
|
1439
|
+
objects.push(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${pageWidth} ${pageHeight}] /Resources << /Font << /F1 ${pages.length * 2 + 3} 0 R >> >> /Contents ${contentObjectId} 0 R >>`);
|
|
1440
|
+
objects.push(this.contentStream(fileName, lines, index + 1, pages.length, pageHeight, margin, lineHeight));
|
|
1441
|
+
}
|
|
1442
|
+
objects[1] = `<< /Type /Pages /Kids [${pageIds.map(id => `${id} 0 R`).join(' ')}] /Count ${pageIds.length} >>`;
|
|
1443
|
+
objects.push('<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>');
|
|
1444
|
+
return this.serializePdf(objects);
|
|
1445
|
+
}
|
|
1446
|
+
resolveMargin(margins) {
|
|
1447
|
+
if (!Array.isArray(margins) || margins.length !== 4) {
|
|
1448
|
+
return { top: 40, right: 40, bottom: 40, left: 40 };
|
|
1449
|
+
}
|
|
1450
|
+
const [top, right, bottom, left] = margins.map(value => Math.max(16, Number(value) || 40));
|
|
1451
|
+
return { top, right, bottom, left };
|
|
1452
|
+
}
|
|
1453
|
+
toTableLines(columns, rows) {
|
|
1454
|
+
const headers = columns.map(column => this.printable(column));
|
|
1455
|
+
const body = rows.map(row => columns.map(column => this.printable(row?.[column])));
|
|
1456
|
+
const widths = headers.map((header, index) => Math.min(24, Math.max(header.length, ...body.map(values => values[index]?.length || 0))));
|
|
1457
|
+
const format = (values) => values.map((value, index) => value.padEnd(widths[index]).slice(0, widths[index])).join(' ');
|
|
1458
|
+
return [
|
|
1459
|
+
format(headers),
|
|
1460
|
+
widths.map(width => '-'.repeat(width)).join(' '),
|
|
1461
|
+
...body.map(format),
|
|
1462
|
+
];
|
|
1463
|
+
}
|
|
1464
|
+
contentStream(fileName, lines, page, totalPages, pageHeight, margin, lineHeight) {
|
|
1465
|
+
const commands = [
|
|
1466
|
+
'BT',
|
|
1467
|
+
`/F1 16 Tf ${margin.left} ${pageHeight - margin.top} Td (${this.pdfText(fileName)}) Tj`,
|
|
1468
|
+
`/F1 9 Tf 0 -24 Td (${this.pdfText(`Page ${page} of ${totalPages}`)}) Tj`,
|
|
1469
|
+
...lines.map(line => `0 -${lineHeight} Td (${this.pdfText(line)}) Tj`),
|
|
1470
|
+
'ET',
|
|
1471
|
+
].join('\n');
|
|
1472
|
+
return `<< /Length ${commands.length} >>\nstream\n${commands}\nendstream`;
|
|
1473
|
+
}
|
|
1474
|
+
chunk(items, size) {
|
|
1475
|
+
const pages = [];
|
|
1476
|
+
for (let index = 0; index < items.length; index += size) {
|
|
1477
|
+
pages.push(items.slice(index, index + size));
|
|
1478
|
+
}
|
|
1479
|
+
return pages.length ? pages : [[]];
|
|
1480
|
+
}
|
|
1481
|
+
printable(value) {
|
|
1482
|
+
if (value === null || value === undefined) {
|
|
1483
|
+
return '';
|
|
1484
|
+
}
|
|
1485
|
+
return String(value).replace(/[^\x20-\x7E]/g, '?').replace(/\s+/g, ' ').trim();
|
|
1486
|
+
}
|
|
1487
|
+
pdfText(value) {
|
|
1488
|
+
return value.replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
|
|
1489
|
+
}
|
|
1490
|
+
serializePdf(objects) {
|
|
1491
|
+
let pdf = '%PDF-1.4\n';
|
|
1492
|
+
const offsets = [0];
|
|
1493
|
+
for (const [index, object] of objects.entries()) {
|
|
1494
|
+
offsets[index + 1] = pdf.length;
|
|
1495
|
+
pdf += `${index + 1} 0 obj\n${object}\nendobj\n`;
|
|
1496
|
+
}
|
|
1497
|
+
const xrefOffset = pdf.length;
|
|
1498
|
+
pdf += `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`;
|
|
1499
|
+
for (let index = 1; index <= objects.length; index++) {
|
|
1500
|
+
pdf += `${String(offsets[index]).padStart(10, '0')} 00000 n \n`;
|
|
1501
|
+
}
|
|
1502
|
+
pdf += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${xrefOffset}\n%%EOF`;
|
|
1503
|
+
return pdf;
|
|
1259
1504
|
}
|
|
1260
1505
|
}
|
|
1261
1506
|
|
|
@@ -1321,7 +1566,6 @@ class BrowserExcelExportAdapter {
|
|
|
1321
1566
|
}
|
|
1322
1567
|
}
|
|
1323
1568
|
|
|
1324
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
1325
1569
|
class ExportButtonDirective {
|
|
1326
1570
|
// Expose the TemplateRef so the grid can render it with a context
|
|
1327
1571
|
templateRef = inject(TemplateRef);
|
|
@@ -1693,7 +1937,7 @@ class NgbDatagridAddRowComponent {
|
|
|
1693
1937
|
</div>
|
|
1694
1938
|
</td>
|
|
1695
1939
|
}
|
|
1696
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }] });
|
|
1940
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1697
1941
|
}
|
|
1698
1942
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridAddRowComponent, decorators: [{
|
|
1699
1943
|
type: Component,
|
|
@@ -1702,6 +1946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
1702
1946
|
standalone: true,
|
|
1703
1947
|
imports: [CommonModule, FormsModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
|
|
1704
1948
|
viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
|
|
1949
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1705
1950
|
template: `
|
|
1706
1951
|
@if (grid.showSelectionColumn()) {
|
|
1707
1952
|
<td
|
|
@@ -1916,6 +2161,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
1916
2161
|
|
|
1917
2162
|
class NgbDatagridDataRowComponent {
|
|
1918
2163
|
grid;
|
|
2164
|
+
renderTick = 0;
|
|
1919
2165
|
row;
|
|
1920
2166
|
index;
|
|
1921
2167
|
selected = false;
|
|
@@ -1923,7 +2169,7 @@ class NgbDatagridDataRowComponent {
|
|
|
1923
2169
|
return row[col.field];
|
|
1924
2170
|
}
|
|
1925
2171
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDataRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1926
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridDataRowComponent, isStandalone: true, selector: "tr[ngbDatagridDataRow]", inputs: { grid: "grid", row: "row", index: "index", selected: "selected" }, ngImport: i0, template: `
|
|
2172
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridDataRowComponent, isStandalone: true, selector: "tr[ngbDatagridDataRow]", inputs: { grid: "grid", renderTick: "renderTick", row: "row", index: "index", selected: "selected" }, ngImport: i0, template: `
|
|
1927
2173
|
@if (grid.showSelectionColumn()) {
|
|
1928
2174
|
<td
|
|
1929
2175
|
class="text-center align-middle"
|
|
@@ -2009,6 +2255,7 @@ class NgbDatagridDataRowComponent {
|
|
|
2009
2255
|
[class.grid-cell--incell]="grid.isIncellEditMode()"
|
|
2010
2256
|
[ngClass]="grid.resolveCellClass(row, index, col)"
|
|
2011
2257
|
[ngStyle]="grid.resolveCellStyle(row, index, col)"
|
|
2258
|
+
(mousedown)="grid.onCellMouseDown($event, index, col)"
|
|
2012
2259
|
(click)="grid.onCellClick($event, index, col)"
|
|
2013
2260
|
>
|
|
2014
2261
|
<div class="ngb-stacked-card__label">{{ col.header }}</div>
|
|
@@ -2052,6 +2299,7 @@ class NgbDatagridDataRowComponent {
|
|
|
2052
2299
|
[style.right.px]="grid.isStackedLayout() ? null : grid.columnEndOffset(col)"
|
|
2053
2300
|
(focus)="grid.onDataCellFocus(index, ci)"
|
|
2054
2301
|
(keydown)="grid.onDataCellKeydown($event, index, ci, col)"
|
|
2302
|
+
(mousedown)="grid.onCellMouseDown($event, index, col)"
|
|
2055
2303
|
(click)="grid.onCellClick($event, index, col)"
|
|
2056
2304
|
>
|
|
2057
2305
|
<ng-container *ngTemplateOutlet="dataCell; context: { col: col, ci: ci }"></ng-container>
|
|
@@ -2185,7 +2433,7 @@ class NgbDatagridDataRowComponent {
|
|
|
2185
2433
|
@default {
|
|
2186
2434
|
<span class="grid-cell-text">
|
|
2187
2435
|
@if (grid.isSearchHighlightEnabled() && grid.shouldHighlightSearchInColumn(col.field)) {
|
|
2188
|
-
@for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track
|
|
2436
|
+
@for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track part.key) {
|
|
2189
2437
|
@if (part.match) {
|
|
2190
2438
|
<mark class="grid-search-highlight">{{ part.text }}</mark>
|
|
2191
2439
|
} @else {
|
|
@@ -2265,7 +2513,7 @@ class NgbDatagridDataRowComponent {
|
|
|
2265
2513
|
</div>
|
|
2266
2514
|
}
|
|
2267
2515
|
</ng-template>
|
|
2268
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }] });
|
|
2516
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2269
2517
|
}
|
|
2270
2518
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDataRowComponent, decorators: [{
|
|
2271
2519
|
type: Component,
|
|
@@ -2274,6 +2522,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2274
2522
|
standalone: true,
|
|
2275
2523
|
imports: [CommonModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
|
|
2276
2524
|
viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
|
|
2525
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2277
2526
|
template: `
|
|
2278
2527
|
@if (grid.showSelectionColumn()) {
|
|
2279
2528
|
<td
|
|
@@ -2360,6 +2609,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2360
2609
|
[class.grid-cell--incell]="grid.isIncellEditMode()"
|
|
2361
2610
|
[ngClass]="grid.resolveCellClass(row, index, col)"
|
|
2362
2611
|
[ngStyle]="grid.resolveCellStyle(row, index, col)"
|
|
2612
|
+
(mousedown)="grid.onCellMouseDown($event, index, col)"
|
|
2363
2613
|
(click)="grid.onCellClick($event, index, col)"
|
|
2364
2614
|
>
|
|
2365
2615
|
<div class="ngb-stacked-card__label">{{ col.header }}</div>
|
|
@@ -2403,6 +2653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2403
2653
|
[style.right.px]="grid.isStackedLayout() ? null : grid.columnEndOffset(col)"
|
|
2404
2654
|
(focus)="grid.onDataCellFocus(index, ci)"
|
|
2405
2655
|
(keydown)="grid.onDataCellKeydown($event, index, ci, col)"
|
|
2656
|
+
(mousedown)="grid.onCellMouseDown($event, index, col)"
|
|
2406
2657
|
(click)="grid.onCellClick($event, index, col)"
|
|
2407
2658
|
>
|
|
2408
2659
|
<ng-container *ngTemplateOutlet="dataCell; context: { col: col, ci: ci }"></ng-container>
|
|
@@ -2536,7 +2787,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2536
2787
|
@default {
|
|
2537
2788
|
<span class="grid-cell-text">
|
|
2538
2789
|
@if (grid.isSearchHighlightEnabled() && grid.shouldHighlightSearchInColumn(col.field)) {
|
|
2539
|
-
@for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track
|
|
2790
|
+
@for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track part.key) {
|
|
2540
2791
|
@if (part.match) {
|
|
2541
2792
|
<mark class="grid-search-highlight">{{ part.text }}</mark>
|
|
2542
2793
|
} @else {
|
|
@@ -2621,6 +2872,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2621
2872
|
}], propDecorators: { grid: [{
|
|
2622
2873
|
type: Input,
|
|
2623
2874
|
args: [{ required: true }]
|
|
2875
|
+
}], renderTick: [{
|
|
2876
|
+
type: Input
|
|
2624
2877
|
}], row: [{
|
|
2625
2878
|
type: Input,
|
|
2626
2879
|
args: [{ required: true }]
|
|
@@ -2640,7 +2893,7 @@ class NgbDatagridDetailRowComponent {
|
|
|
2640
2893
|
<td [attr.colspan]="grid.detailColspan" role="region" class="grid-detail-row__cell">
|
|
2641
2894
|
<div class="grid-detail-row__content">
|
|
2642
2895
|
<ng-container
|
|
2643
|
-
[ngTemplateOutlet]="grid.rowDetailTpl
|
|
2896
|
+
[ngTemplateOutlet]="grid.rowDetailTpl!.template"
|
|
2644
2897
|
[ngTemplateOutletContext]="{ $implicit: row, index: index }"
|
|
2645
2898
|
>
|
|
2646
2899
|
</ng-container>
|
|
@@ -2658,7 +2911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2658
2911
|
<td [attr.colspan]="grid.detailColspan" role="region" class="grid-detail-row__cell">
|
|
2659
2912
|
<div class="grid-detail-row__content">
|
|
2660
2913
|
<ng-container
|
|
2661
|
-
[ngTemplateOutlet]="grid.rowDetailTpl
|
|
2914
|
+
[ngTemplateOutlet]="grid.rowDetailTpl!.template"
|
|
2662
2915
|
[ngTemplateOutletContext]="{ $implicit: row, index: index }"
|
|
2663
2916
|
>
|
|
2664
2917
|
</ng-container>
|
|
@@ -2678,42 +2931,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2678
2931
|
}] } });
|
|
2679
2932
|
|
|
2680
2933
|
class NgbDatagridFooterComponent {
|
|
2681
|
-
grid
|
|
2682
|
-
|
|
2934
|
+
grid = input.required(/* @ts-ignore */
|
|
2935
|
+
...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
|
|
2936
|
+
placement = input('bottom', /* @ts-ignore */
|
|
2937
|
+
...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
|
|
2938
|
+
isTop = computed(() => this.placement() === 'top', /* @ts-ignore */
|
|
2939
|
+
...(ngDevMode ? [{ debugName: "isTop" }] : /* istanbul ignore next */ []));
|
|
2940
|
+
isBottom = computed(() => this.placement() === 'bottom', /* @ts-ignore */
|
|
2941
|
+
...(ngDevMode ? [{ debugName: "isBottom" }] : /* istanbul ignore next */ []));
|
|
2683
2942
|
get pagerSettings() {
|
|
2684
|
-
return ngbDatagridPagerSettings(this.grid.resolvedPageable());
|
|
2943
|
+
return ngbDatagridPagerSettings(this.grid().resolvedPageable());
|
|
2685
2944
|
}
|
|
2686
2945
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2687
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFooterComponent, isStandalone: true, selector: "ngb-datagrid-footer", inputs: { grid: "grid", placement: "placement" }, ngImport: i0, template: `
|
|
2688
|
-
@if (grid.paginationActive && grid.pagerShowsAt(placement)) {
|
|
2689
|
-
@if (grid.hasCustomPagerTemplate()) {
|
|
2946
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFooterComponent, isStandalone: true, selector: "ngb-datagrid-footer", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: true, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2947
|
+
@if (grid().paginationActive && grid().pagerShowsAt(placement())) {
|
|
2948
|
+
@if (grid().hasCustomPagerTemplate()) {
|
|
2690
2949
|
<div
|
|
2691
2950
|
class="grid-footer grid-footer--custom"
|
|
2692
|
-
[class.grid-footer--top]="
|
|
2693
|
-
[class.grid-footer--bottom]="
|
|
2694
|
-
[class.sticky-footer]="grid.isFooterSticky &&
|
|
2951
|
+
[class.grid-footer--top]="isTop()"
|
|
2952
|
+
[class.grid-footer--bottom]="isBottom()"
|
|
2953
|
+
[class.sticky-footer]="grid().isFooterSticky && isBottom()"
|
|
2695
2954
|
>
|
|
2696
2955
|
<ng-container
|
|
2697
|
-
*ngTemplateOutlet="grid.pagerTpl!.template; context: grid.pagerContext()"
|
|
2956
|
+
*ngTemplateOutlet="grid().pagerTpl!.template; context: grid().pagerContext()"
|
|
2698
2957
|
></ng-container>
|
|
2699
2958
|
</div>
|
|
2700
2959
|
} @else {
|
|
2701
2960
|
<div
|
|
2702
2961
|
class="grid-footer"
|
|
2703
|
-
[class.grid-footer--top]="
|
|
2704
|
-
[class.grid-footer--bottom]="
|
|
2705
|
-
[class.sticky-footer]="grid.isFooterSticky &&
|
|
2962
|
+
[class.grid-footer--top]="isTop()"
|
|
2963
|
+
[class.grid-footer--bottom]="isBottom()"
|
|
2964
|
+
[class.sticky-footer]="grid().isFooterSticky && isBottom()"
|
|
2706
2965
|
>
|
|
2707
2966
|
<ngb-pager
|
|
2708
|
-
[page]="grid.page"
|
|
2709
|
-
[pageSize]="grid.pageSize"
|
|
2710
|
-
[collectionSize]="grid.pagerCollectionSize()"
|
|
2967
|
+
[page]="grid().page"
|
|
2968
|
+
[pageSize]="grid().pageSize"
|
|
2969
|
+
[collectionSize]="grid().pagerCollectionSize()"
|
|
2711
2970
|
[settings]="pagerSettings"
|
|
2712
|
-
[infoLabel]="grid.paginationRangeLabel()"
|
|
2713
|
-
[rowsPerPageLabel]="grid.rowsPerPageLabel()"
|
|
2714
|
-
[responsive]="grid.pagerResponsive()"
|
|
2715
|
-
(pageChange)="grid.onPage($event)"
|
|
2716
|
-
(pageSizeChange)="grid.onPageSize($event)"
|
|
2971
|
+
[infoLabel]="grid().paginationRangeLabel()"
|
|
2972
|
+
[rowsPerPageLabel]="grid().rowsPerPageLabel()"
|
|
2973
|
+
[responsive]="grid().pagerResponsive()"
|
|
2974
|
+
(pageChange)="grid().onPage($event)"
|
|
2975
|
+
(pageSizeChange)="grid().onPageSize($event)"
|
|
2717
2976
|
/>
|
|
2718
2977
|
</div>
|
|
2719
2978
|
}
|
|
@@ -2727,47 +2986,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2727
2986
|
standalone: true,
|
|
2728
2987
|
imports: [CommonModule, NgbPagerComponent],
|
|
2729
2988
|
template: `
|
|
2730
|
-
@if (grid.paginationActive && grid.pagerShowsAt(placement)) {
|
|
2731
|
-
@if (grid.hasCustomPagerTemplate()) {
|
|
2989
|
+
@if (grid().paginationActive && grid().pagerShowsAt(placement())) {
|
|
2990
|
+
@if (grid().hasCustomPagerTemplate()) {
|
|
2732
2991
|
<div
|
|
2733
2992
|
class="grid-footer grid-footer--custom"
|
|
2734
|
-
[class.grid-footer--top]="
|
|
2735
|
-
[class.grid-footer--bottom]="
|
|
2736
|
-
[class.sticky-footer]="grid.isFooterSticky &&
|
|
2993
|
+
[class.grid-footer--top]="isTop()"
|
|
2994
|
+
[class.grid-footer--bottom]="isBottom()"
|
|
2995
|
+
[class.sticky-footer]="grid().isFooterSticky && isBottom()"
|
|
2737
2996
|
>
|
|
2738
2997
|
<ng-container
|
|
2739
|
-
*ngTemplateOutlet="grid.pagerTpl!.template; context: grid.pagerContext()"
|
|
2998
|
+
*ngTemplateOutlet="grid().pagerTpl!.template; context: grid().pagerContext()"
|
|
2740
2999
|
></ng-container>
|
|
2741
3000
|
</div>
|
|
2742
3001
|
} @else {
|
|
2743
3002
|
<div
|
|
2744
3003
|
class="grid-footer"
|
|
2745
|
-
[class.grid-footer--top]="
|
|
2746
|
-
[class.grid-footer--bottom]="
|
|
2747
|
-
[class.sticky-footer]="grid.isFooterSticky &&
|
|
3004
|
+
[class.grid-footer--top]="isTop()"
|
|
3005
|
+
[class.grid-footer--bottom]="isBottom()"
|
|
3006
|
+
[class.sticky-footer]="grid().isFooterSticky && isBottom()"
|
|
2748
3007
|
>
|
|
2749
3008
|
<ngb-pager
|
|
2750
|
-
[page]="grid.page"
|
|
2751
|
-
[pageSize]="grid.pageSize"
|
|
2752
|
-
[collectionSize]="grid.pagerCollectionSize()"
|
|
3009
|
+
[page]="grid().page"
|
|
3010
|
+
[pageSize]="grid().pageSize"
|
|
3011
|
+
[collectionSize]="grid().pagerCollectionSize()"
|
|
2753
3012
|
[settings]="pagerSettings"
|
|
2754
|
-
[infoLabel]="grid.paginationRangeLabel()"
|
|
2755
|
-
[rowsPerPageLabel]="grid.rowsPerPageLabel()"
|
|
2756
|
-
[responsive]="grid.pagerResponsive()"
|
|
2757
|
-
(pageChange)="grid.onPage($event)"
|
|
2758
|
-
(pageSizeChange)="grid.onPageSize($event)"
|
|
3013
|
+
[infoLabel]="grid().paginationRangeLabel()"
|
|
3014
|
+
[rowsPerPageLabel]="grid().rowsPerPageLabel()"
|
|
3015
|
+
[responsive]="grid().pagerResponsive()"
|
|
3016
|
+
(pageChange)="grid().onPage($event)"
|
|
3017
|
+
(pageSizeChange)="grid().onPageSize($event)"
|
|
2759
3018
|
/>
|
|
2760
3019
|
</div>
|
|
2761
3020
|
}
|
|
2762
3021
|
}
|
|
2763
3022
|
`,
|
|
2764
3023
|
}]
|
|
2765
|
-
}], propDecorators: { grid: [{
|
|
2766
|
-
type: Input,
|
|
2767
|
-
args: [{ required: true }]
|
|
2768
|
-
}], placement: [{
|
|
2769
|
-
type: Input
|
|
2770
|
-
}] } });
|
|
3024
|
+
}], propDecorators: { grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }] } });
|
|
2771
3025
|
|
|
2772
3026
|
class NgbDatagridFieldShellComponent {
|
|
2773
3027
|
icon;
|
|
@@ -2802,8 +3056,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
2802
3056
|
|
|
2803
3057
|
class NgbDatagridHeaderComponent {
|
|
2804
3058
|
grid;
|
|
3059
|
+
renderTick = 0;
|
|
2805
3060
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2806
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridHeaderComponent, isStandalone: true, selector: "thead[ngbDatagridHeader]", inputs: { grid: "grid" }, ngImport: i0, template: `
|
|
3061
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridHeaderComponent, isStandalone: true, selector: "thead[ngbDatagridHeader]", inputs: { grid: "grid", renderTick: "renderTick" }, ngImport: i0, template: `
|
|
2807
3062
|
<tr>
|
|
2808
3063
|
@if (grid.showSelectionColumn()) {
|
|
2809
3064
|
<th
|
|
@@ -2870,6 +3125,20 @@ class NgbDatagridHeaderComponent {
|
|
|
2870
3125
|
[attr.aria-sort]="grid.enableSorting && col.sortable ? grid.ariaSortFor(col.field) : null"
|
|
2871
3126
|
>
|
|
2872
3127
|
<div class="grid-header__cell">
|
|
3128
|
+
@if (grid.isColumnGroupable(col)) {
|
|
3129
|
+
<span
|
|
3130
|
+
class="grid-column-group-handle bi bi-diagram-3"
|
|
3131
|
+
[class.grid-column-group-handle--active]="grid.isFieldGrouped(col.field)"
|
|
3132
|
+
draggable="true"
|
|
3133
|
+
role="button"
|
|
3134
|
+
tabindex="0"
|
|
3135
|
+
[attr.aria-label]="grid.groupHandleAriaLabel(col)"
|
|
3136
|
+
(dragstart)="grid.onGroupHandleDragStart($event, col.field); $event.stopPropagation()"
|
|
3137
|
+
(dragend)="grid.onGroupHandleDragEnd()"
|
|
3138
|
+
(keydown.enter)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
|
|
3139
|
+
(keydown.space)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
|
|
3140
|
+
></span>
|
|
3141
|
+
}
|
|
2873
3142
|
@if (grid.isColumnReorderable(col)) {
|
|
2874
3143
|
<span
|
|
2875
3144
|
class="grid-column-reorder-handle bi bi-grip-vertical"
|
|
@@ -3066,7 +3335,7 @@ class NgbDatagridHeaderComponent {
|
|
|
3066
3335
|
@if (grid.showActionsColumn()) { <th></th> }
|
|
3067
3336
|
</tr>
|
|
3068
3337
|
}
|
|
3069
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }] });
|
|
3338
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3070
3339
|
}
|
|
3071
3340
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridHeaderComponent, decorators: [{
|
|
3072
3341
|
type: Component,
|
|
@@ -3081,6 +3350,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
3081
3350
|
NgbDatagridControlDirective,
|
|
3082
3351
|
NgbDatagridFieldShellComponent,
|
|
3083
3352
|
],
|
|
3353
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
3084
3354
|
template: `
|
|
3085
3355
|
<tr>
|
|
3086
3356
|
@if (grid.showSelectionColumn()) {
|
|
@@ -3148,6 +3418,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
3148
3418
|
[attr.aria-sort]="grid.enableSorting && col.sortable ? grid.ariaSortFor(col.field) : null"
|
|
3149
3419
|
>
|
|
3150
3420
|
<div class="grid-header__cell">
|
|
3421
|
+
@if (grid.isColumnGroupable(col)) {
|
|
3422
|
+
<span
|
|
3423
|
+
class="grid-column-group-handle bi bi-diagram-3"
|
|
3424
|
+
[class.grid-column-group-handle--active]="grid.isFieldGrouped(col.field)"
|
|
3425
|
+
draggable="true"
|
|
3426
|
+
role="button"
|
|
3427
|
+
tabindex="0"
|
|
3428
|
+
[attr.aria-label]="grid.groupHandleAriaLabel(col)"
|
|
3429
|
+
(dragstart)="grid.onGroupHandleDragStart($event, col.field); $event.stopPropagation()"
|
|
3430
|
+
(dragend)="grid.onGroupHandleDragEnd()"
|
|
3431
|
+
(keydown.enter)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
|
|
3432
|
+
(keydown.space)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
|
|
3433
|
+
></span>
|
|
3434
|
+
}
|
|
3151
3435
|
@if (grid.isColumnReorderable(col)) {
|
|
3152
3436
|
<span
|
|
3153
3437
|
class="grid-column-reorder-handle bi bi-grip-vertical"
|
|
@@ -3349,6 +3633,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
3349
3633
|
}], propDecorators: { grid: [{
|
|
3350
3634
|
type: Input,
|
|
3351
3635
|
args: [{ required: true }]
|
|
3636
|
+
}], renderTick: [{
|
|
3637
|
+
type: Input
|
|
3352
3638
|
}] } });
|
|
3353
3639
|
|
|
3354
3640
|
class NgbDatagridSurfaceCardComponent {
|
|
@@ -3870,7 +4156,7 @@ class NgbDatagridFilterMenuPanelComponent {
|
|
|
3870
4156
|
}
|
|
3871
4157
|
</ngb-datagrid-surface-card>
|
|
3872
4158
|
</div>
|
|
3873
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { 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: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }, { kind: "component", type: NgbDatagridSurfaceCardComponent, selector: "ngb-datagrid-surface-card" }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }] });
|
|
4159
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { 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: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }, { kind: "component", type: NgbDatagridSurfaceCardComponent, selector: "ngb-datagrid-surface-card" }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3874
4160
|
}
|
|
3875
4161
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFilterMenuPanelComponent, decorators: [{
|
|
3876
4162
|
type: Component,
|
|
@@ -3886,6 +4172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
3886
4172
|
NgbDatagridSurfaceCardComponent,
|
|
3887
4173
|
NgbDatagridFloatingPanelDirective,
|
|
3888
4174
|
],
|
|
4175
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
3889
4176
|
template: `
|
|
3890
4177
|
<div
|
|
3891
4178
|
class="grid-filter-menu-popover ngb-grid__filter-menu-overlay"
|
|
@@ -4120,7 +4407,7 @@ class NgbDatagridRowFilterOperatorPanelComponent {
|
|
|
4120
4407
|
</button>
|
|
4121
4408
|
}
|
|
4122
4409
|
</div>
|
|
4123
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }] });
|
|
4410
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4124
4411
|
}
|
|
4125
4412
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridRowFilterOperatorPanelComponent, decorators: [{
|
|
4126
4413
|
type: Component,
|
|
@@ -4128,6 +4415,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
4128
4415
|
selector: 'ngb-datagrid-row-filter-operator-panel',
|
|
4129
4416
|
standalone: true,
|
|
4130
4417
|
imports: [CommonModule, NgbDatagridFloatingPanelDirective],
|
|
4418
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
4131
4419
|
template: `
|
|
4132
4420
|
<div
|
|
4133
4421
|
class="dropdown-menu show ngb-datagrid-floating-panel grid-filter-operator-menu"
|
|
@@ -4436,7 +4724,7 @@ class NgbDatagridEditingToolbarComponent {
|
|
|
4436
4724
|
</div>
|
|
4437
4725
|
</div>
|
|
4438
4726
|
}
|
|
4439
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }] });
|
|
4727
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4440
4728
|
}
|
|
4441
4729
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridEditingToolbarComponent, decorators: [{
|
|
4442
4730
|
type: Component,
|
|
@@ -4444,6 +4732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
4444
4732
|
selector: 'ngb-datagrid-editing-toolbar',
|
|
4445
4733
|
standalone: true,
|
|
4446
4734
|
imports: [CommonModule, NgbDatagridButtonDirective],
|
|
4735
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
4447
4736
|
template: `
|
|
4448
4737
|
@if (grid.showEditingToolbar()) {
|
|
4449
4738
|
<div class="datagrid-editing-toolbar">
|
|
@@ -4593,7 +4882,7 @@ class NgbDatagridExternalEditorComponent {
|
|
|
4593
4882
|
</div>
|
|
4594
4883
|
</div>
|
|
4595
4884
|
}
|
|
4596
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }] });
|
|
4885
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4597
4886
|
}
|
|
4598
4887
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridExternalEditorComponent, decorators: [{
|
|
4599
4888
|
type: Component,
|
|
@@ -4601,6 +4890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
4601
4890
|
selector: 'ngb-datagrid-external-editor',
|
|
4602
4891
|
standalone: true,
|
|
4603
4892
|
imports: [CommonModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
|
|
4893
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
4604
4894
|
template: `
|
|
4605
4895
|
@if (grid.externalEditOpen) {
|
|
4606
4896
|
<div
|
|
@@ -4739,6 +5029,7 @@ const defaultDndI18n = {
|
|
|
4739
5029
|
listLabel: (n) => n ?? 'List',
|
|
4740
5030
|
pickedUp: () => 'Picked up. Use Arrow keys to move, Enter to drop, Escape to cancel.',
|
|
4741
5031
|
dropped: () => 'Dropped.',
|
|
5032
|
+
canceled: () => 'Canceled.',
|
|
4742
5033
|
moveToIndex: (i, t) => `Moved to position ${i} of ${t}.`,
|
|
4743
5034
|
dropHere: () => 'Drop here',
|
|
4744
5035
|
cannotDropHere: () => 'Cannot drop here'
|
|
@@ -5187,18 +5478,29 @@ class NgbDndListDirective {
|
|
|
5187
5478
|
this.canDrop = false;
|
|
5188
5479
|
return;
|
|
5189
5480
|
}
|
|
5190
|
-
ev.preventDefault();
|
|
5191
|
-
ev.stopPropagation();
|
|
5192
|
-
this.state.setActiveDropList(this);
|
|
5193
5481
|
this.hover = true;
|
|
5194
|
-
|
|
5482
|
+
const idx = this.indexFromPointer(ev);
|
|
5483
|
+
const payload = this._buildGuardPayload(s, idx);
|
|
5484
|
+
const canDropHere = this._allowDrop(payload)
|
|
5485
|
+
&& !this.isDroppingIntoOwnDescendant(s.item, this.list);
|
|
5486
|
+
this.canDrop = canDropHere;
|
|
5487
|
+
this._denied = !canDropHere;
|
|
5195
5488
|
try {
|
|
5196
|
-
if (ev.dataTransfer)
|
|
5197
|
-
ev.dataTransfer.dropEffect = this.dndCloneOnDrop ? 'copy' : 'move';
|
|
5489
|
+
if (ev.dataTransfer) {
|
|
5490
|
+
ev.dataTransfer.dropEffect = canDropHere ? (this.dndCloneOnDrop ? 'copy' : 'move') : 'none';
|
|
5491
|
+
}
|
|
5198
5492
|
}
|
|
5199
5493
|
catch { }
|
|
5494
|
+
if (!canDropHere) {
|
|
5495
|
+
this.removePlaceholder();
|
|
5496
|
+
this.lastIndex = -1;
|
|
5497
|
+
this.state.clearActiveDropList(this);
|
|
5498
|
+
return;
|
|
5499
|
+
}
|
|
5500
|
+
ev.preventDefault();
|
|
5501
|
+
ev.stopPropagation();
|
|
5502
|
+
this.state.setActiveDropList(this);
|
|
5200
5503
|
this.ensurePlaceholder();
|
|
5201
|
-
const idx = this.indexFromPointer(ev);
|
|
5202
5504
|
if (idx !== this.lastIndex) {
|
|
5203
5505
|
this.lastIndex = idx;
|
|
5204
5506
|
this.positionPlaceholderAt(idx);
|
|
@@ -5234,10 +5536,10 @@ class NgbDndListDirective {
|
|
|
5234
5536
|
return;
|
|
5235
5537
|
}
|
|
5236
5538
|
}
|
|
5237
|
-
const
|
|
5238
|
-
if (
|
|
5539
|
+
const handledEvent = ev;
|
|
5540
|
+
if (handledEvent.__ngbHandled)
|
|
5239
5541
|
return;
|
|
5240
|
-
|
|
5542
|
+
handledEvent.__ngbHandled = true;
|
|
5241
5543
|
ev.preventDefault();
|
|
5242
5544
|
this.performDrop(ev);
|
|
5243
5545
|
this.resetVisualState();
|
|
@@ -5253,10 +5555,10 @@ class NgbDndListDirective {
|
|
|
5253
5555
|
this.resetVisualState();
|
|
5254
5556
|
return;
|
|
5255
5557
|
}
|
|
5256
|
-
const
|
|
5257
|
-
if (
|
|
5558
|
+
const handledEvent = ev;
|
|
5559
|
+
if (handledEvent.__ngbHandled)
|
|
5258
5560
|
return;
|
|
5259
|
-
|
|
5561
|
+
handledEvent.__ngbHandled = true;
|
|
5260
5562
|
ev.preventDefault();
|
|
5261
5563
|
ev.stopPropagation();
|
|
5262
5564
|
this.performDrop(ev);
|
|
@@ -5359,17 +5661,20 @@ class NgbDndListDirective {
|
|
|
5359
5661
|
}
|
|
5360
5662
|
isDroppingIntoOwnDescendant(item, targetList) {
|
|
5361
5663
|
const key = this.dndChildrenKey;
|
|
5362
|
-
if (!key || !item)
|
|
5664
|
+
if (!key || !item || typeof item !== 'object')
|
|
5363
5665
|
return false;
|
|
5364
5666
|
const stack = [];
|
|
5365
|
-
|
|
5366
|
-
|
|
5667
|
+
const rootChildren = item[key];
|
|
5668
|
+
if (Array.isArray(rootChildren))
|
|
5669
|
+
stack.push(rootChildren);
|
|
5367
5670
|
while (stack.length) {
|
|
5368
5671
|
const arr = stack.pop();
|
|
5369
5672
|
if (arr === targetList)
|
|
5370
5673
|
return true;
|
|
5371
5674
|
for (const child of arr) {
|
|
5372
|
-
|
|
5675
|
+
if (!child || typeof child !== 'object')
|
|
5676
|
+
continue;
|
|
5677
|
+
const kids = child[key];
|
|
5373
5678
|
if (Array.isArray(kids))
|
|
5374
5679
|
stack.push(kids);
|
|
5375
5680
|
}
|
|
@@ -5383,7 +5688,7 @@ class NgbDndListDirective {
|
|
|
5383
5688
|
_buildGuardPayload(session, dstIndex) {
|
|
5384
5689
|
const srcList = session.fromList ?? [];
|
|
5385
5690
|
const srcIndex = typeof session.fromIndex === 'number' ? session.fromIndex : -1;
|
|
5386
|
-
const dstList = this.list;
|
|
5691
|
+
const dstList = this.list ?? [];
|
|
5387
5692
|
return {
|
|
5388
5693
|
dragItem: session.item,
|
|
5389
5694
|
srcList,
|
|
@@ -5398,11 +5703,7 @@ class NgbDndListDirective {
|
|
|
5398
5703
|
* Uses vertical list heuristics; adjust for horizontal if your list is horizontal.
|
|
5399
5704
|
*/
|
|
5400
5705
|
_computeDropIndex(ev) {
|
|
5401
|
-
const host = this.
|
|
5402
|
-
?? this._el?.nativeElement
|
|
5403
|
-
?? this.el?.nativeElement
|
|
5404
|
-
?? this.elementRef?.nativeElement
|
|
5405
|
-
?? null;
|
|
5706
|
+
const host = this.el.nativeElement;
|
|
5406
5707
|
if (!host)
|
|
5407
5708
|
return this.list?.length ?? 0;
|
|
5408
5709
|
const children = this.draggableChildren();
|
|
@@ -5427,6 +5728,10 @@ class NgbDndListDirective {
|
|
|
5427
5728
|
return false;
|
|
5428
5729
|
}
|
|
5429
5730
|
}
|
|
5731
|
+
emitDropEvent(event) {
|
|
5732
|
+
this.dndDropped.emit(event);
|
|
5733
|
+
this.state.announce?.(this.state.i18n.dropped());
|
|
5734
|
+
}
|
|
5430
5735
|
// Extract your existing onDrop logic into a single method:
|
|
5431
5736
|
performDrop(ev) {
|
|
5432
5737
|
const session = this.getSession(ev);
|
|
@@ -5439,19 +5744,25 @@ class NgbDndListDirective {
|
|
|
5439
5744
|
ev.preventDefault();
|
|
5440
5745
|
ev.stopPropagation();
|
|
5441
5746
|
this._denied = true; // cosmetic: adds .ngb-dnd-denied for styling
|
|
5747
|
+
this.canDrop = false;
|
|
5748
|
+
this.state.announce?.(this.state.i18n.cannotDropHere());
|
|
5749
|
+
this.removePlaceholder();
|
|
5750
|
+
this.lastIndex = -1;
|
|
5442
5751
|
return; // ⛔ do not mutate arrays
|
|
5443
5752
|
}
|
|
5444
5753
|
this._denied = false;
|
|
5445
5754
|
// ❗ block cycles: don't allow dropping an item into its own descendants
|
|
5446
5755
|
if (this.isDroppingIntoOwnDescendant(session.item, this.list)) {
|
|
5447
5756
|
// optional: visual/aural feedback
|
|
5757
|
+
this._denied = true;
|
|
5758
|
+
this.canDrop = false;
|
|
5448
5759
|
this.state.announce?.(this.state.i18n.cannotDropHere());
|
|
5449
5760
|
this.removePlaceholder();
|
|
5450
5761
|
this.lastIndex = -1;
|
|
5451
5762
|
return;
|
|
5452
5763
|
}
|
|
5453
5764
|
const targetIndex = this.lastIndex < 0 ? this.list.length : this.lastIndex;
|
|
5454
|
-
const fromList = session.fromList
|
|
5765
|
+
const fromList = session.fromList;
|
|
5455
5766
|
const fromIndex = session.fromIndex ?? -1;
|
|
5456
5767
|
const sameList = fromList === this.list;
|
|
5457
5768
|
const isExternal = session.fromIsPalette === true || !fromList || fromIndex === -1;
|
|
@@ -5472,7 +5783,7 @@ class NgbDndListDirective {
|
|
|
5472
5783
|
this.list.splice(insertAt, 0, itemToInsert);
|
|
5473
5784
|
this.removePlaceholder();
|
|
5474
5785
|
this.lastIndex = -1;
|
|
5475
|
-
this.
|
|
5786
|
+
this.emitDropEvent({
|
|
5476
5787
|
item: itemToInsert,
|
|
5477
5788
|
fromIndex,
|
|
5478
5789
|
toIndex: insertAt,
|
|
@@ -5480,7 +5791,6 @@ class NgbDndListDirective {
|
|
|
5480
5791
|
toList: this.list,
|
|
5481
5792
|
sameList
|
|
5482
5793
|
});
|
|
5483
|
-
this.state.announce?.(this.state.i18n.dropped());
|
|
5484
5794
|
}
|
|
5485
5795
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
5486
5796
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDndListDirective, isStandalone: true, selector: "[ngbDndList]", inputs: { dndChildrenKey: "dndChildrenKey", list: ["ngbDndList", "list"], dndGroup: "dndGroup", dndDisabled: "dndDisabled", dndCloneOnDrop: "dndCloneOnDrop", dndCloneFn: "dndCloneFn", dndIsPalette: "dndIsPalette", dndCanDrop: "dndCanDrop", dndAriaLabel: "dndAriaLabel" }, outputs: { dndDropped: "dndDropped" }, host: { listeners: { "dragenter": "onDragEnter($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "document:drop": "onDocumentDrop($event)", "drop": "onDrop($event)", "document:dragend": "onDocumentDragFinished()", "document:dragcancel": "onDocumentDragFinished()" }, properties: { "class.ngb-dnd-denied": "this.denied", "attr.aria-label": "this.ariaLabel", "attr.role": "this.role", "class.ngb-dnd-list": "this.hostClass", "class.ngb-dnd-over": "this.isOver", "attr.data-drop-valid": "this.dataDropValid" } }, ngImport: i0 });
|
|
@@ -5578,75 +5888,134 @@ class NgbDndItemDirective {
|
|
|
5578
5888
|
role = 'listitem';
|
|
5579
5889
|
tabIndex = 0; // keyboard focusable
|
|
5580
5890
|
sessionId = null;
|
|
5581
|
-
|
|
5582
|
-
|
|
5583
|
-
|
|
5584
|
-
|
|
5585
|
-
|
|
5891
|
+
keyboardDragState = null;
|
|
5892
|
+
sourceList() {
|
|
5893
|
+
return this.dndSourceList ?? this.parentList?.list;
|
|
5894
|
+
}
|
|
5895
|
+
resolveIndex(list) {
|
|
5896
|
+
if (typeof this.dndIndex === 'number')
|
|
5897
|
+
return this.dndIndex;
|
|
5898
|
+
return list ? list.indexOf(this.item) : -1;
|
|
5899
|
+
}
|
|
5900
|
+
beginDragSession(dataTransfer) {
|
|
5586
5901
|
if (this.dndDisabled || this.item == null) {
|
|
5587
|
-
|
|
5588
|
-
return;
|
|
5902
|
+
return false;
|
|
5589
5903
|
}
|
|
5590
5904
|
this.sessionId = this.state.createSession({
|
|
5591
5905
|
item: this.item,
|
|
5592
5906
|
group: this.dndGroup ?? this.parentList?.dndGroup,
|
|
5593
|
-
fromList: this.
|
|
5594
|
-
fromIndex: this.
|
|
5907
|
+
fromList: this.sourceList(),
|
|
5908
|
+
fromIndex: this.resolveIndex(this.sourceList()),
|
|
5595
5909
|
fromListRef: this.parentList,
|
|
5596
5910
|
fromIsPalette: this.parentList?.dndIsPalette === true
|
|
5597
5911
|
});
|
|
5598
|
-
|
|
5599
|
-
|
|
5600
|
-
|
|
5601
|
-
|
|
5602
|
-
|
|
5603
|
-
|
|
5912
|
+
if (dataTransfer) {
|
|
5913
|
+
dataTransfer.setData('text/ngb-dnd', this.sessionId);
|
|
5914
|
+
dataTransfer.setData('text/plain', 'ngb');
|
|
5915
|
+
dataTransfer.effectAllowed = 'copyMove';
|
|
5916
|
+
dataTransfer.setDragImage(this.el.nativeElement, 16, 16);
|
|
5917
|
+
}
|
|
5604
5918
|
this.dragging = true;
|
|
5605
5919
|
this.dndDragStart.emit(this.item);
|
|
5920
|
+
this.state.announce?.(this.state.i18n.pickedUp());
|
|
5921
|
+
return true;
|
|
5606
5922
|
}
|
|
5607
|
-
|
|
5923
|
+
endDragSession() {
|
|
5608
5924
|
this.dragging = false;
|
|
5609
5925
|
this.state.clear(this.sessionId);
|
|
5610
5926
|
this.sessionId = null;
|
|
5927
|
+
this.keyboardDragState = null;
|
|
5611
5928
|
this.dndDragEnd.emit();
|
|
5612
5929
|
}
|
|
5930
|
+
onDragStart(ev) {
|
|
5931
|
+
const eventWithFlag = ev;
|
|
5932
|
+
if (eventWithFlag.__ngbDndItemStarted)
|
|
5933
|
+
return;
|
|
5934
|
+
eventWithFlag.__ngbDndItemStarted = true;
|
|
5935
|
+
if (!this.beginDragSession(ev.dataTransfer)) {
|
|
5936
|
+
ev.preventDefault();
|
|
5937
|
+
}
|
|
5938
|
+
}
|
|
5939
|
+
onDragEnd() {
|
|
5940
|
+
this.endDragSession();
|
|
5941
|
+
}
|
|
5942
|
+
moveWithinKeyboardList(offset) {
|
|
5943
|
+
const keyboardDragState = this.keyboardDragState;
|
|
5944
|
+
if (!keyboardDragState)
|
|
5945
|
+
return;
|
|
5946
|
+
const list = keyboardDragState.list;
|
|
5947
|
+
const from = keyboardDragState.currentIndex;
|
|
5948
|
+
let to = from + offset;
|
|
5949
|
+
to = Math.max(0, Math.min(list.length - 1, to));
|
|
5950
|
+
if (to === from)
|
|
5951
|
+
return;
|
|
5952
|
+
const [movedItem] = list.splice(from, 1);
|
|
5953
|
+
list.splice(to, 0, movedItem);
|
|
5954
|
+
keyboardDragState.currentIndex = to;
|
|
5955
|
+
this.dndIndex = to;
|
|
5956
|
+
this.state.announce?.(this.state.i18n.moveToIndex(to + 1, list.length));
|
|
5957
|
+
}
|
|
5958
|
+
emitKeyboardDrop() {
|
|
5959
|
+
const keyboardDragState = this.keyboardDragState;
|
|
5960
|
+
if (!keyboardDragState || !this.parentList)
|
|
5961
|
+
return;
|
|
5962
|
+
const event = {
|
|
5963
|
+
item: this.item,
|
|
5964
|
+
fromIndex: keyboardDragState.originalIndex,
|
|
5965
|
+
toIndex: keyboardDragState.currentIndex,
|
|
5966
|
+
fromList: keyboardDragState.list,
|
|
5967
|
+
toList: keyboardDragState.list,
|
|
5968
|
+
sameList: true,
|
|
5969
|
+
};
|
|
5970
|
+
this.parentList.emitDropEvent(event);
|
|
5971
|
+
}
|
|
5972
|
+
cancelKeyboardDrag() {
|
|
5973
|
+
const keyboardDragState = this.keyboardDragState;
|
|
5974
|
+
if (!keyboardDragState)
|
|
5975
|
+
return;
|
|
5976
|
+
if (keyboardDragState.currentIndex !== keyboardDragState.originalIndex) {
|
|
5977
|
+
const [movedItem] = keyboardDragState.list.splice(keyboardDragState.currentIndex, 1);
|
|
5978
|
+
keyboardDragState.list.splice(keyboardDragState.originalIndex, 0, movedItem);
|
|
5979
|
+
this.dndIndex = keyboardDragState.originalIndex;
|
|
5980
|
+
}
|
|
5981
|
+
this.state.announce?.(this.state.i18n.canceled?.() ?? 'Canceled.');
|
|
5982
|
+
}
|
|
5613
5983
|
onKeydown(ev) {
|
|
5614
5984
|
if (this.dndDisabled)
|
|
5615
5985
|
return;
|
|
5616
5986
|
// start dragging (keyboard mode)
|
|
5617
5987
|
if (ev.code === 'Space' && !this.dragging) {
|
|
5618
5988
|
ev.preventDefault();
|
|
5619
|
-
this.
|
|
5989
|
+
const list = this.sourceList();
|
|
5990
|
+
const index = this.resolveIndex(list);
|
|
5991
|
+
if (!list || index < 0)
|
|
5992
|
+
return;
|
|
5993
|
+
this.keyboardDragState = {
|
|
5994
|
+
list,
|
|
5995
|
+
originalIndex: index,
|
|
5996
|
+
currentIndex: index,
|
|
5997
|
+
};
|
|
5998
|
+
this.beginDragSession();
|
|
5620
5999
|
return;
|
|
5621
6000
|
}
|
|
5622
6001
|
if (!this.dragging)
|
|
5623
6002
|
return;
|
|
5624
|
-
// move within same list
|
|
5625
|
-
const parent = this.parentList;
|
|
5626
|
-
if (!parent || typeof this.dndIndex !== 'number')
|
|
5627
|
-
return;
|
|
5628
6003
|
if (ev.code === 'ArrowUp' || ev.code === 'ArrowDown') {
|
|
5629
6004
|
ev.preventDefault();
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
let to = ev.code === 'ArrowUp' ? from - 1 : from + 1;
|
|
5633
|
-
to = Math.max(0, Math.min(list.length - 1, to));
|
|
5634
|
-
if (to !== from) {
|
|
5635
|
-
const [it] = list.splice(from, 1);
|
|
5636
|
-
list.splice(to, 0, it);
|
|
5637
|
-
this.dndIndex = to;
|
|
5638
|
-
// announce (see live region below)
|
|
5639
|
-
this.state.announce?.(this.state.i18n.moveToIndex(to + 1, list.length));
|
|
5640
|
-
}
|
|
6005
|
+
this.moveWithinKeyboardList(ev.code === 'ArrowUp' ? -1 : 1);
|
|
6006
|
+
return;
|
|
5641
6007
|
}
|
|
5642
6008
|
if (ev.code === 'Enter') {
|
|
5643
6009
|
ev.preventDefault();
|
|
5644
|
-
this.
|
|
5645
|
-
|
|
6010
|
+
this.emitKeyboardDrop();
|
|
6011
|
+
this.endDragSession();
|
|
6012
|
+
return;
|
|
6013
|
+
}
|
|
5646
6014
|
if (ev.code === 'Escape') {
|
|
5647
6015
|
ev.preventDefault();
|
|
5648
|
-
this.
|
|
5649
|
-
|
|
6016
|
+
this.cancelKeyboardDrag();
|
|
6017
|
+
this.endDragSession();
|
|
6018
|
+
}
|
|
5650
6019
|
}
|
|
5651
6020
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndItemDirective, deps: [{ token: NgbDndListDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
5652
6021
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDndItemDirective, isStandalone: true, selector: "[ngbDndItem]", inputs: { item: ["ngbDndItem", "item"], dndGroup: "dndGroup", dndIndex: "dndIndex", dndSourceList: "dndSourceList", dndDisabled: "dndDisabled" }, outputs: { dndDragStart: "dndDragStart", dndDragEnd: "dndDragEnd" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd()", "keydown": "onKeydown($event)" }, properties: { "attr.draggable": "this.draggable", "class.ngb-dnd-item": "this.hostClass", "class.ngb-dnd-dragging": "this.dragging", "attr.aria-grabbed": "this.ariaGrabbed", "attr.role": "this.role", "attr.tabindex": "this.tabIndex" } }, ngImport: i0 });
|
|
@@ -5793,6 +6162,7 @@ const isReasonableEmail = (value) => {
|
|
|
5793
6162
|
class Datagrid {
|
|
5794
6163
|
/** Column definitions to render */
|
|
5795
6164
|
_columns = [];
|
|
6165
|
+
renderTick = 0;
|
|
5796
6166
|
get columns() {
|
|
5797
6167
|
return this._columns;
|
|
5798
6168
|
}
|
|
@@ -5883,7 +6253,15 @@ class Datagrid {
|
|
|
5883
6253
|
this.syncLegacyFilters(this.localFilter);
|
|
5884
6254
|
this.invalidateFilteredCaches();
|
|
5885
6255
|
}
|
|
5886
|
-
|
|
6256
|
+
_filterOperators;
|
|
6257
|
+
get filterOperators() {
|
|
6258
|
+
return this._filterOperators;
|
|
6259
|
+
}
|
|
6260
|
+
set filterOperators(value) {
|
|
6261
|
+
this._filterOperators = value;
|
|
6262
|
+
this.filterOperatorsCache.clear();
|
|
6263
|
+
this.markGridForCheck();
|
|
6264
|
+
}
|
|
5887
6265
|
filterManual = false;
|
|
5888
6266
|
externalFiltering = false;
|
|
5889
6267
|
/** Opts local arrays into the reusable DataGrid operation helper for filter/sort/page processing. */
|
|
@@ -5895,6 +6273,34 @@ class Datagrid {
|
|
|
5895
6273
|
this._dataOperations = value ?? false;
|
|
5896
6274
|
this.invalidatePagedCache();
|
|
5897
6275
|
}
|
|
6276
|
+
_groupable = false;
|
|
6277
|
+
get groupable() {
|
|
6278
|
+
return this._groupable;
|
|
6279
|
+
}
|
|
6280
|
+
set groupable(value) {
|
|
6281
|
+
this._groupable = value ?? false;
|
|
6282
|
+
this.invalidatePagedCache();
|
|
6283
|
+
this.markGridForCheck();
|
|
6284
|
+
}
|
|
6285
|
+
_group = [];
|
|
6286
|
+
get group() {
|
|
6287
|
+
return this._group;
|
|
6288
|
+
}
|
|
6289
|
+
set group(value) {
|
|
6290
|
+
this._group = this.normalizeGroupDescriptors(value);
|
|
6291
|
+
this.syncCollapsedGroups();
|
|
6292
|
+
this.invalidatePagedCache();
|
|
6293
|
+
this.markGridForCheck();
|
|
6294
|
+
}
|
|
6295
|
+
_groupedData = null;
|
|
6296
|
+
get groupedData() {
|
|
6297
|
+
return this._groupedData;
|
|
6298
|
+
}
|
|
6299
|
+
set groupedData(value) {
|
|
6300
|
+
this._groupedData = value ? this.cloneGroupResults(value) : null;
|
|
6301
|
+
this.invalidatePagedCache();
|
|
6302
|
+
this.markGridForCheck();
|
|
6303
|
+
}
|
|
5898
6304
|
/**
|
|
5899
6305
|
* Optional controlled data-operation state. When provided, the grid syncs page, pageSize,
|
|
5900
6306
|
* sort, filter, and global filter from this object.
|
|
@@ -5966,6 +6372,8 @@ class Datagrid {
|
|
|
5966
6372
|
}
|
|
5967
6373
|
set tableOptions(value) {
|
|
5968
6374
|
this._tableOptions = value ?? {};
|
|
6375
|
+
this.tableClassListCache = null;
|
|
6376
|
+
this.responsiveWrapperClassesCache = null;
|
|
5969
6377
|
this.invalidatePagedCache();
|
|
5970
6378
|
}
|
|
5971
6379
|
/**
|
|
@@ -6002,10 +6410,26 @@ class Datagrid {
|
|
|
6002
6410
|
globalFilterAriaLabel = 'Search all columns';
|
|
6003
6411
|
/** Placeholder for the built-in global search input. */
|
|
6004
6412
|
globalFilterPlaceholder = 'Search all columns';
|
|
6413
|
+
_searchHighlightTerm = '';
|
|
6005
6414
|
/** When set, matching substrings in visible cells are wrapped with `.grid-search-highlight`. */
|
|
6006
|
-
searchHighlightTerm
|
|
6415
|
+
get searchHighlightTerm() {
|
|
6416
|
+
return this._searchHighlightTerm;
|
|
6417
|
+
}
|
|
6418
|
+
set searchHighlightTerm(value) {
|
|
6419
|
+
this._searchHighlightTerm = value ?? '';
|
|
6420
|
+
this.searchHighlightCache.clear();
|
|
6421
|
+
this.markGridForCheck();
|
|
6422
|
+
}
|
|
6423
|
+
_searchHighlightFields = null;
|
|
6007
6424
|
/** Column fields included in search highlighting; all visible columns when empty. */
|
|
6008
|
-
searchHighlightFields
|
|
6425
|
+
get searchHighlightFields() {
|
|
6426
|
+
return this._searchHighlightFields;
|
|
6427
|
+
}
|
|
6428
|
+
set searchHighlightFields(value) {
|
|
6429
|
+
this._searchHighlightFields = value ?? null;
|
|
6430
|
+
this.searchHighlightCache.clear();
|
|
6431
|
+
this.markGridForCheck();
|
|
6432
|
+
}
|
|
6009
6433
|
/** Accessible label announced when expanding a row. */
|
|
6010
6434
|
expandRowAriaLabel = 'Expand row';
|
|
6011
6435
|
/** Accessible label announced when collapsing a row. */
|
|
@@ -6043,7 +6467,16 @@ class Datagrid {
|
|
|
6043
6467
|
}
|
|
6044
6468
|
theme = 'bootstrap';
|
|
6045
6469
|
responsive = false;
|
|
6046
|
-
|
|
6470
|
+
_trackBy;
|
|
6471
|
+
get trackBy() {
|
|
6472
|
+
return this._trackBy;
|
|
6473
|
+
}
|
|
6474
|
+
set trackBy(value) {
|
|
6475
|
+
this._trackBy = value;
|
|
6476
|
+
this.invalidateRowIdentityCache();
|
|
6477
|
+
this.invalidateSortedCaches();
|
|
6478
|
+
this.markGridForCheck();
|
|
6479
|
+
}
|
|
6047
6480
|
rowClass;
|
|
6048
6481
|
rowStyle;
|
|
6049
6482
|
rowReorderable = false;
|
|
@@ -6100,6 +6533,7 @@ class Datagrid {
|
|
|
6100
6533
|
rowSave = new EventEmitter();
|
|
6101
6534
|
rowCancel = new EventEmitter();
|
|
6102
6535
|
rowDelete = new EventEmitter();
|
|
6536
|
+
groupChange = new EventEmitter();
|
|
6103
6537
|
sortChange = new EventEmitter();
|
|
6104
6538
|
filterChange = new EventEmitter();
|
|
6105
6539
|
filtersChange = new EventEmitter();
|
|
@@ -6110,6 +6544,7 @@ class Datagrid {
|
|
|
6110
6544
|
columnReorder = new EventEmitter();
|
|
6111
6545
|
rowDetailTpl;
|
|
6112
6546
|
pagerTpl;
|
|
6547
|
+
groupHeaderTpl;
|
|
6113
6548
|
exporter = inject(NgbExportService); // instead of constructor(private exporter: NgbExportService) {}
|
|
6114
6549
|
expanded = new Set();
|
|
6115
6550
|
fb = inject(FormBuilder);
|
|
@@ -6211,24 +6646,77 @@ class Datagrid {
|
|
|
6211
6646
|
filteredCache = [];
|
|
6212
6647
|
sortedCache = [];
|
|
6213
6648
|
pagedCache = [];
|
|
6649
|
+
renderRowsCache = [];
|
|
6650
|
+
stickyGroupHeaderRows = [];
|
|
6651
|
+
stickyGroupFooterRows = [];
|
|
6652
|
+
stickyGroupOverlayColumnWidths = [];
|
|
6653
|
+
stickyGroupHeaderTranslateY = 0;
|
|
6654
|
+
stickyGroupFooterTranslateY = 0;
|
|
6214
6655
|
resolvedColumnsDirty = true;
|
|
6215
6656
|
visibleColumnsDirty = true;
|
|
6216
6657
|
filteredDirty = true;
|
|
6217
6658
|
sortedDirty = true;
|
|
6218
6659
|
pagedDirty = true;
|
|
6219
|
-
|
|
6220
|
-
|
|
6660
|
+
renderRowsDirty = true;
|
|
6661
|
+
stickyGroupSyncQueued = false;
|
|
6662
|
+
rowMetaMap = new Map();
|
|
6663
|
+
rowMetaSource = null;
|
|
6664
|
+
rowMetaTrackBy;
|
|
6665
|
+
filterOperatorsCache = new Map();
|
|
6666
|
+
searchHighlightCache = new Map();
|
|
6667
|
+
multiCheckboxOptionsCache = new Map();
|
|
6668
|
+
multiCheckboxVisibleOptionsCache = new Map();
|
|
6669
|
+
stackedColumnsCache = new Map();
|
|
6670
|
+
stackedCardGroupsCache = null;
|
|
6671
|
+
tableClassListCache = null;
|
|
6672
|
+
responsiveWrapperClassesCache = null;
|
|
6673
|
+
collapsedGroupKeys = new Set();
|
|
6674
|
+
groupRenderRowLookup = new Map();
|
|
6675
|
+
groupFooterRenderRowLookup = new Map();
|
|
6676
|
+
groupDragField = null;
|
|
6677
|
+
groupPanelDragActive = false;
|
|
6678
|
+
groupPanelDragDenied = false;
|
|
6221
6679
|
norm(v) {
|
|
6222
6680
|
return (v ?? '').toString().toLowerCase().trim();
|
|
6223
6681
|
}
|
|
6224
6682
|
keyOf(col) {
|
|
6225
6683
|
return col.field;
|
|
6226
6684
|
}
|
|
6685
|
+
readFieldValue(row, field) {
|
|
6686
|
+
return typeof row === 'object' && row !== null ? row[field] : undefined;
|
|
6687
|
+
}
|
|
6227
6688
|
getDefaults() {
|
|
6228
6689
|
return typeof this.newRowDefaults === 'function'
|
|
6229
6690
|
? this.newRowDefaults() ?? {}
|
|
6230
6691
|
: this.newRowDefaults ?? {};
|
|
6231
6692
|
}
|
|
6693
|
+
toDraftValues(row) {
|
|
6694
|
+
return typeof row === 'object' && row !== null ? row : {};
|
|
6695
|
+
}
|
|
6696
|
+
formDraftValues(form) {
|
|
6697
|
+
return this.toDraftValues(form.getRawValue());
|
|
6698
|
+
}
|
|
6699
|
+
assignDraftValues(row, values) {
|
|
6700
|
+
return this.getEditService().assignValues(row, values);
|
|
6701
|
+
}
|
|
6702
|
+
patchFieldValue(field, value) {
|
|
6703
|
+
return { [field]: value };
|
|
6704
|
+
}
|
|
6705
|
+
compareSortValues(left, right) {
|
|
6706
|
+
if (typeof left === 'string' && typeof right === 'string') {
|
|
6707
|
+
return left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' });
|
|
6708
|
+
}
|
|
6709
|
+
if (left === right)
|
|
6710
|
+
return 0;
|
|
6711
|
+
return left != null && right != null && left < right ? -1 : 1;
|
|
6712
|
+
}
|
|
6713
|
+
readModifierKeys(event) {
|
|
6714
|
+
const modifierEvent = event;
|
|
6715
|
+
return {
|
|
6716
|
+
shift: !!modifierEvent?.shiftKey,
|
|
6717
|
+
meta: !!(modifierEvent?.metaKey || modifierEvent?.ctrlKey),
|
|
6718
|
+
};
|
|
6719
|
+
}
|
|
6232
6720
|
defaultFor(col) {
|
|
6233
6721
|
const d = this.getDefaults();
|
|
6234
6722
|
const key = col.field;
|
|
@@ -6341,6 +6829,12 @@ class Datagrid {
|
|
|
6341
6829
|
invalidateColumnCaches() {
|
|
6342
6830
|
this.resolvedColumnsDirty = true;
|
|
6343
6831
|
this.visibleColumnsDirty = true;
|
|
6832
|
+
this.filterOperatorsCache.clear();
|
|
6833
|
+
this.stackedColumnsCache.clear();
|
|
6834
|
+
this.stackedCardGroupsCache = null;
|
|
6835
|
+
this.multiCheckboxOptionsCache.clear();
|
|
6836
|
+
this.multiCheckboxVisibleOptionsCache.clear();
|
|
6837
|
+
this.searchHighlightCache.clear();
|
|
6344
6838
|
this.invalidateFilteredCaches();
|
|
6345
6839
|
}
|
|
6346
6840
|
invalidateFilteredCaches() {
|
|
@@ -6353,24 +6847,63 @@ class Datagrid {
|
|
|
6353
6847
|
}
|
|
6354
6848
|
invalidatePagedCache() {
|
|
6355
6849
|
this.pagedDirty = true;
|
|
6850
|
+
this.renderRowsDirty = true;
|
|
6851
|
+
this.scheduleStickyGroupSync();
|
|
6852
|
+
}
|
|
6853
|
+
invalidateRowIdentityCache() {
|
|
6854
|
+
this.rowMetaSource = null;
|
|
6855
|
+
this.rowMetaTrackBy = undefined;
|
|
6356
6856
|
}
|
|
6357
6857
|
invalidateDataCaches() {
|
|
6358
|
-
this.
|
|
6858
|
+
this.invalidateRowIdentityCache();
|
|
6859
|
+
this.multiCheckboxOptionsCache.clear();
|
|
6860
|
+
this.multiCheckboxVisibleOptionsCache.clear();
|
|
6861
|
+
this.searchHighlightCache.clear();
|
|
6359
6862
|
this.invalidateFilteredCaches();
|
|
6360
6863
|
}
|
|
6361
6864
|
markGridForCheck() {
|
|
6362
6865
|
this.cdr?.markForCheck();
|
|
6363
6866
|
}
|
|
6364
|
-
|
|
6365
|
-
|
|
6867
|
+
// Some library interactions update internal state without changing an input reference.
|
|
6868
|
+
// Schedule a follow-up render so zoneless hosts and child row/header views stay in sync.
|
|
6869
|
+
scheduleViewRefresh(afterRefresh) {
|
|
6870
|
+
this.renderTick++;
|
|
6871
|
+
this.cdr.markForCheck();
|
|
6872
|
+
Promise.resolve().then(() => {
|
|
6873
|
+
try {
|
|
6874
|
+
this.cdr.detectChanges();
|
|
6875
|
+
afterRefresh?.();
|
|
6876
|
+
}
|
|
6877
|
+
catch {
|
|
6878
|
+
// The view can be destroyed before the queued refresh runs.
|
|
6879
|
+
}
|
|
6880
|
+
});
|
|
6881
|
+
}
|
|
6882
|
+
ensureRowMetaMap() {
|
|
6883
|
+
if (this.rowMetaSource === this.data && this.rowMetaTrackBy === this.trackBy)
|
|
6366
6884
|
return;
|
|
6367
|
-
this.
|
|
6368
|
-
(this.data ?? []).forEach((row, index) =>
|
|
6369
|
-
|
|
6885
|
+
this.rowMetaMap.clear();
|
|
6886
|
+
(this.data ?? []).forEach((row, index) => {
|
|
6887
|
+
this.rowMetaMap.set(row, {
|
|
6888
|
+
index,
|
|
6889
|
+
id: this.trackBy ? this.trackBy(index, row) : index,
|
|
6890
|
+
});
|
|
6891
|
+
});
|
|
6892
|
+
this.rowMetaSource = this.data;
|
|
6893
|
+
this.rowMetaTrackBy = this.trackBy;
|
|
6894
|
+
}
|
|
6895
|
+
resolveRowMeta(row, fallbackIndex = -1) {
|
|
6896
|
+
this.ensureRowMetaMap();
|
|
6897
|
+
const cached = this.rowMetaMap.get(row);
|
|
6898
|
+
if (cached)
|
|
6899
|
+
return cached;
|
|
6900
|
+
return {
|
|
6901
|
+
index: fallbackIndex,
|
|
6902
|
+
id: this.trackBy ? this.trackBy(fallbackIndex, row) : fallbackIndex,
|
|
6903
|
+
};
|
|
6370
6904
|
}
|
|
6371
6905
|
dataIndexOf(row, fallback = -1) {
|
|
6372
|
-
this.
|
|
6373
|
-
return this.rowIndexMap.get(row) ?? fallback;
|
|
6906
|
+
return this.resolveRowMeta(row, fallback).index;
|
|
6374
6907
|
}
|
|
6375
6908
|
syncColumnOrder(resetFromColumns) {
|
|
6376
6909
|
const visible = this.resolvedColumns.filter((col) => !col.hidden);
|
|
@@ -6387,6 +6920,185 @@ class Datagrid {
|
|
|
6387
6920
|
}
|
|
6388
6921
|
this.columnOrder = next;
|
|
6389
6922
|
}
|
|
6923
|
+
isGroupingEnabled() {
|
|
6924
|
+
return this.groupable !== false;
|
|
6925
|
+
}
|
|
6926
|
+
isGroupingActive() {
|
|
6927
|
+
return this.isGroupingEnabled() && this.group.length > 0;
|
|
6928
|
+
}
|
|
6929
|
+
isColumnGroupable(col) {
|
|
6930
|
+
return this.isGroupingEnabled() && !col.hidden;
|
|
6931
|
+
}
|
|
6932
|
+
isFieldGrouped(field) {
|
|
6933
|
+
return this.group.some((descriptor) => descriptor.field === field);
|
|
6934
|
+
}
|
|
6935
|
+
groupedColumns() {
|
|
6936
|
+
return this.group;
|
|
6937
|
+
}
|
|
6938
|
+
groupingSettings() {
|
|
6939
|
+
return typeof this.groupable === 'object' && this.groupable !== null ? this.groupable : {};
|
|
6940
|
+
}
|
|
6941
|
+
showGroupFooters() {
|
|
6942
|
+
return this.isGroupingActive() && this.groupingSettings().showFooter === true;
|
|
6943
|
+
}
|
|
6944
|
+
showStickyGroupHeaders() {
|
|
6945
|
+
return this.isGroupingActive() && this.groupingSettings().stickyHeaders === true;
|
|
6946
|
+
}
|
|
6947
|
+
showStickyGroupFooters() {
|
|
6948
|
+
return this.showGroupFooters() && this.groupingSettings().stickyFooters === true;
|
|
6949
|
+
}
|
|
6950
|
+
hasStickyGroupHeaders() {
|
|
6951
|
+
return this.showStickyGroupHeaders() && this.stickyGroupHeaderRows.length > 0;
|
|
6952
|
+
}
|
|
6953
|
+
hasStickyGroupFooters() {
|
|
6954
|
+
return this.showStickyGroupFooters() && this.stickyGroupFooterRows.length > 0;
|
|
6955
|
+
}
|
|
6956
|
+
groupColumnHeader(field) {
|
|
6957
|
+
const column = this.resolvedColumns.find((item) => item.field === field);
|
|
6958
|
+
return column?.header ?? field;
|
|
6959
|
+
}
|
|
6960
|
+
groupHandleAriaLabel(col) {
|
|
6961
|
+
const header = this.groupColumnHeader(col.field);
|
|
6962
|
+
return this.isFieldGrouped(col.field)
|
|
6963
|
+
? `Grouped by ${header}. Press Enter to remove it from grouping.`
|
|
6964
|
+
: `Add ${header} to grouping. Drag into the group panel or press Enter.`;
|
|
6965
|
+
}
|
|
6966
|
+
groupDirectionAriaLabel(descriptor) {
|
|
6967
|
+
return `Toggle ${this.groupColumnHeader(descriptor.field)} group direction. Currently ${descriptor.dir === 'desc' ? 'descending' : 'ascending'}.`;
|
|
6968
|
+
}
|
|
6969
|
+
groupRemoveAriaLabel(descriptor) {
|
|
6970
|
+
return `Remove ${this.groupColumnHeader(descriptor.field)} grouping`;
|
|
6971
|
+
}
|
|
6972
|
+
groupPanelLabel() {
|
|
6973
|
+
return this.group.length
|
|
6974
|
+
? 'Grouped by'
|
|
6975
|
+
: 'Drag column headers here to group rows';
|
|
6976
|
+
}
|
|
6977
|
+
groupFieldLabel(descriptor) {
|
|
6978
|
+
return this.groupColumnHeader(descriptor.field);
|
|
6979
|
+
}
|
|
6980
|
+
groupDirectionLabel(descriptor) {
|
|
6981
|
+
return descriptor.dir === 'desc' ? 'Descending' : 'Ascending';
|
|
6982
|
+
}
|
|
6983
|
+
toggleGroupField(field) {
|
|
6984
|
+
if (!field)
|
|
6985
|
+
return;
|
|
6986
|
+
if (this.isFieldGrouped(field)) {
|
|
6987
|
+
this.removeGroupField(field);
|
|
6988
|
+
return;
|
|
6989
|
+
}
|
|
6990
|
+
this.addGroupField(field);
|
|
6991
|
+
}
|
|
6992
|
+
addGroupField(field, dir = 'asc', emit = true) {
|
|
6993
|
+
if (!field || this.isFieldGrouped(field))
|
|
6994
|
+
return;
|
|
6995
|
+
this.setGroupDescriptors([...this.group, { field, dir }], emit);
|
|
6996
|
+
}
|
|
6997
|
+
removeGroupField(field, emit = true) {
|
|
6998
|
+
if (!field)
|
|
6999
|
+
return;
|
|
7000
|
+
this.setGroupDescriptors(this.group.filter((descriptor) => descriptor.field !== field), emit);
|
|
7001
|
+
}
|
|
7002
|
+
toggleGroupDirection(field) {
|
|
7003
|
+
this.setGroupDescriptors(this.group.map((descriptor) => descriptor.field === field
|
|
7004
|
+
? { ...descriptor, dir: descriptor.dir === 'desc' ? 'asc' : 'desc' }
|
|
7005
|
+
: descriptor), true);
|
|
7006
|
+
}
|
|
7007
|
+
setGroupDescriptors(descriptors, emit = true) {
|
|
7008
|
+
const normalized = this.normalizeGroupDescriptors(descriptors);
|
|
7009
|
+
const changed = normalized.length !== this.group.length ||
|
|
7010
|
+
normalized.some((descriptor, index) => descriptor.field !== this.group[index]?.field || descriptor.dir !== this.group[index]?.dir);
|
|
7011
|
+
if (!changed) {
|
|
7012
|
+
this.clearGroupDragState();
|
|
7013
|
+
return;
|
|
7014
|
+
}
|
|
7015
|
+
this._group = normalized;
|
|
7016
|
+
this.page = 1;
|
|
7017
|
+
this.syncCollapsedGroups();
|
|
7018
|
+
this.invalidatePagedCache();
|
|
7019
|
+
if (emit) {
|
|
7020
|
+
this.groupChange.emit({ group: [...this.group] });
|
|
7021
|
+
this.emitDataStateChange();
|
|
7022
|
+
}
|
|
7023
|
+
this.clearGroupDragState();
|
|
7024
|
+
this.cdr.markForCheck();
|
|
7025
|
+
}
|
|
7026
|
+
normalizeGroupDescriptors(descriptors) {
|
|
7027
|
+
const seen = new Set();
|
|
7028
|
+
const normalized = [];
|
|
7029
|
+
for (const descriptor of descriptors ?? []) {
|
|
7030
|
+
const field = String(descriptor?.field ?? '').trim();
|
|
7031
|
+
if (!field || seen.has(field))
|
|
7032
|
+
continue;
|
|
7033
|
+
seen.add(field);
|
|
7034
|
+
normalized.push({
|
|
7035
|
+
field,
|
|
7036
|
+
dir: descriptor.dir === 'desc' ? 'desc' : 'asc',
|
|
7037
|
+
...(descriptor.aggregates?.length ? { aggregates: this.cloneAggregateDescriptors(descriptor.aggregates) } : {}),
|
|
7038
|
+
});
|
|
7039
|
+
}
|
|
7040
|
+
return normalized;
|
|
7041
|
+
}
|
|
7042
|
+
syncCollapsedGroups() {
|
|
7043
|
+
if (!this.collapsedGroupKeys.size)
|
|
7044
|
+
return;
|
|
7045
|
+
const allowedPrefixes = new Set(this.group.map((descriptor, index) => `${index}:${descriptor.field}:`));
|
|
7046
|
+
this.collapsedGroupKeys = new Set(Array.from(this.collapsedGroupKeys).filter((key) => Array.from(allowedPrefixes).some((prefix) => key.startsWith(prefix))));
|
|
7047
|
+
}
|
|
7048
|
+
clearGroupDragState() {
|
|
7049
|
+
this.groupDragField = null;
|
|
7050
|
+
this.groupPanelDragActive = false;
|
|
7051
|
+
this.groupPanelDragDenied = false;
|
|
7052
|
+
}
|
|
7053
|
+
canAcceptGroupedField(field) {
|
|
7054
|
+
return !!field && this.isGroupingEnabled() && !this.isFieldGrouped(field);
|
|
7055
|
+
}
|
|
7056
|
+
onGroupHandleDragStart(event, field) {
|
|
7057
|
+
if (!this.canAcceptGroupedField(field)) {
|
|
7058
|
+
event.preventDefault();
|
|
7059
|
+
return;
|
|
7060
|
+
}
|
|
7061
|
+
this.groupDragField = field;
|
|
7062
|
+
if (event.dataTransfer) {
|
|
7063
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
7064
|
+
event.dataTransfer.setData('text/ngb-datagrid-group-field', field);
|
|
7065
|
+
event.dataTransfer.setData('text/plain', field);
|
|
7066
|
+
}
|
|
7067
|
+
}
|
|
7068
|
+
onGroupHandleDragEnd() {
|
|
7069
|
+
this.clearGroupDragState();
|
|
7070
|
+
this.cdr.markForCheck();
|
|
7071
|
+
}
|
|
7072
|
+
onGroupPanelDragOver(event) {
|
|
7073
|
+
const field = this.groupDragField || event.dataTransfer?.getData('text/ngb-datagrid-group-field') || null;
|
|
7074
|
+
this.groupPanelDragDenied = !this.canAcceptGroupedField(field);
|
|
7075
|
+
this.groupPanelDragActive = !!field;
|
|
7076
|
+
if (this.groupPanelDragDenied)
|
|
7077
|
+
return;
|
|
7078
|
+
event.preventDefault();
|
|
7079
|
+
if (event.dataTransfer) {
|
|
7080
|
+
event.dataTransfer.dropEffect = 'move';
|
|
7081
|
+
}
|
|
7082
|
+
}
|
|
7083
|
+
onGroupPanelDragLeave(event) {
|
|
7084
|
+
const current = event.currentTarget;
|
|
7085
|
+
const related = event.relatedTarget;
|
|
7086
|
+
if (current && related && current.contains(related))
|
|
7087
|
+
return;
|
|
7088
|
+
this.groupPanelDragActive = false;
|
|
7089
|
+
this.groupPanelDragDenied = false;
|
|
7090
|
+
this.cdr.markForCheck();
|
|
7091
|
+
}
|
|
7092
|
+
onGroupPanelDrop(event) {
|
|
7093
|
+
const field = this.groupDragField || event.dataTransfer?.getData('text/ngb-datagrid-group-field') || null;
|
|
7094
|
+
if (!this.canAcceptGroupedField(field)) {
|
|
7095
|
+
this.clearGroupDragState();
|
|
7096
|
+
this.cdr.markForCheck();
|
|
7097
|
+
return;
|
|
7098
|
+
}
|
|
7099
|
+
event.preventDefault();
|
|
7100
|
+
this.addGroupField(field);
|
|
7101
|
+
}
|
|
6390
7102
|
isColumnReorderEnabled() {
|
|
6391
7103
|
if (!this.columnReorderable || this.isStackedLayout())
|
|
6392
7104
|
return false;
|
|
@@ -6520,8 +7232,7 @@ class Datagrid {
|
|
|
6520
7232
|
fields: [...order],
|
|
6521
7233
|
});
|
|
6522
7234
|
}
|
|
6523
|
-
this.syncResizableColgroups();
|
|
6524
|
-
this.cdr.markForCheck();
|
|
7235
|
+
this.scheduleViewRefresh(() => this.syncResizableColgroups());
|
|
6525
7236
|
}
|
|
6526
7237
|
validateColumnConfig() {
|
|
6527
7238
|
const columns = this.resolvedColumns;
|
|
@@ -6607,7 +7318,7 @@ class Datagrid {
|
|
|
6607
7318
|
return false;
|
|
6608
7319
|
if (!global)
|
|
6609
7320
|
return true;
|
|
6610
|
-
return resolvedColumns.some((column) => this.norm(row
|
|
7321
|
+
return resolvedColumns.some((column) => this.norm(this.readFieldValue(row, column.field)).includes(global));
|
|
6611
7322
|
});
|
|
6612
7323
|
}
|
|
6613
7324
|
this.filteredDirty = false;
|
|
@@ -6643,7 +7354,7 @@ class Datagrid {
|
|
|
6643
7354
|
matchesDescriptor(row, descriptor) {
|
|
6644
7355
|
const column = this.resolvedColumns.find((col) => col.field === descriptor.field);
|
|
6645
7356
|
const filterType = this.getColumnFilterType(column);
|
|
6646
|
-
const cellValue = this.normalizeFilterValue(row
|
|
7357
|
+
const cellValue = this.normalizeFilterValue(this.readFieldValue(row, descriptor.field), filterType);
|
|
6647
7358
|
const compareValue = this.normalizeFilterValue(descriptor.value, filterType);
|
|
6648
7359
|
const ignoreCase = descriptor.ignoreCase ?? (filterType === 'text' || filterType === 'select');
|
|
6649
7360
|
if (descriptor.operator === 'isnull')
|
|
@@ -6721,12 +7432,17 @@ class Datagrid {
|
|
|
6721
7432
|
return this.isFilteringEnabled() && this.resolvedFilterMode() === 'multi' && !!col.filterable;
|
|
6722
7433
|
}
|
|
6723
7434
|
getAllowedOperators(col) {
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
|
|
7435
|
+
const field = col.field;
|
|
7436
|
+
const cached = this.filterOperatorsCache.get(field);
|
|
7437
|
+
if (cached)
|
|
7438
|
+
return cached;
|
|
7439
|
+
const resolved = col.allowedFilterOperators?.length
|
|
7440
|
+
? col.allowedFilterOperators
|
|
7441
|
+
: this.filterOperators?.[col.type ?? 'text']?.length
|
|
7442
|
+
? this.filterOperators[col.type ?? 'text']
|
|
7443
|
+
: ngbAllowedFilterOperators(this.getColumnFilterType(col));
|
|
7444
|
+
this.filterOperatorsCache.set(field, resolved);
|
|
7445
|
+
return resolved;
|
|
6730
7446
|
}
|
|
6731
7447
|
defaultFilterOperator(col) {
|
|
6732
7448
|
const allowed = this.getAllowedOperators(col);
|
|
@@ -6809,14 +7525,162 @@ class Datagrid {
|
|
|
6809
7525
|
return value ? 'Yes' : 'No';
|
|
6810
7526
|
return String(value);
|
|
6811
7527
|
}
|
|
7528
|
+
groupColumn(field) {
|
|
7529
|
+
return this.resolvedColumns.find((column) => column.field === field);
|
|
7530
|
+
}
|
|
7531
|
+
groupColumnField(col) {
|
|
7532
|
+
return String(col.field);
|
|
7533
|
+
}
|
|
7534
|
+
formatGroupValue(field, value) {
|
|
7535
|
+
const column = this.groupColumn(field);
|
|
7536
|
+
if (value === null || value === undefined || value === '')
|
|
7537
|
+
return '(Blank)';
|
|
7538
|
+
if (column?.type === 'select') {
|
|
7539
|
+
const option = column.options?.find((item) => item.value === value);
|
|
7540
|
+
if (option)
|
|
7541
|
+
return option.label;
|
|
7542
|
+
}
|
|
7543
|
+
return this.formatCellDisplayValue(value);
|
|
7544
|
+
}
|
|
7545
|
+
groupRowLabel(group) {
|
|
7546
|
+
return `${this.groupColumnHeader(group.field)}: ${this.formatGroupValue(group.field, group.value)}`;
|
|
7547
|
+
}
|
|
7548
|
+
groupRowCountLabel(group) {
|
|
7549
|
+
return `${group.count} item${group.count === 1 ? '' : 's'}`;
|
|
7550
|
+
}
|
|
7551
|
+
groupLeadColumnField(group) {
|
|
7552
|
+
const first = this.visibleColumns[0];
|
|
7553
|
+
return first ? String(first.field) : null;
|
|
7554
|
+
}
|
|
7555
|
+
isGroupLeadColumn(col, group) {
|
|
7556
|
+
return String(col.field) === this.groupLeadColumnField(group);
|
|
7557
|
+
}
|
|
7558
|
+
shouldRenderGroupCell(col, group) {
|
|
7559
|
+
if (this.isGroupLeadColumn(col, group))
|
|
7560
|
+
return true;
|
|
7561
|
+
return !this.isCoveredByGroupLeadSpan(col, group);
|
|
7562
|
+
}
|
|
7563
|
+
groupCellColspan(col, group) {
|
|
7564
|
+
if (!this.isGroupLeadColumn(col, group))
|
|
7565
|
+
return null;
|
|
7566
|
+
return this.groupLeadColumnSpan(group);
|
|
7567
|
+
}
|
|
7568
|
+
hasGroupHeaderColumnTemplate(field) {
|
|
7569
|
+
return !!this.groupHeaderColumnTpls[field];
|
|
7570
|
+
}
|
|
7571
|
+
hasGroupFooterTemplate(field) {
|
|
7572
|
+
return !!this.groupFooterTpls[field];
|
|
7573
|
+
}
|
|
7574
|
+
groupHeaderColumnTemplate(field) {
|
|
7575
|
+
return this.groupHeaderColumnTpls[field] ?? null;
|
|
7576
|
+
}
|
|
7577
|
+
groupFooterTemplate(field) {
|
|
7578
|
+
return this.groupFooterTpls[field] ?? null;
|
|
7579
|
+
}
|
|
7580
|
+
groupHeaderContext(group) {
|
|
7581
|
+
const ctx = {
|
|
7582
|
+
$implicit: group,
|
|
7583
|
+
group,
|
|
7584
|
+
field: group.field,
|
|
7585
|
+
value: group.value,
|
|
7586
|
+
items: group.items,
|
|
7587
|
+
level: group.level,
|
|
7588
|
+
count: group.count,
|
|
7589
|
+
aggregates: this.cloneAggregateResults(group.aggregates),
|
|
7590
|
+
};
|
|
7591
|
+
return ctx;
|
|
7592
|
+
}
|
|
7593
|
+
groupColumnContext(group, col) {
|
|
7594
|
+
return {
|
|
7595
|
+
...this.groupHeaderContext(group),
|
|
7596
|
+
col,
|
|
7597
|
+
};
|
|
7598
|
+
}
|
|
7599
|
+
groupRowIndent(level) {
|
|
7600
|
+
return level * 1.1;
|
|
7601
|
+
}
|
|
7602
|
+
groupLeadColumnSpan(group) {
|
|
7603
|
+
const leadIndex = this.groupLeadColumnIndex(group);
|
|
7604
|
+
if (leadIndex === -1)
|
|
7605
|
+
return 1;
|
|
7606
|
+
for (let index = leadIndex + 1; index < this.visibleColumns.length; index += 1) {
|
|
7607
|
+
const field = this.groupColumnField(this.visibleColumns[index]);
|
|
7608
|
+
if (this.hasGroupHeaderColumnTemplate(field)) {
|
|
7609
|
+
return Math.max(index - leadIndex, 1);
|
|
7610
|
+
}
|
|
7611
|
+
}
|
|
7612
|
+
return Math.max(this.visibleColumns.length - leadIndex, 1);
|
|
7613
|
+
}
|
|
7614
|
+
isCoveredByGroupLeadSpan(col, group) {
|
|
7615
|
+
const index = this.groupColumnIndex(col);
|
|
7616
|
+
const leadIndex = this.groupLeadColumnIndex(group);
|
|
7617
|
+
if (index === -1 || leadIndex === -1 || index <= leadIndex)
|
|
7618
|
+
return false;
|
|
7619
|
+
return index < leadIndex + this.groupLeadColumnSpan(group);
|
|
7620
|
+
}
|
|
7621
|
+
groupLeadColumnIndex(group) {
|
|
7622
|
+
const field = this.groupLeadColumnField(group);
|
|
7623
|
+
return field ? this.visibleColumns.findIndex((column) => String(column.field) === field) : -1;
|
|
7624
|
+
}
|
|
7625
|
+
groupColumnIndex(col) {
|
|
7626
|
+
const field = String(col.field);
|
|
7627
|
+
return this.visibleColumns.findIndex((column) => String(column.field) === field);
|
|
7628
|
+
}
|
|
7629
|
+
groupKeyFor(group, level, startIndex) {
|
|
7630
|
+
return `${level}:${group.field}:${String(group.value)}:${startIndex}`;
|
|
7631
|
+
}
|
|
7632
|
+
isGroupCollapsed(group, level, startIndex) {
|
|
7633
|
+
return this.collapsedGroupKeys.has(this.groupKeyFor(group, level, startIndex));
|
|
7634
|
+
}
|
|
7635
|
+
toggleGroupCollapsed(group, level, startIndex) {
|
|
7636
|
+
const key = this.groupKeyFor(group, level, startIndex);
|
|
7637
|
+
if (this.collapsedGroupKeys.has(key)) {
|
|
7638
|
+
this.collapsedGroupKeys.delete(key);
|
|
7639
|
+
}
|
|
7640
|
+
else {
|
|
7641
|
+
this.collapsedGroupKeys.add(key);
|
|
7642
|
+
}
|
|
7643
|
+
this.invalidatePagedCache();
|
|
7644
|
+
this.cdr.markForCheck();
|
|
7645
|
+
}
|
|
7646
|
+
isGroupResult(item) {
|
|
7647
|
+
return typeof item === 'object' && item !== null && Array.isArray(item.items);
|
|
7648
|
+
}
|
|
7649
|
+
cloneAggregateDescriptors(descriptors) {
|
|
7650
|
+
return (descriptors ?? []).map((descriptor) => ({ ...descriptor }));
|
|
7651
|
+
}
|
|
7652
|
+
cloneAggregateResults(results) {
|
|
7653
|
+
const cloned = {};
|
|
7654
|
+
for (const field of Object.keys(results ?? {})) {
|
|
7655
|
+
cloned[field] = { ...results[field] };
|
|
7656
|
+
}
|
|
7657
|
+
return cloned;
|
|
7658
|
+
}
|
|
7659
|
+
cloneGroupResults(groups) {
|
|
7660
|
+
return (groups ?? []).map((group) => ({
|
|
7661
|
+
...group,
|
|
7662
|
+
aggregates: this.cloneAggregateResults(group.aggregates),
|
|
7663
|
+
items: group.items.map((item) => (this.isGroupResult(item) ? this.cloneGroupResults([item])[0] : item)),
|
|
7664
|
+
}));
|
|
7665
|
+
}
|
|
6812
7666
|
getSearchHighlightSegments(value, field) {
|
|
6813
7667
|
const display = this.formatCellDisplayValue(value);
|
|
6814
|
-
if (!this.shouldHighlightSearchInColumn(field)) {
|
|
6815
|
-
return [{ text: display, match: false }];
|
|
6816
|
-
}
|
|
6817
7668
|
const term = this.norm(this.searchHighlightTerm);
|
|
6818
|
-
|
|
6819
|
-
|
|
7669
|
+
const highlightEnabled = this.shouldHighlightSearchInColumn(field);
|
|
7670
|
+
const cacheKey = JSON.stringify([field, term, display, highlightEnabled]);
|
|
7671
|
+
const cached = this.searchHighlightCache.get(cacheKey);
|
|
7672
|
+
if (cached)
|
|
7673
|
+
return cached;
|
|
7674
|
+
if (!highlightEnabled) {
|
|
7675
|
+
const segments = [{ key: '0:n', text: display, match: false }];
|
|
7676
|
+
this.searchHighlightCache.set(cacheKey, segments);
|
|
7677
|
+
return segments;
|
|
7678
|
+
}
|
|
7679
|
+
if (!term || !display) {
|
|
7680
|
+
const segments = [{ key: '0:n', text: display, match: false }];
|
|
7681
|
+
this.searchHighlightCache.set(cacheKey, segments);
|
|
7682
|
+
return segments;
|
|
7683
|
+
}
|
|
6820
7684
|
const normalizedDisplay = this.norm(display);
|
|
6821
7685
|
const segments = [];
|
|
6822
7686
|
let cursor = 0;
|
|
@@ -6825,18 +7689,20 @@ class Datagrid {
|
|
|
6825
7689
|
const normalizedSlice = this.norm(slice);
|
|
6826
7690
|
const matchIndex = normalizedSlice.indexOf(term);
|
|
6827
7691
|
if (matchIndex < 0) {
|
|
6828
|
-
segments.push({ text: display.slice(cursor), match: false });
|
|
7692
|
+
segments.push({ key: `${cursor}:n`, text: display.slice(cursor), match: false });
|
|
6829
7693
|
break;
|
|
6830
7694
|
}
|
|
6831
7695
|
const start = cursor + matchIndex;
|
|
6832
7696
|
const end = start + term.length;
|
|
6833
7697
|
if (start > cursor) {
|
|
6834
|
-
segments.push({ text: display.slice(cursor, start), match: false });
|
|
7698
|
+
segments.push({ key: `${cursor}:n`, text: display.slice(cursor, start), match: false });
|
|
6835
7699
|
}
|
|
6836
|
-
segments.push({ text: display.slice(start, end), match: true });
|
|
7700
|
+
segments.push({ key: `${start}:m`, text: display.slice(start, end), match: true });
|
|
6837
7701
|
cursor = end;
|
|
6838
7702
|
}
|
|
6839
|
-
|
|
7703
|
+
const resolved = segments.length ? segments : [{ key: '0:n', text: display, match: false }];
|
|
7704
|
+
this.searchHighlightCache.set(cacheKey, resolved);
|
|
7705
|
+
return resolved;
|
|
6840
7706
|
}
|
|
6841
7707
|
rowFilterEmptyOptionLabel(col) {
|
|
6842
7708
|
return this.getColumnFilterType(col) === 'boolean' ? '(All)' : 'Select';
|
|
@@ -7201,22 +8067,37 @@ class Datagrid {
|
|
|
7201
8067
|
this.closeFilterMenu();
|
|
7202
8068
|
}
|
|
7203
8069
|
multiCheckboxOptions(col) {
|
|
8070
|
+
const field = col.field;
|
|
8071
|
+
const cached = this.multiCheckboxOptionsCache.get(field);
|
|
8072
|
+
if (cached)
|
|
8073
|
+
return cached;
|
|
7204
8074
|
const seen = new Map();
|
|
7205
8075
|
for (const row of this.data ?? []) {
|
|
7206
|
-
const value = row
|
|
8076
|
+
const value = this.readFieldValue(row, col.field);
|
|
7207
8077
|
const key = this.multiCheckboxValueKey(value);
|
|
7208
8078
|
if (!seen.has(key)) {
|
|
7209
8079
|
seen.set(key, { label: this.multiCheckboxValueLabel(col, value), value });
|
|
7210
8080
|
}
|
|
7211
8081
|
}
|
|
7212
|
-
|
|
8082
|
+
const options = Array.from(seen.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base', numeric: true }));
|
|
8083
|
+
this.multiCheckboxOptionsCache.set(field, options);
|
|
8084
|
+
return options;
|
|
7213
8085
|
}
|
|
7214
8086
|
multiCheckboxVisibleOptions(col) {
|
|
7215
|
-
const
|
|
8087
|
+
const field = col.field;
|
|
8088
|
+
const query = this.norm(this.multiCheckboxSearch[field]);
|
|
8089
|
+
const cacheKey = JSON.stringify([field, query]);
|
|
8090
|
+
const cached = this.multiCheckboxVisibleOptionsCache.get(cacheKey);
|
|
8091
|
+
if (cached)
|
|
8092
|
+
return cached;
|
|
7216
8093
|
const options = this.multiCheckboxOptions(col);
|
|
7217
|
-
if (!query)
|
|
8094
|
+
if (!query) {
|
|
8095
|
+
this.multiCheckboxVisibleOptionsCache.set(cacheKey, options);
|
|
7218
8096
|
return options;
|
|
7219
|
-
|
|
8097
|
+
}
|
|
8098
|
+
const visible = options.filter((option) => this.norm(option.label).includes(query));
|
|
8099
|
+
this.multiCheckboxVisibleOptionsCache.set(cacheKey, visible);
|
|
8100
|
+
return visible;
|
|
7220
8101
|
}
|
|
7221
8102
|
multiCheckboxValueLabel(col, value) {
|
|
7222
8103
|
if (this.getColumnFilterType(col) === 'boolean')
|
|
@@ -7391,11 +8272,9 @@ class Datagrid {
|
|
|
7391
8272
|
const copy = [...this.filtered];
|
|
7392
8273
|
const { active, direction } = this.sort;
|
|
7393
8274
|
copy.sort((a, b) => {
|
|
7394
|
-
const av = a
|
|
7395
|
-
const bv = b
|
|
7396
|
-
const cmp =
|
|
7397
|
-
? av.localeCompare(bv, undefined, { numeric: true, sensitivity: 'base' })
|
|
7398
|
-
: av < bv ? -1 : av > bv ? 1 : 0;
|
|
8275
|
+
const av = this.readFieldValue(a, active);
|
|
8276
|
+
const bv = this.readFieldValue(b, active);
|
|
8277
|
+
const cmp = this.compareSortValues(av, bv);
|
|
7399
8278
|
return direction === 'asc' ? cmp : -cmp;
|
|
7400
8279
|
});
|
|
7401
8280
|
return copy;
|
|
@@ -7428,6 +8307,11 @@ class Datagrid {
|
|
|
7428
8307
|
}
|
|
7429
8308
|
get paged() {
|
|
7430
8309
|
if (this.pagedDirty) {
|
|
8310
|
+
if (this.isGroupingActive()) {
|
|
8311
|
+
this.ensureRenderRows();
|
|
8312
|
+
this.pagedDirty = false;
|
|
8313
|
+
return this.pagedCache;
|
|
8314
|
+
}
|
|
7431
8315
|
if (this.shouldUseLocalDataOperations()) {
|
|
7432
8316
|
this.pagedCache = this.localDataOperationsResult(this.paginationActive).data;
|
|
7433
8317
|
this.pagedDirty = false;
|
|
@@ -7444,6 +8328,13 @@ class Datagrid {
|
|
|
7444
8328
|
}
|
|
7445
8329
|
return this.pagedCache;
|
|
7446
8330
|
}
|
|
8331
|
+
get renderRows() {
|
|
8332
|
+
this.ensureRenderRows();
|
|
8333
|
+
return this.renderRowsCache;
|
|
8334
|
+
}
|
|
8335
|
+
hasRenderableRows() {
|
|
8336
|
+
return this.renderRows.length > 0;
|
|
8337
|
+
}
|
|
7447
8338
|
shouldUseLocalDataOperations() {
|
|
7448
8339
|
if (!this.dataOperations)
|
|
7449
8340
|
return false;
|
|
@@ -7455,11 +8346,137 @@ class Datagrid {
|
|
|
7455
8346
|
return ngbApplyDataGridOperations(this.data, {
|
|
7456
8347
|
...options,
|
|
7457
8348
|
state: this.dataState(),
|
|
8349
|
+
groupedData: options.groupedData ?? this.groupedData,
|
|
7458
8350
|
columns: options.columns ?? this.resolvedColumns,
|
|
7459
8351
|
globalFilterFields: options.globalFilterFields ?? this.resolvedColumns.map((column) => column.field),
|
|
7460
8352
|
page,
|
|
7461
8353
|
});
|
|
7462
8354
|
}
|
|
8355
|
+
usingProvidedGroupedData() {
|
|
8356
|
+
return (this.groupedData?.length ?? 0) > 0;
|
|
8357
|
+
}
|
|
8358
|
+
groupingResults(rows) {
|
|
8359
|
+
if (this.usingProvidedGroupedData()) {
|
|
8360
|
+
return this.cloneGroupResults(this.groupedData);
|
|
8361
|
+
}
|
|
8362
|
+
if (this.shouldUseLocalDataOperations()) {
|
|
8363
|
+
return this.localDataOperationsResult(false).groupedData ?? [];
|
|
8364
|
+
}
|
|
8365
|
+
return ngbGroupData(rows, this.group);
|
|
8366
|
+
}
|
|
8367
|
+
ensureRenderRows() {
|
|
8368
|
+
if (!this.renderRowsDirty)
|
|
8369
|
+
return;
|
|
8370
|
+
if (!this.isGroupingActive()) {
|
|
8371
|
+
const leafRows = this.shouldUseLocalDataOperations()
|
|
8372
|
+
? this.localDataOperationsResult(this.paginationActive).data
|
|
8373
|
+
: (!this.paginationActive || this.isServerBound())
|
|
8374
|
+
? this.sorted
|
|
8375
|
+
: this.sorted.slice((this.page - 1) * this.pageSize, (this.page - 1) * this.pageSize + this.pageSize);
|
|
8376
|
+
this.pagedCache = leafRows;
|
|
8377
|
+
this.renderRowsCache = leafRows.map((row, pagedIndex) => ({
|
|
8378
|
+
kind: 'data',
|
|
8379
|
+
key: this.trackRow(pagedIndex, row),
|
|
8380
|
+
row,
|
|
8381
|
+
pagedIndex,
|
|
8382
|
+
level: 0,
|
|
8383
|
+
}));
|
|
8384
|
+
this.groupRenderRowLookup.clear();
|
|
8385
|
+
this.groupFooterRenderRowLookup.clear();
|
|
8386
|
+
this.renderRowsDirty = false;
|
|
8387
|
+
this.pagedDirty = false;
|
|
8388
|
+
return;
|
|
8389
|
+
}
|
|
8390
|
+
const rows = this.groupingSourceRows();
|
|
8391
|
+
const groups = this.groupingResults(rows);
|
|
8392
|
+
const groupLeafCount = rows.length;
|
|
8393
|
+
const shouldSliceGroups = this.paginationActive && !this.isServerBound() && !this.usingProvidedGroupedData();
|
|
8394
|
+
const pageStart = shouldSliceGroups ? Math.max(0, (this.page - 1) * this.pageSize) : 0;
|
|
8395
|
+
const pageEnd = shouldSliceGroups ? pageStart + this.pageSize : groupLeafCount;
|
|
8396
|
+
let absoluteLeafIndex = 0;
|
|
8397
|
+
let pagedIndex = 0;
|
|
8398
|
+
const leafRows = [];
|
|
8399
|
+
const buildRows = (items, level) => {
|
|
8400
|
+
const rowsForLevel = [];
|
|
8401
|
+
for (const group of items) {
|
|
8402
|
+
const groupStart = absoluteLeafIndex;
|
|
8403
|
+
const collapsed = this.isGroupCollapsed(group, level, groupStart);
|
|
8404
|
+
const childRows = [];
|
|
8405
|
+
if (!collapsed) {
|
|
8406
|
+
for (const item of group.items) {
|
|
8407
|
+
if (this.isGroupResult(item)) {
|
|
8408
|
+
childRows.push(...buildRows([item], level + 1));
|
|
8409
|
+
continue;
|
|
8410
|
+
}
|
|
8411
|
+
const inPage = absoluteLeafIndex >= pageStart && absoluteLeafIndex < pageEnd;
|
|
8412
|
+
if (inPage) {
|
|
8413
|
+
leafRows.push(item);
|
|
8414
|
+
childRows.push({
|
|
8415
|
+
kind: 'data',
|
|
8416
|
+
key: this.trackRow(pagedIndex, item),
|
|
8417
|
+
row: item,
|
|
8418
|
+
pagedIndex,
|
|
8419
|
+
level: level + 1,
|
|
8420
|
+
});
|
|
8421
|
+
pagedIndex += 1;
|
|
8422
|
+
}
|
|
8423
|
+
absoluteLeafIndex += 1;
|
|
8424
|
+
}
|
|
8425
|
+
}
|
|
8426
|
+
else {
|
|
8427
|
+
absoluteLeafIndex += group.count;
|
|
8428
|
+
}
|
|
8429
|
+
const groupEnd = groupStart + group.count;
|
|
8430
|
+
if (groupEnd > pageStart && groupStart < pageEnd) {
|
|
8431
|
+
rowsForLevel.push({
|
|
8432
|
+
kind: 'group',
|
|
8433
|
+
key: this.groupKeyFor(group, level, groupStart),
|
|
8434
|
+
group,
|
|
8435
|
+
collapsed,
|
|
8436
|
+
level,
|
|
8437
|
+
startIndex: groupStart,
|
|
8438
|
+
});
|
|
8439
|
+
if (!collapsed) {
|
|
8440
|
+
rowsForLevel.push(...childRows);
|
|
8441
|
+
if (this.showGroupFooters()) {
|
|
8442
|
+
rowsForLevel.push({
|
|
8443
|
+
kind: 'group-footer',
|
|
8444
|
+
key: `${this.groupKeyFor(group, level, groupStart)}:footer`,
|
|
8445
|
+
group,
|
|
8446
|
+
level,
|
|
8447
|
+
startIndex: groupStart,
|
|
8448
|
+
});
|
|
8449
|
+
}
|
|
8450
|
+
}
|
|
8451
|
+
}
|
|
8452
|
+
}
|
|
8453
|
+
return rowsForLevel;
|
|
8454
|
+
};
|
|
8455
|
+
const renderedRows = buildRows(groups, 0);
|
|
8456
|
+
this.pagedCache = leafRows;
|
|
8457
|
+
this.renderRowsCache = renderedRows;
|
|
8458
|
+
this.rebuildGroupedRowLookups(renderedRows);
|
|
8459
|
+
this.renderRowsDirty = false;
|
|
8460
|
+
this.pagedDirty = false;
|
|
8461
|
+
}
|
|
8462
|
+
rebuildGroupedRowLookups(rows) {
|
|
8463
|
+
this.groupRenderRowLookup.clear();
|
|
8464
|
+
this.groupFooterRenderRowLookup.clear();
|
|
8465
|
+
for (const row of rows) {
|
|
8466
|
+
if (row.kind === 'group') {
|
|
8467
|
+
this.groupRenderRowLookup.set(row.key, row);
|
|
8468
|
+
}
|
|
8469
|
+
else if (row.kind === 'group-footer') {
|
|
8470
|
+
this.groupFooterRenderRowLookup.set(row.key, row);
|
|
8471
|
+
}
|
|
8472
|
+
}
|
|
8473
|
+
}
|
|
8474
|
+
groupingSourceRows() {
|
|
8475
|
+
if (this.shouldUseLocalDataOperations()) {
|
|
8476
|
+
return this.localDataOperationsResult(false).data;
|
|
8477
|
+
}
|
|
8478
|
+
return this.sorted;
|
|
8479
|
+
}
|
|
7463
8480
|
// getters for template conditions / display
|
|
7464
8481
|
get anyFilterable() {
|
|
7465
8482
|
if (this.resolvedFilterMode() !== 'row')
|
|
@@ -7537,6 +8554,7 @@ class Datagrid {
|
|
|
7537
8554
|
skip: Math.max(0, (this.page - 1) * this.pageSize),
|
|
7538
8555
|
pageSize: this.pageSize,
|
|
7539
8556
|
sort,
|
|
8557
|
+
group: [...this.group],
|
|
7540
8558
|
filter: this.cloneComposite(this.effectiveFilterDescriptor()),
|
|
7541
8559
|
globalFilter: this.currentGlobalFilterValue(),
|
|
7542
8560
|
};
|
|
@@ -7567,6 +8585,10 @@ class Datagrid {
|
|
|
7567
8585
|
this.sort = firstSort?.field && firstSort.direction
|
|
7568
8586
|
? { active: firstSort.field, direction: firstSort.direction }
|
|
7569
8587
|
: { active: null, direction: '' };
|
|
8588
|
+
if (state.group !== undefined) {
|
|
8589
|
+
this._group = this.normalizeGroupDescriptors(state.group);
|
|
8590
|
+
this.syncCollapsedGroups();
|
|
8591
|
+
}
|
|
7570
8592
|
if (state.filter !== undefined) {
|
|
7571
8593
|
this.localFilter = this.cloneComposite(state.filter ?? { logic: 'and', filters: [] });
|
|
7572
8594
|
this.syncLegacyFilters(this.localFilter);
|
|
@@ -7590,6 +8612,133 @@ class Datagrid {
|
|
|
7590
8612
|
if (this.headerScroller?.nativeElement) {
|
|
7591
8613
|
this.headerScroller.nativeElement.scrollLeft = left;
|
|
7592
8614
|
}
|
|
8615
|
+
this.scheduleStickyGroupSync();
|
|
8616
|
+
}
|
|
8617
|
+
onWindowResize() {
|
|
8618
|
+
this.scheduleStickyGroupSync();
|
|
8619
|
+
}
|
|
8620
|
+
scheduleStickyGroupSync() {
|
|
8621
|
+
if (!this.showStickyGroupHeaders() && !this.showStickyGroupFooters()) {
|
|
8622
|
+
if (this.stickyGroupHeaderRows.length ||
|
|
8623
|
+
this.stickyGroupFooterRows.length ||
|
|
8624
|
+
this.stickyGroupOverlayColumnWidths.length ||
|
|
8625
|
+
this.stickyGroupHeaderTranslateY !== 0 ||
|
|
8626
|
+
this.stickyGroupFooterTranslateY !== 0) {
|
|
8627
|
+
this.stickyGroupHeaderRows = [];
|
|
8628
|
+
this.stickyGroupFooterRows = [];
|
|
8629
|
+
this.stickyGroupOverlayColumnWidths = [];
|
|
8630
|
+
this.stickyGroupHeaderTranslateY = 0;
|
|
8631
|
+
this.stickyGroupFooterTranslateY = 0;
|
|
8632
|
+
this.cdr.markForCheck();
|
|
8633
|
+
}
|
|
8634
|
+
return;
|
|
8635
|
+
}
|
|
8636
|
+
if (this.stickyGroupSyncQueued)
|
|
8637
|
+
return;
|
|
8638
|
+
this.stickyGroupSyncQueued = true;
|
|
8639
|
+
Promise.resolve().then(() => {
|
|
8640
|
+
const raf = typeof requestAnimationFrame === 'function'
|
|
8641
|
+
? requestAnimationFrame
|
|
8642
|
+
: (callback) => setTimeout(() => callback(Date.now()), 16);
|
|
8643
|
+
raf(() => {
|
|
8644
|
+
this.stickyGroupSyncQueued = false;
|
|
8645
|
+
this.syncStickyGroupOverlays();
|
|
8646
|
+
});
|
|
8647
|
+
});
|
|
8648
|
+
}
|
|
8649
|
+
syncStickyGroupOverlays() {
|
|
8650
|
+
this.ensureRenderRows();
|
|
8651
|
+
const scroller = this.bodyScroller?.nativeElement;
|
|
8652
|
+
if (!scroller || !this.isGroupingActive()) {
|
|
8653
|
+
this.stickyGroupHeaderRows = [];
|
|
8654
|
+
this.stickyGroupFooterRows = [];
|
|
8655
|
+
this.stickyGroupOverlayColumnWidths = [];
|
|
8656
|
+
this.stickyGroupHeaderTranslateY = 0;
|
|
8657
|
+
this.stickyGroupFooterTranslateY = 0;
|
|
8658
|
+
this.cdr.markForCheck();
|
|
8659
|
+
return;
|
|
8660
|
+
}
|
|
8661
|
+
const mainTable = scroller.querySelector('table.grid-body--main');
|
|
8662
|
+
this.stickyGroupOverlayColumnWidths = Array.from(mainTable?.querySelectorAll('colgroup col') ?? []).map((col) => {
|
|
8663
|
+
const explicit = parseFloat(col.style.width || '');
|
|
8664
|
+
if (Number.isFinite(explicit) && explicit > 0)
|
|
8665
|
+
return explicit;
|
|
8666
|
+
const width = col.getBoundingClientRect().width;
|
|
8667
|
+
return Number.isFinite(width) && width > 0 ? width : 0;
|
|
8668
|
+
});
|
|
8669
|
+
const scrollerRect = scroller.getBoundingClientRect();
|
|
8670
|
+
const headerMeasurements = this.collectStickyGroupMeasurements(scroller.querySelectorAll('table.grid-body--main tbody > tr.grid-group-row[data-group-key]'), this.groupRenderRowLookup);
|
|
8671
|
+
const footerMeasurements = this.collectStickyGroupMeasurements(scroller.querySelectorAll('table.grid-body--main tbody > tr.grid-group-footer-row[data-group-key]'), this.groupFooterRenderRowLookup);
|
|
8672
|
+
const stickyHeaders = this.showStickyGroupHeaders()
|
|
8673
|
+
? this.resolveStickyHeaderRows(headerMeasurements, scrollerRect.top)
|
|
8674
|
+
: [];
|
|
8675
|
+
const stickyFooters = this.showStickyGroupFooters()
|
|
8676
|
+
? this.resolveStickyFooterRows(stickyHeaders, footerMeasurements, scrollerRect.bottom)
|
|
8677
|
+
: [];
|
|
8678
|
+
const stickyFooterMeasurements = stickyFooters
|
|
8679
|
+
.map((row) => footerMeasurements.find((measurement) => measurement.key === row.key))
|
|
8680
|
+
.filter(Boolean);
|
|
8681
|
+
this.stickyGroupHeaderRows = stickyHeaders;
|
|
8682
|
+
this.stickyGroupFooterRows = stickyFooters;
|
|
8683
|
+
this.stickyGroupHeaderTranslateY = stickyHeaders.length ? scroller.scrollTop : 0;
|
|
8684
|
+
this.stickyGroupFooterTranslateY = stickyFooters.length
|
|
8685
|
+
? Math.max(0, scroller.scrollTop + scroller.clientHeight - this.measurementStackHeight(stickyFooterMeasurements))
|
|
8686
|
+
: 0;
|
|
8687
|
+
this.cdr.markForCheck();
|
|
8688
|
+
}
|
|
8689
|
+
collectStickyGroupMeasurements(nodes, lookup) {
|
|
8690
|
+
const measurements = [];
|
|
8691
|
+
for (const node of Array.from(nodes)) {
|
|
8692
|
+
const key = node.getAttribute('data-group-key') ?? '';
|
|
8693
|
+
const row = lookup.get(key);
|
|
8694
|
+
if (!row)
|
|
8695
|
+
continue;
|
|
8696
|
+
const rect = node.getBoundingClientRect();
|
|
8697
|
+
measurements.push({
|
|
8698
|
+
key: row.key,
|
|
8699
|
+
level: row.level,
|
|
8700
|
+
startIndex: row.startIndex,
|
|
8701
|
+
endIndex: row.startIndex + row.group.count,
|
|
8702
|
+
top: rect.top,
|
|
8703
|
+
bottom: rect.bottom,
|
|
8704
|
+
height: rect.height,
|
|
8705
|
+
row,
|
|
8706
|
+
});
|
|
8707
|
+
}
|
|
8708
|
+
return measurements;
|
|
8709
|
+
}
|
|
8710
|
+
resolveStickyHeaderRows(measurements, scrollerTop) {
|
|
8711
|
+
const active = [];
|
|
8712
|
+
let parentRange = null;
|
|
8713
|
+
let threshold = scrollerTop;
|
|
8714
|
+
for (let level = 0; level < this.group.length; level++) {
|
|
8715
|
+
const matches = measurements.filter((measurement) => measurement.level === level &&
|
|
8716
|
+
(!parentRange || (measurement.startIndex >= parentRange.start && measurement.startIndex < parentRange.end)) &&
|
|
8717
|
+
measurement.top < threshold - 0.5);
|
|
8718
|
+
const match = matches.length ? matches[matches.length - 1] : null;
|
|
8719
|
+
if (!match)
|
|
8720
|
+
break;
|
|
8721
|
+
active.push(match.row);
|
|
8722
|
+
parentRange = { start: match.startIndex, end: match.endIndex };
|
|
8723
|
+
threshold += match.height;
|
|
8724
|
+
}
|
|
8725
|
+
return active;
|
|
8726
|
+
}
|
|
8727
|
+
resolveStickyFooterRows(stickyHeaders, measurements, scrollerBottom) {
|
|
8728
|
+
const active = [];
|
|
8729
|
+
for (const stickyHeader of stickyHeaders) {
|
|
8730
|
+
const footerKey = `${stickyHeader.key}:footer`;
|
|
8731
|
+
const match = measurements.find((measurement) => measurement.key === footerKey);
|
|
8732
|
+
if (!match)
|
|
8733
|
+
continue;
|
|
8734
|
+
if (match.top > scrollerBottom + 0.5) {
|
|
8735
|
+
active.push(match.row);
|
|
8736
|
+
}
|
|
8737
|
+
}
|
|
8738
|
+
return active;
|
|
8739
|
+
}
|
|
8740
|
+
measurementStackHeight(measurements) {
|
|
8741
|
+
return measurements.reduce((total, measurement) => total + measurement.height, 0);
|
|
7593
8742
|
}
|
|
7594
8743
|
get isHeaderSticky() {
|
|
7595
8744
|
return this.stickyHeaderEnabled && this.shouldEnableScroll;
|
|
@@ -7701,13 +8850,26 @@ class Datagrid {
|
|
|
7701
8850
|
return this.editingIndex === pagedIndex;
|
|
7702
8851
|
}
|
|
7703
8852
|
onCellClick(ev, pagedIndex, col) {
|
|
8853
|
+
this.tryStartIncellEdit(ev, pagedIndex, col);
|
|
8854
|
+
}
|
|
8855
|
+
onCellMouseDown(ev, pagedIndex, col) {
|
|
8856
|
+
if (ev.button !== 0)
|
|
8857
|
+
return;
|
|
8858
|
+
this.tryStartIncellEdit(ev, pagedIndex, col);
|
|
8859
|
+
}
|
|
8860
|
+
tryStartIncellEdit(ev, pagedIndex, col) {
|
|
7704
8861
|
if (!this.isIncellEditMode() || !this.enableEdit)
|
|
7705
8862
|
return;
|
|
7706
8863
|
const row = this.paged[pagedIndex];
|
|
7707
8864
|
if (!this.isCellEditable(col, row, false))
|
|
7708
8865
|
return;
|
|
7709
|
-
const
|
|
7710
|
-
|
|
8866
|
+
const target = ev.target;
|
|
8867
|
+
const el = target instanceof Element
|
|
8868
|
+
? target
|
|
8869
|
+
: target instanceof Node
|
|
8870
|
+
? target.parentElement
|
|
8871
|
+
: null;
|
|
8872
|
+
if (el?.closest('button, a, input, select, textarea, label, .no-edit-trigger'))
|
|
7711
8873
|
return;
|
|
7712
8874
|
if (this.isCellInEditMode(pagedIndex, col))
|
|
7713
8875
|
return;
|
|
@@ -7764,10 +8926,13 @@ class Datagrid {
|
|
|
7764
8926
|
this.addingNew = false;
|
|
7765
8927
|
this.editingIndex = pagedIndex;
|
|
7766
8928
|
this.editingCell = { rowIndex: pagedIndex, field };
|
|
7767
|
-
|
|
8929
|
+
const colIndex = this.visibleColumns.findIndex((col) => col.field === field);
|
|
8930
|
+
if (colIndex >= 0) {
|
|
8931
|
+
this.focusedCell = { rowIndex: pagedIndex, colIndex };
|
|
8932
|
+
}
|
|
8933
|
+
this.editForm = this.buildFormFromRow(this.toDraftValues(this.paged[pagedIndex]));
|
|
7768
8934
|
this.saveAttemptedEdit = false;
|
|
7769
|
-
this.
|
|
7770
|
-
queueMicrotask(() => this.focusInlineEditor(field));
|
|
8935
|
+
this.scheduleViewRefresh(() => this.focusInlineEditor(field));
|
|
7771
8936
|
}
|
|
7772
8937
|
focusInlineEditor(preferredField) {
|
|
7773
8938
|
const root = this.hostEl?.nativeElement;
|
|
@@ -7798,7 +8963,7 @@ class Datagrid {
|
|
|
7798
8963
|
const original = this.data[di];
|
|
7799
8964
|
const rowId = this.getRowId(di, original);
|
|
7800
8965
|
const service = this.getEditService();
|
|
7801
|
-
const updated = service.assignValues(original,
|
|
8966
|
+
const updated = service.assignValues(original, this.patchFieldValue(field, control?.value));
|
|
7802
8967
|
const next = service.update(this.data ?? [], updated, di, rowId);
|
|
7803
8968
|
this.data = service.saveChanges(next, di, rowId, updated);
|
|
7804
8969
|
this.invalidateDataCaches();
|
|
@@ -7809,7 +8974,7 @@ class Datagrid {
|
|
|
7809
8974
|
this.editForm = this.fb.group({});
|
|
7810
8975
|
this.saveAttemptedEdit = false;
|
|
7811
8976
|
}
|
|
7812
|
-
this.
|
|
8977
|
+
this.scheduleViewRefresh();
|
|
7813
8978
|
return true;
|
|
7814
8979
|
}
|
|
7815
8980
|
cancelIncellEdit() {
|
|
@@ -7823,7 +8988,7 @@ class Datagrid {
|
|
|
7823
8988
|
this.editingIndex = null;
|
|
7824
8989
|
this.editForm = this.fb.group({});
|
|
7825
8990
|
this.saveAttemptedEdit = false;
|
|
7826
|
-
this.
|
|
8991
|
+
this.scheduleViewRefresh();
|
|
7827
8992
|
}
|
|
7828
8993
|
getSingleSelectedPagedIndex() {
|
|
7829
8994
|
const selected = this.paged
|
|
@@ -7853,11 +9018,10 @@ class Datagrid {
|
|
|
7853
9018
|
this.externalDialogFocusedOnce = false;
|
|
7854
9019
|
this.externalEditIsNew = false;
|
|
7855
9020
|
this.externalEditPagedIndex = pagedIndex;
|
|
7856
|
-
this.externalForm = this.buildFormFromRow(this.paged[pagedIndex]);
|
|
9021
|
+
this.externalForm = this.buildFormFromRow(this.toDraftValues(this.paged[pagedIndex]));
|
|
7857
9022
|
this.saveAttemptedExternal = false;
|
|
7858
9023
|
this.externalEditOpen = true;
|
|
7859
|
-
this.
|
|
7860
|
-
queueMicrotask(() => this.focusExternalDialogFirstField());
|
|
9024
|
+
this.scheduleViewRefresh(() => this.focusExternalDialogFirstField());
|
|
7861
9025
|
}
|
|
7862
9026
|
openExternalAdd() {
|
|
7863
9027
|
this.externalDialogOpener = document.activeElement ?? null;
|
|
@@ -7868,11 +9032,10 @@ class Datagrid {
|
|
|
7868
9032
|
this.saveAttemptedExternal = false;
|
|
7869
9033
|
this.externalEditOpen = true;
|
|
7870
9034
|
const service = this.getEditService();
|
|
7871
|
-
const draft =
|
|
9035
|
+
const draft = this.assignDraftValues({}, this.formDraftValues(this.externalForm));
|
|
7872
9036
|
this.addDraftRowId = Symbol('ngb-datagrid-new-row');
|
|
7873
9037
|
service.create(this.data ?? [], draft, this.data.length, this.addDraftRowId);
|
|
7874
|
-
this.
|
|
7875
|
-
queueMicrotask(() => this.focusExternalDialogFirstField());
|
|
9038
|
+
this.scheduleViewRefresh(() => this.focusExternalDialogFirstField());
|
|
7876
9039
|
}
|
|
7877
9040
|
saveExternalEdit() {
|
|
7878
9041
|
if (!this.externalEditOpen)
|
|
@@ -7884,7 +9047,7 @@ class Datagrid {
|
|
|
7884
9047
|
return;
|
|
7885
9048
|
const service = this.getEditService();
|
|
7886
9049
|
if (this.externalEditIsNew) {
|
|
7887
|
-
const newRow =
|
|
9050
|
+
const newRow = this.assignDraftValues({}, this.formDraftValues(this.externalForm));
|
|
7888
9051
|
const rowIndex = this.data.length;
|
|
7889
9052
|
const rowId = this.addDraftRowId ?? this.getRowId(rowIndex, newRow);
|
|
7890
9053
|
service.create(this.data ?? [], newRow, rowIndex, rowId);
|
|
@@ -7896,7 +9059,7 @@ class Datagrid {
|
|
|
7896
9059
|
const di = this.dataIndexOf(this.paged[pagedIndex]);
|
|
7897
9060
|
const original = this.data[di];
|
|
7898
9061
|
const rowId = this.getRowId(di, original);
|
|
7899
|
-
const updated =
|
|
9062
|
+
const updated = this.assignDraftValues(original, this.formDraftValues(this.externalForm));
|
|
7900
9063
|
const next = service.update(this.data ?? [], updated, di, rowId);
|
|
7901
9064
|
this.data = service.saveChanges(next, di, rowId, updated);
|
|
7902
9065
|
this.invalidateDataCaches();
|
|
@@ -8119,6 +9282,8 @@ class Datagrid {
|
|
|
8119
9282
|
return side ? `column-pinned-${side}${col.locked ? ' column-locked' : ' column-sticky'}` : null;
|
|
8120
9283
|
}
|
|
8121
9284
|
get tableClassList() {
|
|
9285
|
+
if (this.tableClassListCache)
|
|
9286
|
+
return this.tableClassListCache;
|
|
8122
9287
|
const opts = this.tableOptions || {};
|
|
8123
9288
|
const cls = ['table'];
|
|
8124
9289
|
if (opts.stripedRows)
|
|
@@ -8139,15 +9304,20 @@ class Datagrid {
|
|
|
8139
9304
|
cls.push('align-middle');
|
|
8140
9305
|
if (opts.align === 'bottom')
|
|
8141
9306
|
cls.push('align-bottom');
|
|
9307
|
+
this.tableClassListCache = cls;
|
|
8142
9308
|
return cls;
|
|
8143
9309
|
}
|
|
8144
9310
|
get responsiveWrapperClasses() {
|
|
9311
|
+
if (this.responsiveWrapperClassesCache)
|
|
9312
|
+
return this.responsiveWrapperClassesCache;
|
|
8145
9313
|
const r = this.tableOptions?.responsive;
|
|
8146
|
-
|
|
8147
|
-
|
|
8148
|
-
|
|
8149
|
-
|
|
8150
|
-
|
|
9314
|
+
const classes = r === false
|
|
9315
|
+
? []
|
|
9316
|
+
: r === true || r === undefined
|
|
9317
|
+
? ['table-responsive']
|
|
9318
|
+
: [`table-responsive-${r}`];
|
|
9319
|
+
this.responsiveWrapperClassesCache = classes;
|
|
9320
|
+
return classes;
|
|
8151
9321
|
}
|
|
8152
9322
|
get densityMode() {
|
|
8153
9323
|
return this.tableOptions?.density ?? 'comfortable';
|
|
@@ -8166,11 +9336,19 @@ class Datagrid {
|
|
|
8166
9336
|
return col.stackedGroup ?? 'start';
|
|
8167
9337
|
}
|
|
8168
9338
|
stackedColumnsInGroup(group) {
|
|
8169
|
-
|
|
9339
|
+
const cached = this.stackedColumnsCache.get(group);
|
|
9340
|
+
if (cached)
|
|
9341
|
+
return cached;
|
|
9342
|
+
const columns = this.visibleColumns.filter((col) => this.stackedGroupFor(col) === group);
|
|
9343
|
+
this.stackedColumnsCache.set(group, columns);
|
|
9344
|
+
return columns;
|
|
8170
9345
|
}
|
|
8171
9346
|
stackedCardGroups() {
|
|
9347
|
+
if (this.stackedCardGroupsCache)
|
|
9348
|
+
return this.stackedCardGroupsCache;
|
|
8172
9349
|
const order = ['start', 'center', 'end'];
|
|
8173
|
-
|
|
9350
|
+
this.stackedCardGroupsCache = order.filter((group) => this.stackedColumnsInGroup(group).length > 0);
|
|
9351
|
+
return this.stackedCardGroupsCache;
|
|
8174
9352
|
}
|
|
8175
9353
|
visibleColumnIndex(col) {
|
|
8176
9354
|
return this.visibleColumns.findIndex((item) => item.field === col.field);
|
|
@@ -8250,7 +9428,7 @@ class Datagrid {
|
|
|
8250
9428
|
}
|
|
8251
9429
|
updateHighlightCache() {
|
|
8252
9430
|
this.highlightRowMap.clear();
|
|
8253
|
-
(this.highlightedIndex || []).forEach(item => {
|
|
9431
|
+
(this.highlightedIndex || []).forEach((item) => {
|
|
8254
9432
|
const rowKey = item.row;
|
|
8255
9433
|
if (!this.highlightRowMap.has(rowKey))
|
|
8256
9434
|
this.highlightRowMap.set(rowKey, []);
|
|
@@ -8261,16 +9439,16 @@ class Datagrid {
|
|
|
8261
9439
|
return (col.header ?? col.field ?? '').toString();
|
|
8262
9440
|
}
|
|
8263
9441
|
headerTitle(col) {
|
|
8264
|
-
const t = col
|
|
9442
|
+
const t = col.title;
|
|
8265
9443
|
return (t ?? this.headerText(col)) ?? '';
|
|
8266
9444
|
}
|
|
8267
9445
|
cellTitle(row, col) {
|
|
8268
|
-
const def = col
|
|
9446
|
+
const def = col.cellTitle;
|
|
8269
9447
|
if (typeof def === 'function')
|
|
8270
9448
|
return def(row) ?? '';
|
|
8271
9449
|
if (typeof def === 'string')
|
|
8272
9450
|
return def;
|
|
8273
|
-
const val = row
|
|
9451
|
+
const val = this.readFieldValue(row, col.field);
|
|
8274
9452
|
return val === undefined || val === null ? '' : String(val);
|
|
8275
9453
|
}
|
|
8276
9454
|
columnFilterAriaLabel(col) {
|
|
@@ -8526,8 +9704,7 @@ class Datagrid {
|
|
|
8526
9704
|
const sticky = [];
|
|
8527
9705
|
const rest = [];
|
|
8528
9706
|
rows.forEach(r => {
|
|
8529
|
-
const
|
|
8530
|
-
const id = this.getRowId(di >= 0 ? di : 0, r);
|
|
9707
|
+
const { id } = this.resolveRowMeta(r, 0);
|
|
8531
9708
|
(this.stickyRowIds.has(id) ? sticky : rest).push(r);
|
|
8532
9709
|
});
|
|
8533
9710
|
return [...sticky, ...rest];
|
|
@@ -8563,6 +9740,8 @@ class Datagrid {
|
|
|
8563
9740
|
filterTplQ;
|
|
8564
9741
|
filterMenuTplQ;
|
|
8565
9742
|
globalTplQ;
|
|
9743
|
+
groupHeaderColumnTplQ;
|
|
9744
|
+
groupFooterTplQ;
|
|
8566
9745
|
gridColumnQ;
|
|
8567
9746
|
/** Internal lookup maps */
|
|
8568
9747
|
cellTpls = {};
|
|
@@ -8570,6 +9749,8 @@ class Datagrid {
|
|
|
8570
9749
|
filterTpls = {};
|
|
8571
9750
|
filterMenuTpls = {};
|
|
8572
9751
|
globalTpl = null;
|
|
9752
|
+
groupHeaderColumnTpls = {};
|
|
9753
|
+
groupFooterTpls = {};
|
|
8573
9754
|
warnedDeclarativeColumns = false;
|
|
8574
9755
|
toRecord(items) {
|
|
8575
9756
|
const arr = Array.isArray(items)
|
|
@@ -8631,6 +9812,8 @@ class Datagrid {
|
|
|
8631
9812
|
this.filterTpls = this.toRecord(this.filterTplQ);
|
|
8632
9813
|
this.filterMenuTpls = this.toRecord(this.filterMenuTplQ);
|
|
8633
9814
|
this.globalTpl = this.globalTplQ?.first ?? null;
|
|
9815
|
+
this.groupHeaderColumnTpls = this.toRecord(this.groupHeaderColumnTplQ);
|
|
9816
|
+
this.groupFooterTpls = this.toRecord(this.groupFooterTplQ);
|
|
8634
9817
|
this.syncColumnWidthOverrides(true);
|
|
8635
9818
|
this.syncColumnOrder(true);
|
|
8636
9819
|
this.validateColumnConfig();
|
|
@@ -8645,7 +9828,10 @@ class Datagrid {
|
|
|
8645
9828
|
this.filterTplQ?.changes.subscribe(rebuild);
|
|
8646
9829
|
this.filterMenuTplQ?.changes.subscribe(rebuild);
|
|
8647
9830
|
this.globalTplQ?.changes.subscribe(rebuild);
|
|
9831
|
+
this.groupHeaderColumnTplQ?.changes.subscribe(rebuild);
|
|
9832
|
+
this.groupFooterTplQ?.changes.subscribe(rebuild);
|
|
8648
9833
|
this.gridColumnQ?.changes.subscribe(rebuild);
|
|
9834
|
+
this.scheduleStickyGroupSync();
|
|
8649
9835
|
}
|
|
8650
9836
|
ngOnChanges(ch) {
|
|
8651
9837
|
if (ch['state']) {
|
|
@@ -8684,6 +9870,7 @@ class Datagrid {
|
|
|
8684
9870
|
if (ch['data'] || ch['columns'] || ch['labels'] || ch['locale'] || ch['dir']) {
|
|
8685
9871
|
this.cdr.markForCheck();
|
|
8686
9872
|
}
|
|
9873
|
+
this.scheduleStickyGroupSync();
|
|
8687
9874
|
}
|
|
8688
9875
|
resetEditingState() {
|
|
8689
9876
|
this.editingCell = null;
|
|
@@ -8694,7 +9881,10 @@ class Datagrid {
|
|
|
8694
9881
|
this.cdr.markForCheck();
|
|
8695
9882
|
}
|
|
8696
9883
|
getRowId(rowIndex, row) {
|
|
8697
|
-
return this.
|
|
9884
|
+
return this.resolveRowMeta(row, rowIndex).id;
|
|
9885
|
+
}
|
|
9886
|
+
selectedDataRows() {
|
|
9887
|
+
return (this.data ?? []).filter((row, index) => this.selectedRowIds.has(this.getRowId(index, row)));
|
|
8698
9888
|
}
|
|
8699
9889
|
/** Apply selection ids and refresh checkbox UI (for programmatic / OnPush sync). */
|
|
8700
9890
|
setSelectionIds(ids, options) {
|
|
@@ -8706,7 +9896,7 @@ class Datagrid {
|
|
|
8706
9896
|
}
|
|
8707
9897
|
if (options?.emit !== false) {
|
|
8708
9898
|
this.selectionChange.emit({
|
|
8709
|
-
selected: this.
|
|
9899
|
+
selected: this.selectedDataRows(),
|
|
8710
9900
|
lastAction: null,
|
|
8711
9901
|
});
|
|
8712
9902
|
}
|
|
@@ -8725,6 +9915,7 @@ class Datagrid {
|
|
|
8725
9915
|
}
|
|
8726
9916
|
isRowReorderEnabled() {
|
|
8727
9917
|
return this.rowReorderable &&
|
|
9918
|
+
!this.isGroupingActive() &&
|
|
8728
9919
|
!this.sort.active &&
|
|
8729
9920
|
!this.hasActiveFilters() &&
|
|
8730
9921
|
!this.addingNew &&
|
|
@@ -8749,7 +9940,7 @@ class Datagrid {
|
|
|
8749
9940
|
this.saveAttemptedNew = false;
|
|
8750
9941
|
// Register a draft row with the edit service so implementations can track "new" state.
|
|
8751
9942
|
const service = this.getEditService();
|
|
8752
|
-
const draft =
|
|
9943
|
+
const draft = this.assignDraftValues({}, this.formDraftValues(this.addForm));
|
|
8753
9944
|
this.addDraftRowId = Symbol('ngb-datagrid-new-row');
|
|
8754
9945
|
service.create(this.data ?? [], draft, this.data.length, this.addDraftRowId);
|
|
8755
9946
|
this.cdr.markForCheck();
|
|
@@ -8763,7 +9954,7 @@ class Datagrid {
|
|
|
8763
9954
|
if (this.addForm.invalid)
|
|
8764
9955
|
return;
|
|
8765
9956
|
const service = this.getEditService();
|
|
8766
|
-
const newRow =
|
|
9957
|
+
const newRow = this.assignDraftValues({}, this.formDraftValues(this.addForm));
|
|
8767
9958
|
const rowIndex = this.data.length;
|
|
8768
9959
|
const rowId = this.addDraftRowId ?? this.getRowId(rowIndex, newRow);
|
|
8769
9960
|
service.create(this.data ?? [], newRow, rowIndex, rowId);
|
|
@@ -8799,15 +9990,14 @@ class Datagrid {
|
|
|
8799
9990
|
this.editingCell = null;
|
|
8800
9991
|
this.editingIndex = i;
|
|
8801
9992
|
const row = this.paged[i];
|
|
8802
|
-
this.editForm = this.buildFormFromRow(this.
|
|
9993
|
+
this.editForm = this.buildFormFromRow(this.toDraftValues(row));
|
|
8803
9994
|
this.saveAttemptedEdit = false;
|
|
8804
9995
|
const di = this.dataIndexOf(row);
|
|
8805
9996
|
const rowId = this.getRowId(di, this.data[di]);
|
|
8806
9997
|
// Start tracking baseline for the row (service can snapshot original state).
|
|
8807
9998
|
this.getEditService().update(this.data ?? [], this.data[di], di, rowId);
|
|
8808
9999
|
this.rowEdit.emit({ row: this.data[di], index: di });
|
|
8809
|
-
this.
|
|
8810
|
-
queueMicrotask(() => this.focusInlineEditor());
|
|
10000
|
+
this.scheduleViewRefresh(() => this.focusInlineEditor());
|
|
8811
10001
|
}
|
|
8812
10002
|
saveEdit(i) {
|
|
8813
10003
|
if (this.editingIndex !== i || !this.editForm)
|
|
@@ -8821,7 +10011,7 @@ class Datagrid {
|
|
|
8821
10011
|
const original = this.data[di];
|
|
8822
10012
|
const rowId = this.getRowId(di, original);
|
|
8823
10013
|
const service = this.getEditService();
|
|
8824
|
-
const updated =
|
|
10014
|
+
const updated = this.assignDraftValues(original, this.formDraftValues(this.editForm));
|
|
8825
10015
|
const next = service.update(this.data ?? [], updated, di, rowId);
|
|
8826
10016
|
this.data = service.saveChanges(next, di, rowId, updated);
|
|
8827
10017
|
this.invalidateDataCaches();
|
|
@@ -8845,7 +10035,7 @@ class Datagrid {
|
|
|
8845
10035
|
onNewDraftChange(col) {
|
|
8846
10036
|
if (this.draftNew) {
|
|
8847
10037
|
const key = this.keyOf(col);
|
|
8848
|
-
this.draftNew = this.
|
|
10038
|
+
this.draftNew = { ...this.draftNew, [key]: this.draftNew[key] };
|
|
8849
10039
|
}
|
|
8850
10040
|
this.validateInto(col, this.draftNew, this.errorsNew);
|
|
8851
10041
|
}
|
|
@@ -8895,7 +10085,7 @@ class Datagrid {
|
|
|
8895
10085
|
if (typeof key === 'function')
|
|
8896
10086
|
return key(row, rowIndex);
|
|
8897
10087
|
if (typeof key === 'string')
|
|
8898
|
-
return row
|
|
10088
|
+
return this.readFieldValue(row, key);
|
|
8899
10089
|
return rowIndex;
|
|
8900
10090
|
}
|
|
8901
10091
|
colKeyValue(column, colIndex) {
|
|
@@ -8903,7 +10093,7 @@ class Datagrid {
|
|
|
8903
10093
|
if (typeof key === 'function')
|
|
8904
10094
|
return key(column, colIndex);
|
|
8905
10095
|
if (typeof key === 'string')
|
|
8906
|
-
return column
|
|
10096
|
+
return this.readFieldValue(column, key);
|
|
8907
10097
|
return colIndex;
|
|
8908
10098
|
}
|
|
8909
10099
|
isRowHighlighted(row, rowIndex) {
|
|
@@ -8960,8 +10150,7 @@ class Datagrid {
|
|
|
8960
10150
|
this.syncFilterFormFromState();
|
|
8961
10151
|
}
|
|
8962
10152
|
onDocumentClick(event) {
|
|
8963
|
-
const
|
|
8964
|
-
const insideMenu = !!target?.closest('.grid-filter-menu-host, .grid-filter-operator, .grid-filter-operator-menu, .ngb-datagrid-floating-panel, .ngb-grid__filter-menu-overlay');
|
|
10153
|
+
const insideMenu = this.isEventInsideSelector(event, '.grid-filter-menu-host, .grid-filter-operator, .grid-filter-operator-menu, .ngb-datagrid-floating-panel, .ngb-grid__filter-menu-overlay');
|
|
8965
10154
|
if (insideMenu) {
|
|
8966
10155
|
return;
|
|
8967
10156
|
}
|
|
@@ -8970,11 +10159,27 @@ class Datagrid {
|
|
|
8970
10159
|
this.openRowFilterOperatorAnchor = null;
|
|
8971
10160
|
if (this.isIncellEditMode()) {
|
|
8972
10161
|
// Clicking outside the grid commits a valid in-cell edit and keeps invalid edits open.
|
|
8973
|
-
if (!
|
|
10162
|
+
if (!this.isEventInsideSelector(event, '.ngb-grid')) {
|
|
8974
10163
|
this.commitIncellEdit(true);
|
|
8975
10164
|
}
|
|
8976
10165
|
}
|
|
8977
10166
|
}
|
|
10167
|
+
isEventInsideSelector(event, selector) {
|
|
10168
|
+
const path = typeof event.composedPath === 'function' ? event.composedPath() : [];
|
|
10169
|
+
for (const node of path) {
|
|
10170
|
+
if (node instanceof Element && node.closest(selector)) {
|
|
10171
|
+
return true;
|
|
10172
|
+
}
|
|
10173
|
+
}
|
|
10174
|
+
const target = event.target;
|
|
10175
|
+
if (target instanceof Element) {
|
|
10176
|
+
return !!target.closest(selector);
|
|
10177
|
+
}
|
|
10178
|
+
if (target instanceof Node) {
|
|
10179
|
+
return !!target.parentElement?.closest(selector);
|
|
10180
|
+
}
|
|
10181
|
+
return false;
|
|
10182
|
+
}
|
|
8978
10183
|
canCancelToolbarEdit() {
|
|
8979
10184
|
return this.isToolbarEditMode() && (this.editingIndex != null || this.externalEditOpen);
|
|
8980
10185
|
}
|
|
@@ -9063,8 +10268,12 @@ class Datagrid {
|
|
|
9063
10268
|
this.expanded.add(i); // open the clicked row, or close all if it was open
|
|
9064
10269
|
}
|
|
9065
10270
|
else {
|
|
9066
|
-
|
|
9067
|
-
|
|
10271
|
+
if (isOpen) {
|
|
10272
|
+
this.expanded.delete(i);
|
|
10273
|
+
}
|
|
10274
|
+
else {
|
|
10275
|
+
this.expanded.add(i);
|
|
10276
|
+
}
|
|
9068
10277
|
}
|
|
9069
10278
|
}
|
|
9070
10279
|
isExpanded(i) {
|
|
@@ -9117,7 +10326,9 @@ class Datagrid {
|
|
|
9117
10326
|
this.cdr.markForCheck();
|
|
9118
10327
|
}
|
|
9119
10328
|
asBool(v) {
|
|
9120
|
-
|
|
10329
|
+
if (typeof v === 'boolean')
|
|
10330
|
+
return v;
|
|
10331
|
+
return typeof v === 'object' && v !== null && 'enabled' in v ? !!v.enabled : false;
|
|
9121
10332
|
}
|
|
9122
10333
|
triggerExport(kind) {
|
|
9123
10334
|
this.export(kind);
|
|
@@ -9129,8 +10340,7 @@ class Datagrid {
|
|
|
9129
10340
|
isRowSticky(row, pagedIndex) {
|
|
9130
10341
|
if (!this.stickyRows)
|
|
9131
10342
|
return false;
|
|
9132
|
-
const
|
|
9133
|
-
const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
|
|
10343
|
+
const { id } = this.resolveRowMeta(row, pagedIndex);
|
|
9134
10344
|
return this.stickyRowIds.has(id);
|
|
9135
10345
|
}
|
|
9136
10346
|
toggleStickyRow(pagedIndex) {
|
|
@@ -9139,8 +10349,7 @@ class Datagrid {
|
|
|
9139
10349
|
const row = this.paged[pagedIndex];
|
|
9140
10350
|
if (!row)
|
|
9141
10351
|
return;
|
|
9142
|
-
const
|
|
9143
|
-
const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
|
|
10352
|
+
const { id } = this.resolveRowMeta(row, pagedIndex);
|
|
9144
10353
|
if (this.stickyRowIds.has(id))
|
|
9145
10354
|
this.stickyRowIds.delete(id);
|
|
9146
10355
|
else
|
|
@@ -9193,8 +10402,7 @@ class Datagrid {
|
|
|
9193
10402
|
return this.selectionDisabledFn(row, di >= 0 ? di : pagedIndex);
|
|
9194
10403
|
}
|
|
9195
10404
|
isRowSelected(row, pagedIndex) {
|
|
9196
|
-
const
|
|
9197
|
-
const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
|
|
10405
|
+
const { id } = this.resolveRowMeta(row, pagedIndex);
|
|
9198
10406
|
return this.selectedRowIds.has(id);
|
|
9199
10407
|
}
|
|
9200
10408
|
toggleSelection(pagedIndex, event) {
|
|
@@ -9203,13 +10411,12 @@ class Datagrid {
|
|
|
9203
10411
|
const row = this.paged[pagedIndex];
|
|
9204
10412
|
if (!row || this.isSelectionDisabled(row, pagedIndex))
|
|
9205
10413
|
return;
|
|
9206
|
-
const
|
|
9207
|
-
const
|
|
10414
|
+
const { index: resolvedIndex, id } = this.resolveRowMeta(row, pagedIndex);
|
|
10415
|
+
const di = resolvedIndex >= 0 ? resolvedIndex : pagedIndex;
|
|
9208
10416
|
const currentlySelected = this.selectedRowIds.has(id);
|
|
9209
10417
|
const isMulti = this.selectionMode === 'multiple';
|
|
9210
10418
|
const desktop = this.selectionKeyMode === 'desktop';
|
|
9211
|
-
const shift
|
|
9212
|
-
const meta = desktop && !!(event && (('metaKey' in event && event.metaKey) || ('ctrlKey' in event && event.ctrlKey)));
|
|
10419
|
+
const { shift, meta } = this.readModifierKeys(event);
|
|
9213
10420
|
const fromCheckbox = !!(event?.target instanceof HTMLInputElement && event.target.type === 'checkbox');
|
|
9214
10421
|
if (!isMulti) {
|
|
9215
10422
|
this.selectedRowIds.clear();
|
|
@@ -9227,7 +10434,7 @@ class Datagrid {
|
|
|
9227
10434
|
const r = this.paged[i];
|
|
9228
10435
|
if (!r || this.isSelectionDisabled(r, i))
|
|
9229
10436
|
continue;
|
|
9230
|
-
const rid = this.
|
|
10437
|
+
const { id: rid } = this.resolveRowMeta(r, i);
|
|
9231
10438
|
this.selectedRowIds.add(rid);
|
|
9232
10439
|
}
|
|
9233
10440
|
this.emitSelection(row, di, true);
|
|
@@ -9250,7 +10457,7 @@ class Datagrid {
|
|
|
9250
10457
|
}
|
|
9251
10458
|
emitSelection(row, dataIndex, selected) {
|
|
9252
10459
|
this.selectionChange.emit({
|
|
9253
|
-
selected: this.
|
|
10460
|
+
selected: this.selectedDataRows(),
|
|
9254
10461
|
lastAction: { row, index: dataIndex, selected }
|
|
9255
10462
|
});
|
|
9256
10463
|
}
|
|
@@ -9261,30 +10468,55 @@ class Datagrid {
|
|
|
9261
10468
|
const allSelected = allSelectable.every((r, i) => this.isRowSelected(r, i));
|
|
9262
10469
|
if (allSelected) {
|
|
9263
10470
|
allSelectable.forEach((r, i) => {
|
|
9264
|
-
const rid = this.
|
|
10471
|
+
const { id: rid } = this.resolveRowMeta(r, i);
|
|
9265
10472
|
this.selectedRowIds.delete(rid);
|
|
9266
10473
|
});
|
|
9267
10474
|
}
|
|
9268
10475
|
else {
|
|
9269
10476
|
allSelectable.forEach((r, i) => {
|
|
9270
|
-
const rid = this.
|
|
10477
|
+
const { id: rid } = this.resolveRowMeta(r, i);
|
|
9271
10478
|
this.selectedRowIds.add(rid);
|
|
9272
10479
|
});
|
|
9273
10480
|
}
|
|
9274
10481
|
this.selectionChange.emit({
|
|
9275
|
-
selected: this.
|
|
10482
|
+
selected: this.selectedDataRows(),
|
|
9276
10483
|
lastAction: null
|
|
9277
10484
|
});
|
|
9278
10485
|
this.cdr.markForCheck();
|
|
9279
10486
|
}
|
|
9280
10487
|
isPageAllSelected() {
|
|
9281
|
-
|
|
9282
|
-
|
|
10488
|
+
let selectableCount = 0;
|
|
10489
|
+
for (let index = 0; index < this.paged.length; index++) {
|
|
10490
|
+
const row = this.paged[index];
|
|
10491
|
+
if (!row)
|
|
10492
|
+
continue;
|
|
10493
|
+
if (this.isSelectionDisabled(row, index))
|
|
10494
|
+
return false;
|
|
10495
|
+
selectableCount++;
|
|
10496
|
+
if (!this.isRowSelected(row, index))
|
|
10497
|
+
return false;
|
|
10498
|
+
}
|
|
10499
|
+
return selectableCount > 0;
|
|
9283
10500
|
}
|
|
9284
10501
|
isPageIndeterminate() {
|
|
9285
|
-
|
|
9286
|
-
|
|
9287
|
-
|
|
10502
|
+
let selectableCount = 0;
|
|
10503
|
+
let selectedCount = 0;
|
|
10504
|
+
let hasDisabledRows = false;
|
|
10505
|
+
for (let index = 0; index < this.paged.length; index++) {
|
|
10506
|
+
const row = this.paged[index];
|
|
10507
|
+
if (!row)
|
|
10508
|
+
continue;
|
|
10509
|
+
if (this.isSelectionDisabled(row, index)) {
|
|
10510
|
+
hasDisabledRows = true;
|
|
10511
|
+
continue;
|
|
10512
|
+
}
|
|
10513
|
+
selectableCount++;
|
|
10514
|
+
if (this.isRowSelected(row, index))
|
|
10515
|
+
selectedCount++;
|
|
10516
|
+
}
|
|
10517
|
+
if (selectedCount === 0)
|
|
10518
|
+
return false;
|
|
10519
|
+
return selectedCount < selectableCount || hasDisabledRows;
|
|
9288
10520
|
}
|
|
9289
10521
|
selectAllLabel() {
|
|
9290
10522
|
const labels = this.selectionA11yLabels || {};
|
|
@@ -9313,11 +10545,11 @@ class Datagrid {
|
|
|
9313
10545
|
this.toggleSelection(pagedIndex, ev);
|
|
9314
10546
|
}
|
|
9315
10547
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Datagrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9316
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: Datagrid, isStandalone: true, selector: "ngb-datagrid", inputs: { columns: "columns", data: "data", loading: "loading", total: "total", enableSorting: "enableSorting", enableFiltering: "enableFiltering", filterable: "filterable", enableGlobalFilter: "enableGlobalFilter", filterMode: "filterMode", filter: "filter", filterOperators: "filterOperators", filterManual: "filterManual", externalFiltering: "externalFiltering", dataOperations: "dataOperations", state: "state", multiCheckboxFilterOptions: "multiCheckboxFilterOptions", enablePagination: "enablePagination", pageable: "pageable", enableEdit: "enableEdit", enableDelete: "enableDelete", pageSizeOptions: "pageSizeOptions", enableAdd: "enableAdd", addButtonAriaLabel: "addButtonAriaLabel", addButtonText: "addButtonText", stickyRows: "stickyRows", stickyHeader: "stickyHeader", stickyFooter: "stickyFooter", scrollable: "scrollable", stickyRowHeight: "stickyRowHeight", stickyHeaderHeight: "stickyHeaderHeight", stickyFooterHeight: "stickyFooterHeight", tableOptions: "tableOptions", dataLayoutMode: "dataLayoutMode", selectionMode: "selectionMode", selectionBehavior: "selectionBehavior", selectionKeyMode: "selectionKeyMode", selectAllEnabled: "selectAllEnabled", selectionA11yLabels: "selectionA11yLabels", selectionDisabledFn: "selectionDisabledFn", highlightedIndex: "highlightedIndex", highlightRowKey: "highlightRowKey", highlightColKey: "highlightColKey", globalFilterAriaLabel: "globalFilterAriaLabel", globalFilterPlaceholder: "globalFilterPlaceholder", searchHighlightTerm: "searchHighlightTerm", searchHighlightFields: "searchHighlightFields", expandRowAriaLabel: "expandRowAriaLabel", collapseRowAriaLabel: "collapseRowAriaLabel", exportPdfAriaLabel: "exportPdfAriaLabel", exportExcelAriaLabel: "exportExcelAriaLabel", newRowDefaults: "newRowDefaults", strictEmail: "strictEmail", editOnRowClick: "editOnRowClick", editMode: "editMode", toolbarEditHint: "toolbarEditHint", singleExpand: "singleExpand", exportOptions: "exportOptions", theme: "theme", responsive: "responsive", trackBy: "trackBy", rowClass: "rowClass", rowStyle: "rowStyle", rowReorderable: "rowReorderable", columnReorderable: "columnReorderable", resizable: "resizable", actionDisplay: "actionDisplay", showStickyRowBadge: "showStickyRowBadge", stickyRowBadgeField: "stickyRowBadgeField", stickyRowBadgeLabel: "stickyRowBadgeLabel", labels: "labels", locale: "locale", dir: "dir", keyboardNavigation: "keyboardNavigation", editService: "editService", dataProviderAll: "dataProviderAll", dataProviderSelection: "dataProviderSelection", pageSize: "pageSize" }, outputs: { rowAdd: "rowAdd", rowEdit: "rowEdit", rowSave: "rowSave", rowCancel: "rowCancel", rowDelete: "rowDelete", sortChange: "sortChange", filterChange: "filterChange", filtersChange: "filtersChange", pageChange: "pageChange", dataStateChange: "dataStateChange", selectionChange: "selectionChange", rowReorder: "rowReorder", columnReorder: "columnReorder" }, host: { listeners: { "document:mousemove": "onDocumentMouseMove($event)", "document:mouseup": "onDocumentMouseUp()", "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscapeKey()" } }, providers: [
|
|
10548
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: Datagrid, isStandalone: true, selector: "ngb-datagrid", inputs: { columns: "columns", data: "data", loading: "loading", total: "total", enableSorting: "enableSorting", enableFiltering: "enableFiltering", filterable: "filterable", enableGlobalFilter: "enableGlobalFilter", filterMode: "filterMode", filter: "filter", filterOperators: "filterOperators", filterManual: "filterManual", externalFiltering: "externalFiltering", dataOperations: "dataOperations", groupable: "groupable", group: "group", groupedData: "groupedData", state: "state", multiCheckboxFilterOptions: "multiCheckboxFilterOptions", enablePagination: "enablePagination", pageable: "pageable", enableEdit: "enableEdit", enableDelete: "enableDelete", pageSizeOptions: "pageSizeOptions", enableAdd: "enableAdd", addButtonAriaLabel: "addButtonAriaLabel", addButtonText: "addButtonText", stickyRows: "stickyRows", stickyHeader: "stickyHeader", stickyFooter: "stickyFooter", scrollable: "scrollable", stickyRowHeight: "stickyRowHeight", stickyHeaderHeight: "stickyHeaderHeight", stickyFooterHeight: "stickyFooterHeight", tableOptions: "tableOptions", dataLayoutMode: "dataLayoutMode", selectionMode: "selectionMode", selectionBehavior: "selectionBehavior", selectionKeyMode: "selectionKeyMode", selectAllEnabled: "selectAllEnabled", selectionA11yLabels: "selectionA11yLabels", selectionDisabledFn: "selectionDisabledFn", highlightedIndex: "highlightedIndex", highlightRowKey: "highlightRowKey", highlightColKey: "highlightColKey", globalFilterAriaLabel: "globalFilterAriaLabel", globalFilterPlaceholder: "globalFilterPlaceholder", searchHighlightTerm: "searchHighlightTerm", searchHighlightFields: "searchHighlightFields", expandRowAriaLabel: "expandRowAriaLabel", collapseRowAriaLabel: "collapseRowAriaLabel", exportPdfAriaLabel: "exportPdfAriaLabel", exportExcelAriaLabel: "exportExcelAriaLabel", newRowDefaults: "newRowDefaults", strictEmail: "strictEmail", editOnRowClick: "editOnRowClick", editMode: "editMode", toolbarEditHint: "toolbarEditHint", singleExpand: "singleExpand", exportOptions: "exportOptions", theme: "theme", responsive: "responsive", trackBy: "trackBy", rowClass: "rowClass", rowStyle: "rowStyle", rowReorderable: "rowReorderable", columnReorderable: "columnReorderable", resizable: "resizable", actionDisplay: "actionDisplay", showStickyRowBadge: "showStickyRowBadge", stickyRowBadgeField: "stickyRowBadgeField", stickyRowBadgeLabel: "stickyRowBadgeLabel", labels: "labels", locale: "locale", dir: "dir", keyboardNavigation: "keyboardNavigation", editService: "editService", dataProviderAll: "dataProviderAll", dataProviderSelection: "dataProviderSelection", pageSize: "pageSize" }, outputs: { rowAdd: "rowAdd", rowEdit: "rowEdit", rowSave: "rowSave", rowCancel: "rowCancel", rowDelete: "rowDelete", groupChange: "groupChange", sortChange: "sortChange", filterChange: "filterChange", filtersChange: "filtersChange", pageChange: "pageChange", dataStateChange: "dataStateChange", selectionChange: "selectionChange", rowReorder: "rowReorder", columnReorder: "columnReorder" }, host: { listeners: { "window:resize": "onWindowResize()", "document:mousemove": "onDocumentMouseMove($event)", "document:mouseup": "onDocumentMouseUp()", "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscapeKey()" } }, providers: [
|
|
9317
10549
|
{ provide: PdfExportAdapter, useClass: JsPdfAdapter },
|
|
9318
10550
|
{ provide: ExcelExportAdapter, useClass: BrowserExcelExportAdapter },
|
|
9319
10551
|
{ provide: NGB_DATAGRID_HOST, useExisting: forwardRef(() => Datagrid) },
|
|
9320
|
-
], queries: [{ propertyName: "exportButtonDir", first: true, predicate: ExportButtonDirective, descendants: true }, { propertyName: "rowDetailTpl", first: true, predicate: NgbRowDetailTemplate, descendants: true }, { propertyName: "pagerTpl", first: true, predicate: NgbPagerTemplate, descendants: true }, { propertyName: "cellTplQ", predicate: NgbCellTemplate }, { propertyName: "editTplQ", predicate: NgbEditorTemplate }, { propertyName: "filterTplQ", predicate: NgbFilterTemplate }, { propertyName: "filterMenuTplQ", predicate: NgbFilterMenuTemplate }, { propertyName: "globalTplQ", predicate: NgbGlobalFilterTemplate }, { propertyName: "gridColumnQ", predicate: NgbGridColumnDirective }], viewQueries: [{ propertyName: "bodyScroller", first: true, predicate: ["bodyScroller"], descendants: true }, { propertyName: "headerScroller", first: true, predicate: ["headerScroller"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n <table\n class=\"grid-table grid-body mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!paged.length) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (row of paged; track trackRow($index, row); let i = $index) {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [selected]=\"isRowSelected(row, i)\"\n [ngbDndItem]=\"row\"\n [dndIndex]=\"i\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, i); onRowClick($event, i)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(row, i)\"\n [class.row-selected]=\"isRowSelected(row, i)\"\n [class.row-highlight]=\"isRowHighlighted(row, i)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(row, i)\"\n [ngStyle]=\"resolveRowStyle(row, i)\"\n [attr.aria-selected]=\"isRowSelected(row, i) ? 'true' : null\"\n [style.top.px]=\"stickyTop(row, i)\"\n [style.z-index]=\"isRowSticky(row, i) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(i)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [attr.id]=\"'dg-row-detail-' + i\"\n ></tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text)}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:0 .1rem;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.55;line-height:1}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbSyncColgroupDirective, selector: "[ngbSyncColgroup]", inputs: ["ngbSyncColgroup", "syncRole", "syncMode"] }, { kind: "component", type: NgbDatagridToolbarComponent, selector: "ngb-datagrid-toolbar", inputs: ["grid"] }, { kind: "component", type: NgbDatagridEditingToolbarComponent, selector: "ngb-datagrid-editing-toolbar", inputs: ["grid", "selectedCount", "editActive", "saveDisabled"] }, { kind: "component", type: NgbDatagridExternalEditorComponent, selector: "ngb-datagrid-external-editor", inputs: ["grid"] }, { kind: "component", type: NgbDatagridColgroupComponent, selector: "colgroup[ngbDatagridColgroup]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridHeaderComponent, selector: "thead[ngbDatagridHeader]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridFilterMenuPanelComponent, selector: "ngb-datagrid-filter-menu-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridRowFilterOperatorPanelComponent, selector: "ngb-datagrid-row-filter-operator-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridAddRowComponent, selector: "tr[ngbDatagridAddRow]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridDataRowComponent, selector: "tr[ngbDatagridDataRow]", inputs: ["grid", "row", "index", "selected"] }, { kind: "component", type: NgbDatagridDetailRowComponent, selector: "tr[ngbDatagridDetailRow]", inputs: ["grid", "row", "index"] }, { kind: "component", type: NgbDatagridFooterComponent, selector: "ngb-datagrid-footer", inputs: ["grid", "placement"] }, { kind: "directive", type: NgbDndListDirective, selector: "[ngbDndList]", inputs: ["dndChildrenKey", "ngbDndList", "dndGroup", "dndDisabled", "dndCloneOnDrop", "dndCloneFn", "dndIsPalette", "dndCanDrop", "dndAriaLabel"], outputs: ["dndDropped"] }, { kind: "directive", type: NgbDndItemDirective, selector: "[ngbDndItem]", inputs: ["ngbDndItem", "dndGroup", "dndIndex", "dndSourceList", "dndDisabled"], outputs: ["dndDragStart", "dndDragEnd"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
10552
|
+
], queries: [{ propertyName: "exportButtonDir", first: true, predicate: ExportButtonDirective, descendants: true }, { propertyName: "rowDetailTpl", first: true, predicate: NgbRowDetailTemplate, descendants: true }, { propertyName: "pagerTpl", first: true, predicate: NgbPagerTemplate, descendants: true }, { propertyName: "groupHeaderTpl", first: true, predicate: NgbDataGridGroupHeaderTemplateDirective, descendants: true }, { propertyName: "cellTplQ", predicate: NgbCellTemplate }, { propertyName: "editTplQ", predicate: NgbEditorTemplate }, { propertyName: "filterTplQ", predicate: NgbFilterTemplate }, { propertyName: "filterMenuTplQ", predicate: NgbFilterMenuTemplate }, { propertyName: "globalTplQ", predicate: NgbGlobalFilterTemplate }, { propertyName: "groupHeaderColumnTplQ", predicate: NgbDataGridGroupHeaderColumnTemplateDirective }, { propertyName: "groupFooterTplQ", predicate: NgbDataGridGroupFooterTemplateDirective }, { propertyName: "gridColumnQ", predicate: NgbGridColumnDirective }], viewQueries: [{ propertyName: "bodyScroller", first: true, predicate: ["bodyScroller"], descendants: true }, { propertyName: "headerScroller", first: true, predicate: ["headerScroller"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n [style.--ngb-render-tick]=\"renderTick\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n @if (isGroupingEnabled()) {\n <div\n class=\"ngb-grid__group-panel\"\n [class.ngb-grid__group-panel--active]=\"groupPanelDragActive && !groupPanelDragDenied\"\n [class.ngb-grid__group-panel--denied]=\"groupPanelDragDenied\"\n (dragover)=\"onGroupPanelDragOver($event)\"\n (dragleave)=\"onGroupPanelDragLeave($event)\"\n (drop)=\"onGroupPanelDrop($event)\"\n >\n <div class=\"ngb-grid__group-panel-label\">{{ groupPanelLabel() }}</div>\n @if (groupedColumns().length) {\n <div class=\"ngb-grid__group-chip-list\">\n @for (descriptor of groupedColumns(); track descriptor.field) {\n <div class=\"ngb-grid__group-chip\">\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-button\"\n (click)=\"toggleGroupDirection(descriptor.field)\"\n [attr.aria-label]=\"groupDirectionAriaLabel(descriptor)\"\n >\n <span class=\"ngb-grid__group-chip-label\">{{ groupFieldLabel(descriptor) }}</span>\n <span class=\"ngb-grid__group-chip-dir\">{{ descriptor.dir === 'desc' ? '\u2193' : '\u2191' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-remove\"\n (click)=\"removeGroupField(descriptor.field)\"\n [attr.aria-label]=\"groupRemoveAriaLabel(descriptor)\"\n >\n <span class=\"bi bi-x-lg\" aria-hidden=\"true\"></span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n @if (hasStickyGroupHeaders()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--top\"\n [style.transform]=\"'translateY(' + stickyGroupHeaderTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupHeaderRows; track item.key) {\n <tr class=\"grid-group-row grid-group-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <table\n class=\"grid-table grid-body grid-body--main mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!hasRenderableRows()) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (item of renderRows; track item.key) {\n @if (item.kind === 'group') {\n <tr\n class=\"grid-group-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else if (item.kind === 'group-footer') {\n <tr\n class=\"grid-group-footer-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [ngbDndItem]=\"item.row\"\n [dndIndex]=\"item.pagedIndex\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, item.pagedIndex); onRowClick($event, item.pagedIndex)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(item.row, item.pagedIndex)\"\n [class.row-selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [class.row-highlight]=\"isRowHighlighted(item.row, item.pagedIndex)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(item.row, item.pagedIndex)\"\n [ngStyle]=\"resolveRowStyle(item.row, item.pagedIndex)\"\n [attr.aria-selected]=\"isRowSelected(item.row, item.pagedIndex) ? 'true' : null\"\n [style.top.px]=\"stickyTop(item.row, item.pagedIndex)\"\n [style.z-index]=\"isRowSticky(item.row, item.pagedIndex) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(item.pagedIndex)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [attr.id]=\"'dg-row-detail-' + item.pagedIndex\"\n ></tr>\n }\n }\n }\n </tbody>\n </table>\n\n @if (hasStickyGroupFooters()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--bottom\"\n [style.transform]=\"'translateY(' + stickyGroupFooterTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupFooterRows; track item.key) {\n <tr class=\"grid-group-footer-row grid-group-footer-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text);--dg-group-sticky-row-height: 3rem}.ngb-grid.ngb-grid--compact{--dg-group-sticky-row-height: 2.5rem}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .ngb-grid__group-panel{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;min-height:3.25rem;margin-bottom:.9rem;padding:.75rem .9rem;border:1px dashed var(--dg-border-strong);border-radius:var(--dg-radius-md);background:color-mix(in srgb,var(--dg-surface-muted) 72%,white);transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.ngb-grid .ngb-grid__group-panel--active{border-color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 45%,white);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--dg-primary) 22%,transparent)}.ngb-grid .ngb-grid__group-panel--denied{border-color:var(--dg-danger, #dc3545);background:color-mix(in srgb,var(--dg-danger, #dc3545) 8%,white)}.ngb-grid .ngb-grid__group-panel-label{font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-list{display:inline-flex;align-items:center;gap:.55rem;flex-wrap:wrap}.ngb-grid .ngb-grid__group-chip{display:inline-flex;align-items:center;gap:.25rem;border:1px solid color-mix(in srgb,var(--dg-primary) 26%,var(--dg-border));border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .ngb-grid__group-chip-button,.ngb-grid .ngb-grid__group-chip-remove{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;border:0;background:transparent;color:var(--dg-text)}.ngb-grid .ngb-grid__group-chip-button{padding:.35rem .55rem .35rem .8rem;font-size:.8125rem;font-weight:600}.ngb-grid .ngb-grid__group-chip-remove{padding:.35rem .75rem .35rem .15rem;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-button:hover,.ngb-grid .ngb-grid__group-chip-remove:hover{color:var(--dg-primary)}.ngb-grid .ngb-grid__group-chip-button:focus-visible,.ngb-grid .ngb-grid__group-chip-remove:focus-visible,.ngb-grid .grid-column-group-handle:focus-visible,.ngb-grid .grid-group-row__toggle:focus-visible{outline:none;box-shadow:var(--dg-focus-shadow);border-radius:999px}.ngb-grid .ngb-grid__group-chip-dir{font-size:.8rem;color:var(--dg-primary)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .ngb-grid__group-sticky-layer{position:absolute;inset-inline-start:0;z-index:35;min-width:100%;pointer-events:none}.ngb-grid .ngb-grid__group-sticky-layer--top,.ngb-grid .ngb-grid__group-sticky-layer--bottom{top:0}.ngb-grid .grid-group-sticky-table{min-width:100%;pointer-events:auto}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:.1rem .18rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.82;line-height:1;font-size:.95rem}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1;background:color-mix(in srgb,var(--dg-accent) 12%,transparent)}.ngb-grid .grid-column-group-handle{flex:0 0 auto;padding:.15rem .25rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;font-size:.9rem}.ngb-grid .grid-column-group-handle--active,.ngb-grid .grid-column-group-handle:hover{color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 55%,transparent)}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-group-row td,.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 88%,white);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-group-row--overlay td{box-shadow:inset 0 -1px 0 var(--dg-border),0 1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-footer-row--overlay td{box-shadow:inset 0 1px 0 var(--dg-border),0 -1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-row__cell{padding:0;vertical-align:top}.ngb-grid .grid-group-footer-row__cell,.ngb-grid .grid-group-row__utility-cell{padding:.7rem .75rem;vertical-align:top}.ngb-grid .grid-group-row__toggle{display:flex;align-items:center;gap:.55rem;width:100%;padding:.7rem 1rem;border:0;background:transparent;color:var(--dg-text);text-align:left;font-size:.875rem;font-weight:600}.ngb-grid .grid-group-row__cell--lead .grid-group-row__toggle{padding-inline-end:.75rem}.ngb-grid .grid-group-row__toggle:hover{background:color-mix(in srgb,var(--dg-primary-soft) 34%,transparent)}.ngb-grid .grid-group-row__content{display:inline-flex;align-items:center;gap:.5rem;min-width:0}.ngb-grid .grid-group-row__label{color:var(--dg-text)}.ngb-grid .grid-group-row__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__column-slot{padding:.25rem .75rem .75rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__cell--lead .grid-group-row__column-slot{padding-inline-start:2.75rem}.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 94%,white)}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content,.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content *{pointer-events:none}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbSyncColgroupDirective, selector: "[ngbSyncColgroup]", inputs: ["ngbSyncColgroup", "syncRole", "syncMode"] }, { kind: "component", type: NgbDatagridToolbarComponent, selector: "ngb-datagrid-toolbar", inputs: ["grid"] }, { kind: "component", type: NgbDatagridEditingToolbarComponent, selector: "ngb-datagrid-editing-toolbar", inputs: ["grid", "selectedCount", "editActive", "saveDisabled"] }, { kind: "component", type: NgbDatagridExternalEditorComponent, selector: "ngb-datagrid-external-editor", inputs: ["grid"] }, { kind: "component", type: NgbDatagridColgroupComponent, selector: "colgroup[ngbDatagridColgroup]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridHeaderComponent, selector: "thead[ngbDatagridHeader]", inputs: ["grid", "renderTick"] }, { kind: "component", type: NgbDatagridFilterMenuPanelComponent, selector: "ngb-datagrid-filter-menu-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridRowFilterOperatorPanelComponent, selector: "ngb-datagrid-row-filter-operator-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridAddRowComponent, selector: "tr[ngbDatagridAddRow]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridDataRowComponent, selector: "tr[ngbDatagridDataRow]", inputs: ["grid", "renderTick", "row", "index", "selected"] }, { kind: "component", type: NgbDatagridDetailRowComponent, selector: "tr[ngbDatagridDetailRow]", inputs: ["grid", "row", "index"] }, { kind: "component", type: NgbDatagridFooterComponent, selector: "ngb-datagrid-footer", inputs: ["grid", "placement"] }, { kind: "directive", type: NgbDndListDirective, selector: "[ngbDndList]", inputs: ["dndChildrenKey", "ngbDndList", "dndGroup", "dndDisabled", "dndCloneOnDrop", "dndCloneFn", "dndIsPalette", "dndCanDrop", "dndAriaLabel"], outputs: ["dndDropped"] }, { kind: "directive", type: NgbDndItemDirective, selector: "[ngbDndItem]", inputs: ["ngbDndItem", "dndGroup", "dndIndex", "dndSourceList", "dndDisabled"], outputs: ["dndDragStart", "dndDragEnd"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
9321
10553
|
}
|
|
9322
10554
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Datagrid, decorators: [{
|
|
9323
10555
|
type: Component,
|
|
@@ -9344,7 +10576,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
9344
10576
|
{ provide: PdfExportAdapter, useClass: JsPdfAdapter },
|
|
9345
10577
|
{ provide: ExcelExportAdapter, useClass: BrowserExcelExportAdapter },
|
|
9346
10578
|
{ provide: NGB_DATAGRID_HOST, useExisting: forwardRef(() => Datagrid) },
|
|
9347
|
-
], standalone: true, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n <table\n class=\"grid-table grid-body mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!paged.length) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (row of paged; track trackRow($index, row); let i = $index) {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [selected]=\"isRowSelected(row, i)\"\n [ngbDndItem]=\"row\"\n [dndIndex]=\"i\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, i); onRowClick($event, i)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(row, i)\"\n [class.row-selected]=\"isRowSelected(row, i)\"\n [class.row-highlight]=\"isRowHighlighted(row, i)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(row, i)\"\n [ngStyle]=\"resolveRowStyle(row, i)\"\n [attr.aria-selected]=\"isRowSelected(row, i) ? 'true' : null\"\n [style.top.px]=\"stickyTop(row, i)\"\n [style.z-index]=\"isRowSticky(row, i) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(i)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [attr.id]=\"'dg-row-detail-' + i\"\n ></tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text)}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:0 .1rem;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.55;line-height:1}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"] }]
|
|
10579
|
+
], standalone: true, template: "<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n [style.--ngb-render-tick]=\"renderTick\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n @if (isGroupingEnabled()) {\n <div\n class=\"ngb-grid__group-panel\"\n [class.ngb-grid__group-panel--active]=\"groupPanelDragActive && !groupPanelDragDenied\"\n [class.ngb-grid__group-panel--denied]=\"groupPanelDragDenied\"\n (dragover)=\"onGroupPanelDragOver($event)\"\n (dragleave)=\"onGroupPanelDragLeave($event)\"\n (drop)=\"onGroupPanelDrop($event)\"\n >\n <div class=\"ngb-grid__group-panel-label\">{{ groupPanelLabel() }}</div>\n @if (groupedColumns().length) {\n <div class=\"ngb-grid__group-chip-list\">\n @for (descriptor of groupedColumns(); track descriptor.field) {\n <div class=\"ngb-grid__group-chip\">\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-button\"\n (click)=\"toggleGroupDirection(descriptor.field)\"\n [attr.aria-label]=\"groupDirectionAriaLabel(descriptor)\"\n >\n <span class=\"ngb-grid__group-chip-label\">{{ groupFieldLabel(descriptor) }}</span>\n <span class=\"ngb-grid__group-chip-dir\">{{ descriptor.dir === 'desc' ? '\u2193' : '\u2191' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-remove\"\n (click)=\"removeGroupField(descriptor.field)\"\n [attr.aria-label]=\"groupRemoveAriaLabel(descriptor)\"\n >\n <span class=\"bi bi-x-lg\" aria-hidden=\"true\"></span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n @if (hasStickyGroupHeaders()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--top\"\n [style.transform]=\"'translateY(' + stickyGroupHeaderTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupHeaderRows; track item.key) {\n <tr class=\"grid-group-row grid-group-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <table\n class=\"grid-table grid-body grid-body--main mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!hasRenderableRows()) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (item of renderRows; track item.key) {\n @if (item.kind === 'group') {\n <tr\n class=\"grid-group-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else if (item.kind === 'group-footer') {\n <tr\n class=\"grid-group-footer-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [ngbDndItem]=\"item.row\"\n [dndIndex]=\"item.pagedIndex\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, item.pagedIndex); onRowClick($event, item.pagedIndex)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(item.row, item.pagedIndex)\"\n [class.row-selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [class.row-highlight]=\"isRowHighlighted(item.row, item.pagedIndex)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(item.row, item.pagedIndex)\"\n [ngStyle]=\"resolveRowStyle(item.row, item.pagedIndex)\"\n [attr.aria-selected]=\"isRowSelected(item.row, item.pagedIndex) ? 'true' : null\"\n [style.top.px]=\"stickyTop(item.row, item.pagedIndex)\"\n [style.z-index]=\"isRowSticky(item.row, item.pagedIndex) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(item.pagedIndex)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [attr.id]=\"'dg-row-detail-' + item.pagedIndex\"\n ></tr>\n }\n }\n }\n </tbody>\n </table>\n\n @if (hasStickyGroupFooters()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--bottom\"\n [style.transform]=\"'translateY(' + stickyGroupFooterTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupFooterRows; track item.key) {\n <tr class=\"grid-group-footer-row grid-group-footer-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text);--dg-group-sticky-row-height: 3rem}.ngb-grid.ngb-grid--compact{--dg-group-sticky-row-height: 2.5rem}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .ngb-grid__group-panel{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;min-height:3.25rem;margin-bottom:.9rem;padding:.75rem .9rem;border:1px dashed var(--dg-border-strong);border-radius:var(--dg-radius-md);background:color-mix(in srgb,var(--dg-surface-muted) 72%,white);transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.ngb-grid .ngb-grid__group-panel--active{border-color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 45%,white);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--dg-primary) 22%,transparent)}.ngb-grid .ngb-grid__group-panel--denied{border-color:var(--dg-danger, #dc3545);background:color-mix(in srgb,var(--dg-danger, #dc3545) 8%,white)}.ngb-grid .ngb-grid__group-panel-label{font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-list{display:inline-flex;align-items:center;gap:.55rem;flex-wrap:wrap}.ngb-grid .ngb-grid__group-chip{display:inline-flex;align-items:center;gap:.25rem;border:1px solid color-mix(in srgb,var(--dg-primary) 26%,var(--dg-border));border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .ngb-grid__group-chip-button,.ngb-grid .ngb-grid__group-chip-remove{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;border:0;background:transparent;color:var(--dg-text)}.ngb-grid .ngb-grid__group-chip-button{padding:.35rem .55rem .35rem .8rem;font-size:.8125rem;font-weight:600}.ngb-grid .ngb-grid__group-chip-remove{padding:.35rem .75rem .35rem .15rem;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-button:hover,.ngb-grid .ngb-grid__group-chip-remove:hover{color:var(--dg-primary)}.ngb-grid .ngb-grid__group-chip-button:focus-visible,.ngb-grid .ngb-grid__group-chip-remove:focus-visible,.ngb-grid .grid-column-group-handle:focus-visible,.ngb-grid .grid-group-row__toggle:focus-visible{outline:none;box-shadow:var(--dg-focus-shadow);border-radius:999px}.ngb-grid .ngb-grid__group-chip-dir{font-size:.8rem;color:var(--dg-primary)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .ngb-grid__group-sticky-layer{position:absolute;inset-inline-start:0;z-index:35;min-width:100%;pointer-events:none}.ngb-grid .ngb-grid__group-sticky-layer--top,.ngb-grid .ngb-grid__group-sticky-layer--bottom{top:0}.ngb-grid .grid-group-sticky-table{min-width:100%;pointer-events:auto}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:.1rem .18rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.82;line-height:1;font-size:.95rem}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1;background:color-mix(in srgb,var(--dg-accent) 12%,transparent)}.ngb-grid .grid-column-group-handle{flex:0 0 auto;padding:.15rem .25rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;font-size:.9rem}.ngb-grid .grid-column-group-handle--active,.ngb-grid .grid-column-group-handle:hover{color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 55%,transparent)}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-group-row td,.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 88%,white);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-group-row--overlay td{box-shadow:inset 0 -1px 0 var(--dg-border),0 1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-footer-row--overlay td{box-shadow:inset 0 1px 0 var(--dg-border),0 -1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-row__cell{padding:0;vertical-align:top}.ngb-grid .grid-group-footer-row__cell,.ngb-grid .grid-group-row__utility-cell{padding:.7rem .75rem;vertical-align:top}.ngb-grid .grid-group-row__toggle{display:flex;align-items:center;gap:.55rem;width:100%;padding:.7rem 1rem;border:0;background:transparent;color:var(--dg-text);text-align:left;font-size:.875rem;font-weight:600}.ngb-grid .grid-group-row__cell--lead .grid-group-row__toggle{padding-inline-end:.75rem}.ngb-grid .grid-group-row__toggle:hover{background:color-mix(in srgb,var(--dg-primary-soft) 34%,transparent)}.ngb-grid .grid-group-row__content{display:inline-flex;align-items:center;gap:.5rem;min-width:0}.ngb-grid .grid-group-row__label{color:var(--dg-text)}.ngb-grid .grid-group-row__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__column-slot{padding:.25rem .75rem .75rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__cell--lead .grid-group-row__column-slot{padding-inline-start:2.75rem}.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 94%,white)}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content,.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content *{pointer-events:none}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"] }]
|
|
9348
10580
|
}], propDecorators: { columns: [{
|
|
9349
10581
|
type: Input
|
|
9350
10582
|
}], data: [{
|
|
@@ -9373,6 +10605,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
9373
10605
|
type: Input
|
|
9374
10606
|
}], dataOperations: [{
|
|
9375
10607
|
type: Input
|
|
10608
|
+
}], groupable: [{
|
|
10609
|
+
type: Input
|
|
10610
|
+
}], group: [{
|
|
10611
|
+
type: Input
|
|
10612
|
+
}], groupedData: [{
|
|
10613
|
+
type: Input
|
|
9376
10614
|
}], state: [{
|
|
9377
10615
|
type: Input
|
|
9378
10616
|
}], multiCheckboxFilterOptions: [{
|
|
@@ -9516,6 +10754,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
9516
10754
|
type: Output
|
|
9517
10755
|
}], rowDelete: [{
|
|
9518
10756
|
type: Output
|
|
10757
|
+
}], groupChange: [{
|
|
10758
|
+
type: Output
|
|
9519
10759
|
}], sortChange: [{
|
|
9520
10760
|
type: Output
|
|
9521
10761
|
}], filterChange: [{
|
|
@@ -9538,8 +10778,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
9538
10778
|
}], pagerTpl: [{
|
|
9539
10779
|
type: ContentChild,
|
|
9540
10780
|
args: [NgbPagerTemplate]
|
|
10781
|
+
}], groupHeaderTpl: [{
|
|
10782
|
+
type: ContentChild,
|
|
10783
|
+
args: [NgbDataGridGroupHeaderTemplateDirective]
|
|
9541
10784
|
}], pageSize: [{
|
|
9542
10785
|
type: Input
|
|
10786
|
+
}], onWindowResize: [{
|
|
10787
|
+
type: HostListener,
|
|
10788
|
+
args: ['window:resize']
|
|
9543
10789
|
}], onDocumentMouseMove: [{
|
|
9544
10790
|
type: HostListener,
|
|
9545
10791
|
args: ['document:mousemove', ['$event']]
|
|
@@ -9561,6 +10807,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
9561
10807
|
}], globalTplQ: [{
|
|
9562
10808
|
type: ContentChildren,
|
|
9563
10809
|
args: [NgbGlobalFilterTemplate]
|
|
10810
|
+
}], groupHeaderColumnTplQ: [{
|
|
10811
|
+
type: ContentChildren,
|
|
10812
|
+
args: [NgbDataGridGroupHeaderColumnTemplateDirective]
|
|
10813
|
+
}], groupFooterTplQ: [{
|
|
10814
|
+
type: ContentChildren,
|
|
10815
|
+
args: [NgbDataGridGroupFooterTemplateDirective]
|
|
9564
10816
|
}], gridColumnQ: [{
|
|
9565
10817
|
type: ContentChildren,
|
|
9566
10818
|
args: [NgbGridColumnDirective]
|
|
@@ -11289,7 +12541,7 @@ class NgbGridChartComponent {
|
|
|
11289
12541
|
</div>
|
|
11290
12542
|
}
|
|
11291
12543
|
</div>
|
|
11292
|
-
`, isInline: true, styles: [":host{display:block}.ngb-grid-chart__split-layout,.ngb-grid-chart__full-layout{display:grid;gap:1rem;align-items:stretch}.ngb-grid-chart__split-layout{grid-template-columns:minmax(0,1.15fr) minmax(280px,.85fr)}.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.ngb-grid-chart__grid-pane,.ngb-grid-chart__chart-pane,.ngb-grid-chart__summary-pane{min-width:0}.ngb-grid-chart__chart-pane{display:flex;flex-direction:column;gap:.5rem}.ngb-grid-chart__dimension{display:inline-flex;align-items:flex-start;gap:.55rem;min-width:0}.ngb-grid-chart__subdimension{display:block;font-size:.82rem;color:#6b7280;font-weight:500}.ngb-grid-chart__series-dot{width:.55rem;height:.55rem;border-radius:999px;margin-top:.35rem;flex:0 0 auto}.ngb-grid-chart__growth{font-weight:700}.ngb-grid-chart__growth--up{color:#16a34a}.ngb-grid-chart__growth--down{color:#ef4444}@media(max-width:960px){.ngb-grid-chart__split-layout,.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Datagrid, selector: "ngb-datagrid", inputs: ["columns", "data", "loading", "total", "enableSorting", "enableFiltering", "filterable", "enableGlobalFilter", "filterMode", "filter", "filterOperators", "filterManual", "externalFiltering", "dataOperations", "state", "multiCheckboxFilterOptions", "enablePagination", "pageable", "enableEdit", "enableDelete", "pageSizeOptions", "enableAdd", "addButtonAriaLabel", "addButtonText", "stickyRows", "stickyHeader", "stickyFooter", "scrollable", "stickyRowHeight", "stickyHeaderHeight", "stickyFooterHeight", "tableOptions", "dataLayoutMode", "selectionMode", "selectionBehavior", "selectionKeyMode", "selectAllEnabled", "selectionA11yLabels", "selectionDisabledFn", "highlightedIndex", "highlightRowKey", "highlightColKey", "globalFilterAriaLabel", "globalFilterPlaceholder", "searchHighlightTerm", "searchHighlightFields", "expandRowAriaLabel", "collapseRowAriaLabel", "exportPdfAriaLabel", "exportExcelAriaLabel", "newRowDefaults", "strictEmail", "editOnRowClick", "editMode", "toolbarEditHint", "singleExpand", "exportOptions", "theme", "responsive", "trackBy", "rowClass", "rowStyle", "rowReorderable", "columnReorderable", "resizable", "actionDisplay", "showStickyRowBadge", "stickyRowBadgeField", "stickyRowBadgeLabel", "labels", "locale", "dir", "keyboardNavigation", "editService", "dataProviderAll", "dataProviderSelection", "pageSize"], outputs: ["rowAdd", "rowEdit", "rowSave", "rowCancel", "rowDelete", "sortChange", "filterChange", "filtersChange", "pageChange", "dataStateChange", "selectionChange", "rowReorder", "columnReorder"] }, { kind: "directive", type: NgbCellTemplate, selector: "ng-template[ngbCell]", inputs: ["ngbCell"] }, { kind: "component", type: NgbDataChartComponent, selector: "ngb-data-chart", inputs: ["config", "ariaLabel", "emptyState"] }, { kind: "component", type: NgbDataSparklineComponent, selector: "ngb-data-sparkline", inputs: ["values", "width", "height", "strokeWidth", "positiveColor", "negativeColor", "neutralColor", "color", "showEndDot", "endDotRadius", "ariaLabel"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
12544
|
+
`, isInline: true, styles: [":host{display:block}.ngb-grid-chart__split-layout,.ngb-grid-chart__full-layout{display:grid;gap:1rem;align-items:stretch}.ngb-grid-chart__split-layout{grid-template-columns:minmax(0,1.15fr) minmax(280px,.85fr)}.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.ngb-grid-chart__grid-pane,.ngb-grid-chart__chart-pane,.ngb-grid-chart__summary-pane{min-width:0}.ngb-grid-chart__chart-pane{display:flex;flex-direction:column;gap:.5rem}.ngb-grid-chart__dimension{display:inline-flex;align-items:flex-start;gap:.55rem;min-width:0}.ngb-grid-chart__subdimension{display:block;font-size:.82rem;color:#6b7280;font-weight:500}.ngb-grid-chart__series-dot{width:.55rem;height:.55rem;border-radius:999px;margin-top:.35rem;flex:0 0 auto}.ngb-grid-chart__growth{font-weight:700}.ngb-grid-chart__growth--up{color:#16a34a}.ngb-grid-chart__growth--down{color:#ef4444}@media(max-width:960px){.ngb-grid-chart__split-layout,.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Datagrid, selector: "ngb-datagrid", inputs: ["columns", "data", "loading", "total", "enableSorting", "enableFiltering", "filterable", "enableGlobalFilter", "filterMode", "filter", "filterOperators", "filterManual", "externalFiltering", "dataOperations", "groupable", "group", "groupedData", "state", "multiCheckboxFilterOptions", "enablePagination", "pageable", "enableEdit", "enableDelete", "pageSizeOptions", "enableAdd", "addButtonAriaLabel", "addButtonText", "stickyRows", "stickyHeader", "stickyFooter", "scrollable", "stickyRowHeight", "stickyHeaderHeight", "stickyFooterHeight", "tableOptions", "dataLayoutMode", "selectionMode", "selectionBehavior", "selectionKeyMode", "selectAllEnabled", "selectionA11yLabels", "selectionDisabledFn", "highlightedIndex", "highlightRowKey", "highlightColKey", "globalFilterAriaLabel", "globalFilterPlaceholder", "searchHighlightTerm", "searchHighlightFields", "expandRowAriaLabel", "collapseRowAriaLabel", "exportPdfAriaLabel", "exportExcelAriaLabel", "newRowDefaults", "strictEmail", "editOnRowClick", "editMode", "toolbarEditHint", "singleExpand", "exportOptions", "theme", "responsive", "trackBy", "rowClass", "rowStyle", "rowReorderable", "columnReorderable", "resizable", "actionDisplay", "showStickyRowBadge", "stickyRowBadgeField", "stickyRowBadgeLabel", "labels", "locale", "dir", "keyboardNavigation", "editService", "dataProviderAll", "dataProviderSelection", "pageSize"], outputs: ["rowAdd", "rowEdit", "rowSave", "rowCancel", "rowDelete", "groupChange", "sortChange", "filterChange", "filtersChange", "pageChange", "dataStateChange", "selectionChange", "rowReorder", "columnReorder"] }, { kind: "directive", type: NgbCellTemplate, selector: "ng-template[ngbCell]", inputs: ["ngbCell"] }, { kind: "component", type: NgbDataChartComponent, selector: "ngb-data-chart", inputs: ["config", "ariaLabel", "emptyState"] }, { kind: "component", type: NgbDataSparklineComponent, selector: "ngb-data-sparkline", inputs: ["values", "width", "height", "strokeWidth", "positiveColor", "negativeColor", "neutralColor", "color", "showEndDot", "endDotRadius", "ariaLabel"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
11293
12545
|
}
|
|
11294
12546
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridChartComponent, decorators: [{
|
|
11295
12547
|
type: Component,
|
|
@@ -14254,11 +15506,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
14254
15506
|
args: ['nodeBtn', { read: ElementRef }]
|
|
14255
15507
|
}] } });
|
|
14256
15508
|
|
|
14257
|
-
/// <reference path="./types/optional-peer-deps.d.ts" />
|
|
14258
|
-
|
|
14259
15509
|
/**
|
|
14260
15510
|
* Generated bundle index. Do not edit.
|
|
14261
15511
|
*/
|
|
14262
15512
|
|
|
14263
|
-
export { BrowserExcelExportAdapter, DATAGRID_COLUMN_DIRECTIVES, DATAGRID_TEMPLATE_DIRECTIVES, DND_I18N, DND_LIVE_ANNOUNCE, Datagrid, ExcelExportAdapter, ExportButtonDirective, JsPdfAdapter, NGB_BOOLEAN_FILTER_OPERATORS, NGB_DATAGRID_DEFAULT_LABELS, NGB_DATAGRID_DEFAULT_PAGEABLE, NGB_DATAGRID_HOST, NGB_DATAGRID_KEYBOARD_SHORTCUTS, NGB_DATAGRID_PAGER_BREAKPOINTS, NGB_DATAGRID_THEME_OPTIONS, NGB_DATE_FILTER_OPERATORS, NGB_NUMERIC_FILTER_OPERATORS, NGB_PAGER_BREAKPOINTS, NGB_PAGER_DEFAULT_SETTINGS, NGB_SELECT_FILTER_OPERATORS, NGB_TEXT_FILTER_OPERATORS, NgbAdvancedSearchComponent, NgbCellTemplate, NgbChipsComponent, NgbDataChartComponent, NgbDataSparklineComponent, NgbDatagridButtonDirective, NgbDatagridColumnChooserToolComponent, NgbDatagridControlDirective, NgbDatagridDefaultEditService, NgbDatagridFieldShellComponent, NgbDatagridFilterToolComponent, NgbDatagridFloatingPanelDirective, NgbDatagridLayoutToolbarComponent, NgbDatagridLayoutToolbarSpacerComponent, NgbDatagridSortToolComponent, NgbDatagridSurfaceCardComponent, NgbDatagridThemePickerComponent, NgbDndHandleDirective, NgbDndItemDirective, NgbDndListDirective, NgbDndState, NgbEditorTemplate, NgbExportService, NgbFilterMenuTemplate, NgbFilterTemplate, NgbGlobalFilterTemplate, NgbGridChartComponent, NgbGridColumnDirective, NgbJsonPreviewComponent, NgbLiveAnnouncer, NgbPagerComponent, NgbPagerTemplate, NgbPaginationComponent, NgbRowDetailTemplate, NgbSearchHighlightComponent, NgbSplitterComponent, NgbSplitterPaneComponent, NgbStepLabelDirective, NgbStepperComponent, NgbTreeComponent, NgbTypeaheadComponent, PdfExportAdapter, defaultDndI18n, ngbAggregateValues, ngbAllowedFilterOperators, ngbApplyDataGridOperations, ngbBuildChartJsConfig, ngbBuildColumnSelectionChartData, ngbBuildFullGridChartData, ngbBuildRowSelectionChartData, ngbBuildSparklinePoints, ngbCalculateDataGridAggregates, ngbChartPalette, ngbColumnTypeToFilterType, ngbDatagridPagerSettings, ngbDefaultFilterOperator, ngbFilterOperatorLabel, ngbFindFieldFilterDescriptor, ngbFlattenFilterDescriptors, ngbFormatDatagridLabel, ngbFormatPagerRangeLabel, ngbIsCompositeFilter, ngbOperatorRequiresFilterValue, ngbPagerButtonCountForDensity, ngbResolveDatagridPagerSettings, ngbResolvePageableSettings, ngbResolvePagerDensity, ngbResolvePagerPageSizeOptions, ngbResolvePagerSettings, ngbSetFieldFilter };
|
|
15513
|
+
export { BrowserExcelExportAdapter, DATAGRID_COLUMN_DIRECTIVES, DATAGRID_TEMPLATE_DIRECTIVES, DND_I18N, DND_LIVE_ANNOUNCE, Datagrid, ExcelExportAdapter, ExportButtonDirective, JsPdfAdapter, NGB_BOOLEAN_FILTER_OPERATORS, NGB_DATAGRID_DEFAULT_LABELS, NGB_DATAGRID_DEFAULT_PAGEABLE, NGB_DATAGRID_HOST, NGB_DATAGRID_KEYBOARD_SHORTCUTS, NGB_DATAGRID_PAGER_BREAKPOINTS, NGB_DATAGRID_THEME_OPTIONS, NGB_DATE_FILTER_OPERATORS, NGB_NUMERIC_FILTER_OPERATORS, NGB_PAGER_BREAKPOINTS, NGB_PAGER_DEFAULT_SETTINGS, NGB_SELECT_FILTER_OPERATORS, NGB_TEXT_FILTER_OPERATORS, NgbAdvancedSearchComponent, NgbCellTemplate, NgbChipsComponent, NgbDataChartComponent, NgbDataGridGroupFooterTemplateDirective, NgbDataGridGroupHeaderColumnTemplateDirective, NgbDataGridGroupHeaderTemplateDirective, NgbDataSparklineComponent, NgbDatagridButtonDirective, NgbDatagridColumnChooserToolComponent, NgbDatagridControlDirective, NgbDatagridDefaultEditService, NgbDatagridFieldShellComponent, NgbDatagridFilterToolComponent, NgbDatagridFloatingPanelDirective, NgbDatagridLayoutToolbarComponent, NgbDatagridLayoutToolbarSpacerComponent, NgbDatagridSortToolComponent, NgbDatagridSurfaceCardComponent, NgbDatagridThemePickerComponent, NgbDndHandleDirective, NgbDndItemDirective, NgbDndListDirective, NgbDndState, NgbEditorTemplate, NgbExportService, NgbFilterMenuTemplate, NgbFilterTemplate, NgbGlobalFilterTemplate, NgbGridChartComponent, NgbGridColumnDirective, NgbGridHighlightDirective, NgbJsonPreviewComponent, NgbLiveAnnouncer, NgbPagerComponent, NgbPagerTemplate, NgbPaginationComponent, NgbRowDetailTemplate, NgbSearchHighlightComponent, NgbSplitterComponent, NgbSplitterPaneComponent, NgbStepLabelDirective, NgbStepperComponent, NgbTreeComponent, NgbTypeaheadComponent, PdfExportAdapter, defaultDndI18n, ngbAggregateValues, ngbAllowedFilterOperators, ngbApplyDataGridOperations, ngbBuildChartJsConfig, ngbBuildColumnSelectionChartData, ngbBuildFullGridChartData, ngbBuildRowSelectionChartData, ngbBuildSparklinePoints, ngbCalculateDataGridAggregates, ngbChartPalette, ngbColumnTypeToFilterType, ngbDatagridPagerSettings, ngbDefaultFilterOperator, ngbFilterOperatorLabel, ngbFindFieldFilterDescriptor, ngbFlattenFilterDescriptors, ngbFormatDatagridLabel, ngbFormatPagerRangeLabel, ngbGroupData, ngbIsCompositeFilter, ngbOperatorRequiresFilterValue, ngbPagerButtonCountForDensity, ngbResolveDatagridPagerSettings, ngbResolvePageableSettings, ngbResolvePagerDensity, ngbResolvePagerPageSizeOptions, ngbResolvePagerSettings, ngbSetFieldFilter };
|
|
14264
15514
|
//# sourceMappingURL=angular-bootstrap-ngbootstrap.mjs.map
|