@one-paragon/angular-utilities 2.0.6 → 2.0.7-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/one-paragon-angular-utilities.mjs +531 -428
- package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -1
- package/package.json +1 -1
- package/table-builder/classes/table-builder-general-settings.d.ts +16 -9
- package/table-builder/classes/table-builder.d.ts +14 -9
- package/table-builder/classes/table-store.d.ts +6 -4
- package/table-builder/components/column-builder/column-builder.component.d.ts +1 -1
- package/table-builder/components/generic-table/generic-table.component.d.ts +2 -1
- package/table-builder/components/reset-menu/reset-menu.component.d.ts +1 -1
- package/table-builder/components/scroll-strategy.d.ts +25 -10
- package/table-builder/components/table-container/table-container.d.ts +45 -21
- package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +3 -2
- package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +10 -3
- package/table-builder/components/table-container/virtual-scroll-container.d.ts +5 -8
- package/table-builder/directives/table-wrapper.directive.d.ts +1 -1
- package/table-builder/directives/tb-filter.directive.d.ts +4 -1
- package/table-builder/functions/sort-data-function.d.ts +0 -1
- package/table-builder/services/transform-creator.d.ts +4 -12
- package/table-builder/table-builder.module.d.ts +6 -13
- package/utilities/pipes/phone.pipe.d.ts +1 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Directive, Input, inject, Injector, TemplateRef, ViewContainerRef, NgModule, assertInInjectionContext, DestroyRef, computed, isSignal, Injectable,
|
|
3
|
-
import { shareReplay, switchAll, map, filter, tap, catchError, startWith, switchMap, mergeMap, concatMap as concatMap$1, takeUntil, distinctUntilChanged,
|
|
2
|
+
import { Directive, Input, inject, Injector, TemplateRef, ViewContainerRef, NgModule, assertInInjectionContext, DestroyRef, computed, isSignal, Injectable, input, signal, Renderer2, ElementRef, booleanAttribute, Pipe, InjectionToken, makeEnvironmentProviders, Component, ChangeDetectionStrategy, HostListener, EventEmitter, untracked, Output, ContentChildren, ChangeDetectorRef, output, ViewChild, EnvironmentInjector, createComponent, viewChild, linkedSignal, effect, contentChild, forwardRef, contentChildren, runInInjectionContext, provideAppInitializer } from '@angular/core';
|
|
3
|
+
import { shareReplay, switchAll, map, filter, tap, catchError, startWith, switchMap, mergeMap, concatMap as concatMap$1, takeUntil, distinctUntilChanged, debounceTime } from 'rxjs/operators';
|
|
4
4
|
import * as i1 from 'rxjs';
|
|
5
|
-
import { Subject, isObservable, of, ReplaySubject, filter as filter$1, first, map as map$1, Observable, combineLatest, Subscription, startWith as startWith$1, pairwise, concatMap, merge, delay, fromEvent, takeUntil as takeUntil$1, tap as tap$1, switchMap as switchMap$1, scan, timestamp
|
|
5
|
+
import { Subject, isObservable, of, ReplaySubject, filter as filter$1, first, map as map$1, Observable, combineLatest, Subscription, startWith as startWith$1, pairwise, concatMap, merge, delay, fromEvent, takeUntil as takeUntil$1, tap as tap$1, switchMap as switchMap$1, scan, timestamp } from 'rxjs';
|
|
6
6
|
import { ComponentStore } from '@ngrx/component-store';
|
|
7
7
|
import { toObservable, toSignal, outputFromObservable } from '@angular/core/rxjs-interop';
|
|
8
|
-
import { DatePipe, CurrencyPipe, KeyValuePipe, NgTemplateOutlet, DecimalPipe, CommonModule, AsyncPipe } from '@angular/common';
|
|
9
8
|
import * as i3$2 from '@angular/material/sort';
|
|
10
9
|
import { MatSort, MatSortModule } from '@angular/material/sort';
|
|
11
10
|
import { merge as merge$1, get, sumBy, difference, intersection, groupBy, orderBy, set, isFunction as isFunction$1 } from 'lodash';
|
|
@@ -20,11 +19,10 @@ import { MatCheckbox, MatCheckboxModule } from '@angular/material/checkbox';
|
|
|
20
19
|
import * as i3 from '@angular/forms';
|
|
21
20
|
import { NgControl, FormsModule, ControlContainer, NgForm, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
22
21
|
import * as i9 from '@angular/material/core';
|
|
23
|
-
import { MatOption
|
|
22
|
+
import { MatOption } from '@angular/material/core';
|
|
23
|
+
import { DatePipe, CurrencyPipe, KeyValuePipe, NgTemplateOutlet, formatDate, formatCurrency, DecimalPipe, CommonModule, AsyncPipe } from '@angular/common';
|
|
24
24
|
import * as i5 from '@angular/cdk/drag-drop';
|
|
25
25
|
import { moveItemInArray, DragDropModule, CDK_DROP_LIST, CdkDropList, transferArrayItem } from '@angular/cdk/drag-drop';
|
|
26
|
-
import * as i1$5 from '@angular/router';
|
|
27
|
-
import { RouterModule } from '@angular/router';
|
|
28
26
|
import * as i1$1 from '@angular/material/input';
|
|
29
27
|
import { MatInputModule, MatInput } from '@angular/material/input';
|
|
30
28
|
import * as i4 from '@angular/material/datepicker';
|
|
@@ -32,7 +30,7 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
|
32
30
|
import * as i6 from '@angular/material/form-field';
|
|
33
31
|
import * as i1$3 from '@angular/material/card';
|
|
34
32
|
import { MatCardModule } from '@angular/material/card';
|
|
35
|
-
import { MatDialog
|
|
33
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
36
34
|
import * as i3$1 from '@angular/material/button';
|
|
37
35
|
import { MatButtonModule, MatIconButton, MatButton } from '@angular/material/button';
|
|
38
36
|
import * as i4$1 from '@angular/material/tooltip';
|
|
@@ -48,6 +46,8 @@ import { MatChipsModule } from '@angular/material/chips';
|
|
|
48
46
|
import * as i1$6 from '@angular/material/table';
|
|
49
47
|
import { MatTable, MatColumnDef, MatTableModule, MatHeaderRowDef, MatFooterRowDef, MatTableDataSource, MatRowDef } from '@angular/material/table';
|
|
50
48
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
49
|
+
import * as i1$5 from '@angular/router';
|
|
50
|
+
import { RouterModule } from '@angular/router';
|
|
51
51
|
import * as i1$7 from '@angular/material/paginator';
|
|
52
52
|
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
|
|
53
53
|
import * as i1$8 from '@angular/cdk/scrolling';
|
|
@@ -683,34 +683,6 @@ function getDestroyRef(options) {
|
|
|
683
683
|
return destroyRef;
|
|
684
684
|
}
|
|
685
685
|
|
|
686
|
-
class SpaceCasePipe {
|
|
687
|
-
transform(value) {
|
|
688
|
-
return spaceCase(value);
|
|
689
|
-
}
|
|
690
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SpaceCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
691
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: SpaceCasePipe, isStandalone: true, name: "spaceCase" });
|
|
692
|
-
}
|
|
693
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SpaceCasePipe, decorators: [{
|
|
694
|
-
type: Pipe,
|
|
695
|
-
args: [{ name: 'spaceCase' }]
|
|
696
|
-
}] });
|
|
697
|
-
/**
|
|
698
|
-
* Adds a space before uppercase letters that either
|
|
699
|
-
* 1. follows a lowercase letter or digit
|
|
700
|
-
* 2. or precedes a lowercase letter and follows an alpha-numeric character
|
|
701
|
-
*
|
|
702
|
-
* Uppercases the first digit
|
|
703
|
-
*
|
|
704
|
-
* Turns underscores into spaces
|
|
705
|
-
*/
|
|
706
|
-
function spaceCase(value) {
|
|
707
|
-
const phrase = value?.replace(regex1, '$1$3 $2$4');
|
|
708
|
-
// uppercase the first character of every word
|
|
709
|
-
return phrase?.replace(regex2, x => x.toUpperCase());
|
|
710
|
-
}
|
|
711
|
-
const regex1 = /([a-z0-9])([A-Z])|([a-zA-Z0-9])([A-Z])(?=[a-z])|_/g;
|
|
712
|
-
const regex2 = /(^| )(\w)/g;
|
|
713
|
-
|
|
714
686
|
var FieldType;
|
|
715
687
|
(function (FieldType) {
|
|
716
688
|
FieldType[FieldType["Unknown"] = 0] = "Unknown";
|
|
@@ -765,8 +737,8 @@ class GeneralTableSettings {
|
|
|
765
737
|
headerSettings = new TableWrapperHeaderSettings();
|
|
766
738
|
footerSettings = new TableWrapperFooterSettings();
|
|
767
739
|
columnHeaderSettings = new TableColumnHeaderSettings();
|
|
740
|
+
columnFooterSettings = new TableColumnFooterSettings();
|
|
768
741
|
tableSettings = new TableSettings();
|
|
769
|
-
injector;
|
|
770
742
|
}
|
|
771
743
|
class TableWrapperHeaderSettings {
|
|
772
744
|
hideExport = false;
|
|
@@ -782,10 +754,18 @@ class TableWrapperFooterSettings {
|
|
|
782
754
|
collapse = false;
|
|
783
755
|
}
|
|
784
756
|
class TableColumnHeaderSettings {
|
|
757
|
+
stickyHeaderRow = true;
|
|
785
758
|
noFilters = false;
|
|
786
759
|
noHeader = false;
|
|
787
760
|
}
|
|
761
|
+
class TableColumnFooterSettings {
|
|
762
|
+
stickyFooterRow = false;
|
|
763
|
+
}
|
|
788
764
|
class TableSettings {
|
|
765
|
+
tableId = undefined;
|
|
766
|
+
trackBy = undefined;
|
|
767
|
+
includeIndexColumn = false;
|
|
768
|
+
includeSelectionColumn = false;
|
|
789
769
|
usePaginator = undefined;
|
|
790
770
|
useVirtualScroll = undefined;
|
|
791
771
|
paginatorSettings = undefined;
|
|
@@ -1186,6 +1166,7 @@ class TableFilterDirective {
|
|
|
1186
1166
|
this.filterValue = undefined;
|
|
1187
1167
|
}
|
|
1188
1168
|
filter$ = new ReplaySubject(1);
|
|
1169
|
+
$filter = toSignal(this.filter$);
|
|
1189
1170
|
filterType;
|
|
1190
1171
|
key;
|
|
1191
1172
|
fieldType;
|
|
@@ -1295,6 +1276,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
1295
1276
|
}], ctorParameters: () => [] });
|
|
1296
1277
|
class TableCustomFilterDirectiveBase extends TableCustomFilterDirective {
|
|
1297
1278
|
filter$ = new ReplaySubject(1);
|
|
1279
|
+
$filter = toSignal(this.filter$);
|
|
1298
1280
|
filter;
|
|
1299
1281
|
_predicate;
|
|
1300
1282
|
set predicate(val) {
|
|
@@ -1526,13 +1508,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
1526
1508
|
|
|
1527
1509
|
class PhoneNumberPipe {
|
|
1528
1510
|
transform(phoneNum) {
|
|
1529
|
-
|
|
1530
|
-
phoneNum = phoneNum.replace(/\D/g, '');
|
|
1531
|
-
if (phoneNum[0] === '1') {
|
|
1532
|
-
phoneNum = phoneNum.substring(1);
|
|
1533
|
-
}
|
|
1534
|
-
return '(' + phoneNum.slice(0, 3) + ') ' + phoneNum.slice(3, 6) + '-' + phoneNum.slice(6, 10) + ' ' + phoneNum.slice(10);
|
|
1535
|
-
}
|
|
1511
|
+
return phoneFormatter(phoneNum);
|
|
1536
1512
|
}
|
|
1537
1513
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: PhoneNumberPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
1538
1514
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: PhoneNumberPipe, isStandalone: true, name: "phone" });
|
|
@@ -1541,6 +1517,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
1541
1517
|
type: Pipe,
|
|
1542
1518
|
args: [{ name: 'phone' }]
|
|
1543
1519
|
}] });
|
|
1520
|
+
function phoneFormatter(phoneNum) {
|
|
1521
|
+
if (phoneNum) {
|
|
1522
|
+
phoneNum = phoneNum.replace(/\D/g, '');
|
|
1523
|
+
if (phoneNum[0] === '1') {
|
|
1524
|
+
phoneNum = phoneNum.substring(1);
|
|
1525
|
+
}
|
|
1526
|
+
return '(' + phoneNum.slice(0, 3) + ') ' + phoneNum.slice(3, 6) + '-' + phoneNum.slice(6, 10) + ' ' + phoneNum.slice(10);
|
|
1527
|
+
}
|
|
1528
|
+
return '';
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
class SpaceCasePipe {
|
|
1532
|
+
transform(value) {
|
|
1533
|
+
return spaceCase(value);
|
|
1534
|
+
}
|
|
1535
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SpaceCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
1536
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: SpaceCasePipe, isStandalone: true, name: "spaceCase" });
|
|
1537
|
+
}
|
|
1538
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SpaceCasePipe, decorators: [{
|
|
1539
|
+
type: Pipe,
|
|
1540
|
+
args: [{ name: 'spaceCase' }]
|
|
1541
|
+
}] });
|
|
1542
|
+
/**
|
|
1543
|
+
* Adds a space before uppercase letters that either
|
|
1544
|
+
* 1. follows a lowercase letter or digit
|
|
1545
|
+
* 2. or precedes a lowercase letter and follows an alpha-numeric character
|
|
1546
|
+
*
|
|
1547
|
+
* Uppercases the first digit
|
|
1548
|
+
*
|
|
1549
|
+
* Turns underscores into spaces
|
|
1550
|
+
*/
|
|
1551
|
+
function spaceCase(value) {
|
|
1552
|
+
const phrase = value?.replace(regex1, '$1$3 $2$4');
|
|
1553
|
+
// uppercase the first character of every word
|
|
1554
|
+
return phrase?.replace(regex2, x => x.toUpperCase());
|
|
1555
|
+
}
|
|
1556
|
+
const regex1 = /([a-z0-9])([A-Z])|([a-zA-Z0-9])([A-Z])(?=[a-z])|_/g;
|
|
1557
|
+
const regex2 = /(^| )(\w)/g;
|
|
1544
1558
|
|
|
1545
1559
|
const defaultConfig = {
|
|
1546
1560
|
defaultTableSettings: {
|
|
@@ -1914,8 +1928,8 @@ class TableStore extends ComponentStore {
|
|
|
1914
1928
|
equal: sortsAreSame
|
|
1915
1929
|
});
|
|
1916
1930
|
selectSorted$ = this.select(state => state.sorted).pipe(distinctUntilChanged(sortsAreSame));
|
|
1917
|
-
|
|
1918
|
-
|
|
1931
|
+
$getSorts = this.selectSignal(() => this.$initializationState() !== InitializationState.Ready ? [] : this.$selectSorted());
|
|
1932
|
+
sort$ = toObservable(this.$getSorts);
|
|
1919
1933
|
$getUserDefinedTableWidth = this.selectSignal(state => state.userDefined.table.width);
|
|
1920
1934
|
getUserDefinedTableWidth$ = this.select(state => state.userDefined.table.width);
|
|
1921
1935
|
$userDefinedRowHeight = this.selectSignal(state => (state.userDefined.rowHeight));
|
|
@@ -1934,6 +1948,11 @@ class TableStore extends ComponentStore {
|
|
|
1934
1948
|
const bb = b.flatMap(g => g.expandedHeaders);
|
|
1935
1949
|
return aa.length === bb.length && aa.every((k) => bb.includes(k));
|
|
1936
1950
|
}));
|
|
1951
|
+
$expandGroups = this.selectSignal(state => state.groupBy, { equal: (a, b) => {
|
|
1952
|
+
const aa = a.flatMap(g => g.expandedHeaders);
|
|
1953
|
+
const bb = b.flatMap(g => g.expandedHeaders);
|
|
1954
|
+
return aa.length === bb.length && aa.every((k) => bb.includes(k));
|
|
1955
|
+
} });
|
|
1937
1956
|
$getIsExpanded = (columnKey, groupHeaderKey) => {
|
|
1938
1957
|
return this.selectSignal(state => !!state.groupBy.filter(g => g.key === columnKey && g.expandedHeaders.includes(groupHeaderKey)).length);
|
|
1939
1958
|
};
|
|
@@ -3160,98 +3179,92 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
3160
3179
|
function isPipe(o) {
|
|
3161
3180
|
return typeof (o.transform) === 'function';
|
|
3162
3181
|
}
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
const defaultFunc = nested ? (value) => get(value, metaData.key) : (value) => value[metaData.key];
|
|
3171
|
-
if (metaData.map && !forItem) {
|
|
3172
|
-
return (value) => {
|
|
3173
|
-
return metaData.map(value);
|
|
3174
|
-
};
|
|
3175
|
-
}
|
|
3176
|
-
if (metaData.mapItem) {
|
|
3177
|
-
return (value) => {
|
|
3178
|
-
return metaData.mapItem(defaultFunc(value));
|
|
3179
|
-
};
|
|
3180
|
-
}
|
|
3181
|
-
if (metaData.transform) {
|
|
3182
|
-
if (isPipe(metaData.transform)) {
|
|
3183
|
-
return (value) => metaData.transform.transform(defaultFunc(value));
|
|
3184
|
-
}
|
|
3185
|
-
return metaData.fieldType === FieldType.Expression ? metaData.transform : (value) => metaData.transform(defaultFunc(value), value);
|
|
3186
|
-
}
|
|
3187
|
-
if (this.config.transformers && this.config.transformers[metaData.fieldType]) {
|
|
3188
|
-
var transformer = this.config.transformers[metaData.fieldType];
|
|
3189
|
-
return (value) => transformer(defaultFunc(value));
|
|
3190
|
-
}
|
|
3191
|
-
const defaultDateFormat = this.config.dateFormats?.dateFormat ?? 'shortDate';
|
|
3192
|
-
const defaultDateTimeFormat = this.config.dateFormats?.dateTimeFormat ?? 'short';
|
|
3193
|
-
switch (metaData.fieldType) {
|
|
3194
|
-
case FieldType.Date:
|
|
3195
|
-
const dateFormat = metaData.additional?.dateFormat ?? defaultDateFormat;
|
|
3196
|
-
return (value) => this.datePipe.transform(defaultFunc(value), dateFormat);
|
|
3197
|
-
case FieldType.DateTime:
|
|
3198
|
-
const dateTimeFormat = metaData.additional?.dateTimeOptions?.format ?? defaultDateTimeFormat;
|
|
3199
|
-
return (value) => this.datePipe.transform(defaultFunc(value), dateTimeFormat);
|
|
3200
|
-
case FieldType.Currency:
|
|
3201
|
-
return (value) => this.currencyPipe.transform(defaultFunc(value));
|
|
3202
|
-
case FieldType.PhoneNumber:
|
|
3203
|
-
return (value) => this.phonePipe.transform(defaultFunc(value));
|
|
3204
|
-
case FieldType.Enum:
|
|
3205
|
-
return (value) => spaceCase(metaData.additional?.enumMap[defaultFunc(value)]);
|
|
3206
|
-
case FieldType.Boolean:
|
|
3207
|
-
if (noIcons) {
|
|
3208
|
-
return defaultFunc;
|
|
3209
|
-
}
|
|
3210
|
-
let forTrue = 'check';
|
|
3211
|
-
let forFalse = '';
|
|
3212
|
-
if (metaData.additional?.boolean?.forTrue) {
|
|
3213
|
-
forTrue = metaData?.additional.boolean.forTrue.icon;
|
|
3214
|
-
}
|
|
3215
|
-
if (metaData.additional?.boolean?.showForFalse === true) {
|
|
3216
|
-
forFalse = 'clear';
|
|
3217
|
-
}
|
|
3218
|
-
else if (metaData.additional?.boolean?.showForFalse?.icon) {
|
|
3219
|
-
forFalse = metaData.additional?.boolean?.showForFalse?.icon;
|
|
3220
|
-
}
|
|
3221
|
-
return (value) => defaultFunc(value) ? forTrue : forFalse;
|
|
3222
|
-
}
|
|
3223
|
-
return defaultFunc;
|
|
3182
|
+
function createTransformer(metaData, config, noIcons = false, forItem = false) {
|
|
3183
|
+
const nested = metaData.key.includes('.');
|
|
3184
|
+
const defaultFunc = nested ? (value) => get(value, metaData.key) : (value) => value[metaData.key];
|
|
3185
|
+
if (metaData.map && !forItem) {
|
|
3186
|
+
return (value) => {
|
|
3187
|
+
return metaData.map(value);
|
|
3188
|
+
};
|
|
3224
3189
|
}
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
if (!mutate) {
|
|
3229
|
-
t = { ...t };
|
|
3230
|
-
}
|
|
3231
|
-
t[metaData.key] = transform(t);
|
|
3190
|
+
if (metaData.mapItem) {
|
|
3191
|
+
return (value) => {
|
|
3192
|
+
return metaData.mapItem(defaultFunc(value));
|
|
3232
3193
|
};
|
|
3233
|
-
}
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3194
|
+
}
|
|
3195
|
+
if (metaData.transform) {
|
|
3196
|
+
if (isPipe(metaData.transform)) {
|
|
3197
|
+
return (value) => metaData.transform.transform(defaultFunc(value));
|
|
3198
|
+
}
|
|
3199
|
+
return metaData.fieldType === FieldType.Expression ? metaData.transform : (value) => metaData.transform(defaultFunc(value), value);
|
|
3200
|
+
}
|
|
3201
|
+
if (config.transformers && config.transformers[metaData.fieldType]) {
|
|
3202
|
+
var transformer = config.transformers[metaData.fieldType];
|
|
3203
|
+
return (value) => transformer(defaultFunc(value));
|
|
3204
|
+
}
|
|
3205
|
+
const defaultDateFormat = config.dateFormats?.dateFormat ?? 'shortDate';
|
|
3206
|
+
const defaultDateTimeFormat = config.dateFormats?.dateTimeFormat ?? 'short';
|
|
3207
|
+
switch (metaData.fieldType) {
|
|
3208
|
+
case FieldType.Date:
|
|
3209
|
+
const dateFormat = metaData.additional?.dateFormat ?? defaultDateFormat;
|
|
3210
|
+
return (value) => dateFormatter(defaultFunc(value), dateFormat);
|
|
3211
|
+
case FieldType.DateTime:
|
|
3212
|
+
const dateTimeFormat = metaData.additional?.dateTimeOptions?.format ?? defaultDateTimeFormat;
|
|
3213
|
+
return (value) => dateFormatter(defaultFunc(value), dateTimeFormat);
|
|
3214
|
+
case FieldType.Currency:
|
|
3215
|
+
return (value) => currencyFormatter(defaultFunc(value));
|
|
3216
|
+
case FieldType.PhoneNumber:
|
|
3217
|
+
return (value) => phoneFormatter(defaultFunc(value));
|
|
3218
|
+
case FieldType.Enum:
|
|
3219
|
+
return (value) => spaceCase(metaData.additional?.enumMap[defaultFunc(value)]);
|
|
3220
|
+
case FieldType.Boolean:
|
|
3221
|
+
if (noIcons) {
|
|
3222
|
+
return defaultFunc;
|
|
3223
|
+
}
|
|
3224
|
+
let forTrue = 'check';
|
|
3225
|
+
let forFalse = '';
|
|
3226
|
+
if (metaData.additional?.boolean?.forTrue) {
|
|
3227
|
+
forTrue = metaData?.additional.boolean.forTrue.icon;
|
|
3228
|
+
}
|
|
3229
|
+
if (metaData.additional?.boolean?.showForFalse === true) {
|
|
3230
|
+
forFalse = 'clear';
|
|
3241
3231
|
}
|
|
3242
|
-
|
|
3232
|
+
else if (metaData.additional?.boolean?.showForFalse?.icon) {
|
|
3233
|
+
forFalse = metaData.additional?.boolean?.showForFalse?.icon;
|
|
3234
|
+
}
|
|
3235
|
+
return (value) => defaultFunc(value) ? forTrue : forFalse;
|
|
3236
|
+
}
|
|
3237
|
+
return defaultFunc;
|
|
3238
|
+
}
|
|
3239
|
+
function createItemTransformer(metaData, config, noIcons = false, mutate = false) {
|
|
3240
|
+
const transform = createTransformer(metaData, config, noIcons);
|
|
3241
|
+
return (t) => {
|
|
3242
|
+
if (!mutate) {
|
|
3243
|
+
t = { ...t };
|
|
3244
|
+
}
|
|
3245
|
+
t[metaData.key] = transform(t);
|
|
3246
|
+
};
|
|
3247
|
+
}
|
|
3248
|
+
function createItemTransformers(metaDatas, config, noIcons = false, mutate = false) {
|
|
3249
|
+
const transformers = metaDatas.map(meta => createItemTransformer(meta, config, noIcons, true));
|
|
3250
|
+
return (t) => {
|
|
3251
|
+
if (!t)
|
|
3243
3252
|
return t;
|
|
3244
|
-
|
|
3253
|
+
if (!mutate) {
|
|
3254
|
+
t = { ...t };
|
|
3255
|
+
}
|
|
3256
|
+
transformers.forEach(m => m(t));
|
|
3257
|
+
return t;
|
|
3245
3258
|
};
|
|
3246
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TransformCreator, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
3247
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TransformCreator, providedIn: 'root' });
|
|
3248
3259
|
}
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3260
|
+
function dateFormatter(date, format) {
|
|
3261
|
+
if (!date)
|
|
3262
|
+
return;
|
|
3263
|
+
return formatDate(date, format, 'en-US');
|
|
3264
|
+
}
|
|
3265
|
+
function currencyFormatter(amt) {
|
|
3266
|
+
return formatCurrency(amt, 'en-US', '$');
|
|
3267
|
+
}
|
|
3255
3268
|
|
|
3256
3269
|
class RouterLinkColumnComponent {
|
|
3257
3270
|
additional = input.required();
|
|
@@ -3515,14 +3528,14 @@ class ColumnHeaderMenuComponent {
|
|
|
3515
3528
|
}
|
|
3516
3529
|
}
|
|
3517
3530
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ColumnHeaderMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3518
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: ColumnHeaderMenuComponent, isStandalone: true, selector: "tb-header-menu", inputs: { $metaData: { classPropertyName: "$metaData", publicName: "metaData", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "$trigger", first: true, predicate: MatMenuTrigger, descendants: true, isSignal: true }], ngImport: i0, template: "@let metaData = $metaData();\r\n@let currentFilterType = $currentFilterType();\r\n\r\n<button mat-icon-button class=\"open-menu-icon-button\" disableRipple [matMenuTriggerFor]=\"menu\" [matMenuTriggerRestoreFocus]=\"false\">\r\n <mat-icon class=\"menu-icon\">more_vert</mat-icon>\r\n</button>\r\n<mat-menu #menu=\"matMenu\" >\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <button mat-menu-item (click)=\"tableState.addGroupByKey(metaData.key)\">\r\n <mat-icon color=\"primary\">group</mat-icon>\r\n <span>Group By</span>\r\n </button>\r\n }\r\n <button mat-menu-item (click)=hideField(metaData.key)>\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n <span>Hide Column</span>\r\n </button>\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <ng-form #myForm=\"ngForm\" (keydown.enter)=\"onEnter(myForm.value)\" class=\"tb-header-filter\">\r\n <input type=\"hidden\" name=\"filterId\" [ngModel]=\"'header-column-' + metaData.key\" />\r\n <input type=\"hidden\" name=\"filterType\" [ngModel]=\"currentFilterType\" />\r\n <input type=\"hidden\" name=\"key\" [ngModel]=\"metaData.key\" />\r\n <input type=\"hidden\" name=\"fieldType\" [ngModel]=\"metaData.fieldType\" />\r\n \r\n @if(currentFilterType === FilterType.Or || currentFilterType === FilterType.In){\r\n <tb-in-list-filter name='filterValue' [key]='metaData.key' [ngModel]=\"undefined\"/>\r\n }\r\n @else if(metaData.fieldType === FieldType.Link || metaData.fieldType === FieldType.String || metaData.fieldType === FieldType.Array || metaData.fieldType === FieldType.Unknown || metaData.fieldType === FieldType.PhoneNumber) {\r\n <mat-form-field stop-propagation class=\"font auto-width\">\r\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\r\n <mat-label>{{currentFilterType === FilterType.StringDoesNotContain ? 'Does Not Contain...' : 'Contains...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\"/>\r\n <span matSuffix [matTooltip]=\"currentFilterType === FilterType.StringDoesNotContain ? 'Contains' : 'Does Not Contain'\">\r\n <button mat-icon-button color=\"primary\" (click)=\"setStringFilterType()\" class=\"header-filter-icon-button\">\r\n <mat-icon [class]=\"{'chosen-icon': currentFilterType === FilterType.StringDoesNotContain }\">\r\n block\r\n </mat-icon>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Number || metaData.fieldType === FieldType.Currency) {\r\n <mat-form-field class=\"auto-width\" stop-propagation>\r\n <mat-label>{{currentFilterType === FilterType.NumberEquals ? 'Equals...' : currentFilterType === FilterType.NumberLessThan ? 'Less Than...' : 'More Than...'}}</mat-label>\r\n <input matInput type='number' name=\"filterValue\" [ngModel]=\"undefined\" />\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberLessThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberLessThan }\">\r\n <mat-icon class=\"suffix-icons\"\r\n >\r\n arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberGreaterThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberGreaterThan }\" >\r\n <mat-icon class=\"suffix-icons\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberEquals)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberEquals }\">\r\n <span class=\"suffix-icons\">=</span>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Boolean) {\r\n <div>\r\n <label>\r\n <mat-icon class=\"search-icon\">filter_list</mat-icon>\r\n </label>\r\n <mat-radio-group stop-propagation #ctrl=\"matRadioGroup\" #boolField='ngModel' class=\"font\" name=\"filterValue\" [ngModel]=\"undefined\" >\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(true);\" [value]=\"true\">True</mat-radio-button><br/>\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(false)\" [value]=\"false\">False</mat-radio-button><br/>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n @else if (metaData.fieldType === FieldType.Date || metaData.fieldType === FieldType.DateTime) {\r\n <mat-form-field class=\"font auto-width\" stop-propagation >\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrAfter)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrAfter }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrBefore)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrBefore }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateIsOn)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateIsOn }\">\r\n <span class=\"suffix-icons underline\"> =</span>\r\n </button>\r\n </span>\r\n <mat-label>{{currentFilterType === FilterType.DateIsOn ? 'On...' :\r\n currentFilterType === FilterType.DateOnOrBefore ? 'On or Before...' : 'On or After...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\" [matDatepicker]=\"calendar\"\r\n (click)=\"calendar.open()\"/>\r\n <mat-datepicker-toggle class=\"date-toggle header-filter-icon-button\" matSuffix [for]=\"calendar\" preventEnter></mat-datepicker-toggle>\r\n <mat-datepicker #calendar></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n <button mat-button (click)=\"onEnter(myForm.value)\" [disabled]=\"myForm.value.filterValue == undefined\" disableRipple>\r\n Apply\r\n </button>\r\n </ng-form>\r\n }\r\n</mat-menu>\r\n", styles: [":host{--mdc-text-button-container-height: 24px}:host{--mdc-filled-button-container-height: 24px}:host{--mdc-protected-button-container-height: 24px}:host{--mdc-outlined-button-container-height: 24px}:host{--mat-text-button-touch-target-display: none}:host{--mat-filled-button-touch-target-display: none}:host{--mat-protected-button-touch-target-display: none}:host{--mat-outlined-button-touch-target-display: none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.menu-icon{font-size:16px;line-height:16px;vertical-align:top;height:16px;width:16px}.search-icon{margin-right:16px;vertical-align:middle;height:24px;color:#0000008a;font-size:21px;line-height:1.125}.font{font-size:14px}.filter-radio-button:first-of-type{padding-left:0}.filter-radio-button{padding:10px 40px;min-width:110px}.auto-width{width:260px;margin:5px;display:block;height:55px}.open-menu-icon-button{height:28px;width:28px;padding:6px}.header-filter-icon-button{height:18px;width:18px;font-size:18px;padding:0;margin:0 2px}.header-filter-icon-button ::ng-deep *{line-height:initial;font-size:initial;height:18px;width:18px;font-size:18px;bottom:initial}.header-filter-icon-button.chosen-icon,.header-filter-icon-button.chosen-icon ::ng-deep *{height:22px;width:22px;font-size:22px;color:green}mat-icon.mat-icon.suffix-icons.underline{height:20px;text-decoration:underline .1px solid}.chosen-icon mat-icon.mat-icon.suffix-icons.underline{height:24px}::ng-deep .mat-mdc-form-field-icon-prefix:has(.tb-header-prefix),.tb-header-prefix{padding:0;flex-basis:36%}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper{line-height:0}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper:before{height:0}.date-toggle ::ng-deep svg{position:absolute;left:0;top:0}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1$4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: InListFilterComponent, selector: "tb-in-list-filter , [tb-in-list-filter]", inputs: ["key"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i10.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i10.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3531
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: ColumnHeaderMenuComponent, isStandalone: true, selector: "tb-header-menu", inputs: { $metaData: { classPropertyName: "$metaData", publicName: "metaData", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "$trigger", first: true, predicate: MatMenuTrigger, descendants: true, isSignal: true }], ngImport: i0, template: "@let metaData = $metaData();\r\n@let currentFilterType = $currentFilterType();\r\n\r\n<button mat-icon-button class=\"open-menu-icon-button\" disableRipple [matMenuTriggerFor]=\"menu\" [matMenuTriggerRestoreFocus]=\"false\">\r\n <mat-icon class=\"menu-icon\">more_vert</mat-icon>\r\n</button>\r\n<mat-menu #menu=\"matMenu\" >\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <button mat-menu-item (click)=\"tableState.addGroupByKey(metaData.key)\">\r\n <mat-icon color=\"primary\">group</mat-icon>\r\n <span>Group By</span>\r\n </button>\r\n }\r\n <button mat-menu-item (click)=hideField(metaData.key)>\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n <span>Hide Column</span>\r\n </button>\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <ng-form #myForm=\"ngForm\" (keydown.enter)=\"onEnter(myForm.value)\" class=\"tb-header-filter\">\r\n <input type=\"hidden\" name=\"filterId\" [ngModel]=\"'header-column-' + metaData.key\" />\r\n <input type=\"hidden\" name=\"filterType\" [ngModel]=\"currentFilterType\" />\r\n <input type=\"hidden\" name=\"key\" [ngModel]=\"metaData.key\" />\r\n <input type=\"hidden\" name=\"fieldType\" [ngModel]=\"metaData.fieldType\" />\r\n \r\n @if(currentFilterType === FilterType.Or || currentFilterType === FilterType.In){\r\n <tb-in-list-filter name='filterValue' [key]='metaData.key' [ngModel]=\"undefined\"/>\r\n }\r\n @else if(metaData.fieldType === FieldType.Link || metaData.fieldType === FieldType.String || metaData.fieldType === FieldType.Array || metaData.fieldType === FieldType.Unknown || metaData.fieldType === FieldType.PhoneNumber) {\r\n <mat-form-field stop-propagation class=\"font auto-width\">\r\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\r\n <mat-label>{{currentFilterType === FilterType.StringDoesNotContain ? 'Does Not Contain...' : 'Contains...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\"/>\r\n <span matSuffix [matTooltip]=\"currentFilterType === FilterType.StringDoesNotContain ? 'Contains' : 'Does Not Contain'\">\r\n <button mat-icon-button color=\"primary\" (click)=\"setStringFilterType()\" class=\"header-filter-icon-button\">\r\n <mat-icon [class]=\"{'chosen-icon': currentFilterType === FilterType.StringDoesNotContain }\">\r\n block\r\n </mat-icon>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Number || metaData.fieldType === FieldType.Currency) {\r\n <mat-form-field class=\"auto-width\" stop-propagation>\r\n <mat-label>{{currentFilterType === FilterType.NumberEquals ? 'Equals...' : currentFilterType === FilterType.NumberLessThan ? 'Less Than...' : 'More Than...'}}</mat-label>\r\n <input matInput type='number' name=\"filterValue\" [ngModel]=\"undefined\" />\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberLessThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberLessThan }\">\r\n <mat-icon class=\"suffix-icons\"\r\n >\r\n arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberGreaterThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberGreaterThan }\" >\r\n <mat-icon class=\"suffix-icons\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberEquals)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberEquals }\">\r\n <span class=\"suffix-icons\">=</span>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Boolean) {\r\n <div>\r\n <label>\r\n <mat-icon class=\"search-icon\">filter_list</mat-icon>\r\n </label>\r\n <mat-radio-group stop-propagation #ctrl=\"matRadioGroup\" #boolField='ngModel' class=\"font\" name=\"filterValue\" [ngModel]=\"undefined\" >\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(true);\" [value]=\"true\">True</mat-radio-button><br/>\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(false)\" [value]=\"false\">False</mat-radio-button><br/>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n @else if (metaData.fieldType === FieldType.Date || metaData.fieldType === FieldType.DateTime) {\r\n <mat-form-field class=\"font auto-width\" stop-propagation >\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrAfter)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrAfter }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrBefore)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrBefore }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateIsOn)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateIsOn }\">\r\n <span class=\"suffix-icons underline\"> =</span>\r\n </button>\r\n </span>\r\n <mat-label>{{currentFilterType === FilterType.DateIsOn ? 'On...' :\r\n currentFilterType === FilterType.DateOnOrBefore ? 'On or Before...' : 'On or After...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\" [matDatepicker]=\"calendar\"\r\n (click)=\"calendar.open()\"/>\r\n <mat-datepicker-toggle class=\"date-toggle header-filter-icon-button\" matSuffix [for]=\"calendar\" preventEnter></mat-datepicker-toggle>\r\n <mat-datepicker #calendar></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n <button mat-button (click)=\"onEnter(myForm.value)\" [disabled]=\"myForm.value.filterValue == undefined\" disableRipple>\r\n Apply\r\n </button>\r\n </ng-form>\r\n }\r\n</mat-menu>\r\n", styles: [":host{--mdc-text-button-container-height: 24px}:host{--mdc-filled-button-container-height: 24px}:host{--mdc-protected-button-container-height: 24px}:host{--mdc-outlined-button-container-height: 24px}:host{--mat-text-button-touch-target-display: none}:host{--mat-filled-button-touch-target-display: none}:host{--mat-protected-button-touch-target-display: none}:host{--mat-outlined-button-touch-target-display: none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.menu-icon{font-size:16px;line-height:16px;vertical-align:top;height:16px;width:16px}.search-icon{margin-right:16px;vertical-align:middle;height:24px;width:24px;color:#0000008a;font-size:21px;line-height:1.125}.font{font-size:14px}.filter-radio-button:first-of-type{padding-left:0}.filter-radio-button{padding:10px 40px;min-width:110px}.auto-width{width:260px;margin:5px;display:block;height:55px}.open-menu-icon-button{height:28px;width:28px;padding:6px}.header-filter-icon-button{height:18px;width:18px;font-size:18px;padding:0;margin:0 2px}.header-filter-icon-button ::ng-deep *{line-height:initial;font-size:initial;height:18px;width:18px;font-size:18px;bottom:initial}.header-filter-icon-button.chosen-icon,.header-filter-icon-button.chosen-icon ::ng-deep *{height:22px;width:22px;font-size:22px;color:green}mat-icon.mat-icon.suffix-icons.underline{height:20px;text-decoration:underline .1px solid}.chosen-icon mat-icon.mat-icon.suffix-icons.underline{height:24px}::ng-deep .mat-mdc-form-field-icon-prefix:has(.tb-header-prefix),.tb-header-prefix{padding:0;flex-basis:36%}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper{line-height:0}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper:before{height:0}.date-toggle ::ng-deep svg{position:absolute;left:0;top:0}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1$4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: InListFilterComponent, selector: "tb-in-list-filter , [tb-in-list-filter]", inputs: ["key"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i10.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i10.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3519
3532
|
}
|
|
3520
3533
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ColumnHeaderMenuComponent, decorators: [{
|
|
3521
3534
|
type: Component,
|
|
3522
3535
|
args: [{ selector: 'tb-header-menu', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
3523
3536
|
MatMenuModule, MatIconModule, MatButtonModule, FormsModule, InListFilterComponent,
|
|
3524
3537
|
MatInputModule, MatTooltipModule, StopPropagationDirective, MatRadioModule, MatDatepickerModule
|
|
3525
|
-
], template: "@let metaData = $metaData();\r\n@let currentFilterType = $currentFilterType();\r\n\r\n<button mat-icon-button class=\"open-menu-icon-button\" disableRipple [matMenuTriggerFor]=\"menu\" [matMenuTriggerRestoreFocus]=\"false\">\r\n <mat-icon class=\"menu-icon\">more_vert</mat-icon>\r\n</button>\r\n<mat-menu #menu=\"matMenu\" >\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <button mat-menu-item (click)=\"tableState.addGroupByKey(metaData.key)\">\r\n <mat-icon color=\"primary\">group</mat-icon>\r\n <span>Group By</span>\r\n </button>\r\n }\r\n <button mat-menu-item (click)=hideField(metaData.key)>\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n <span>Hide Column</span>\r\n </button>\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <ng-form #myForm=\"ngForm\" (keydown.enter)=\"onEnter(myForm.value)\" class=\"tb-header-filter\">\r\n <input type=\"hidden\" name=\"filterId\" [ngModel]=\"'header-column-' + metaData.key\" />\r\n <input type=\"hidden\" name=\"filterType\" [ngModel]=\"currentFilterType\" />\r\n <input type=\"hidden\" name=\"key\" [ngModel]=\"metaData.key\" />\r\n <input type=\"hidden\" name=\"fieldType\" [ngModel]=\"metaData.fieldType\" />\r\n \r\n @if(currentFilterType === FilterType.Or || currentFilterType === FilterType.In){\r\n <tb-in-list-filter name='filterValue' [key]='metaData.key' [ngModel]=\"undefined\"/>\r\n }\r\n @else if(metaData.fieldType === FieldType.Link || metaData.fieldType === FieldType.String || metaData.fieldType === FieldType.Array || metaData.fieldType === FieldType.Unknown || metaData.fieldType === FieldType.PhoneNumber) {\r\n <mat-form-field stop-propagation class=\"font auto-width\">\r\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\r\n <mat-label>{{currentFilterType === FilterType.StringDoesNotContain ? 'Does Not Contain...' : 'Contains...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\"/>\r\n <span matSuffix [matTooltip]=\"currentFilterType === FilterType.StringDoesNotContain ? 'Contains' : 'Does Not Contain'\">\r\n <button mat-icon-button color=\"primary\" (click)=\"setStringFilterType()\" class=\"header-filter-icon-button\">\r\n <mat-icon [class]=\"{'chosen-icon': currentFilterType === FilterType.StringDoesNotContain }\">\r\n block\r\n </mat-icon>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Number || metaData.fieldType === FieldType.Currency) {\r\n <mat-form-field class=\"auto-width\" stop-propagation>\r\n <mat-label>{{currentFilterType === FilterType.NumberEquals ? 'Equals...' : currentFilterType === FilterType.NumberLessThan ? 'Less Than...' : 'More Than...'}}</mat-label>\r\n <input matInput type='number' name=\"filterValue\" [ngModel]=\"undefined\" />\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberLessThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberLessThan }\">\r\n <mat-icon class=\"suffix-icons\"\r\n >\r\n arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberGreaterThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberGreaterThan }\" >\r\n <mat-icon class=\"suffix-icons\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberEquals)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberEquals }\">\r\n <span class=\"suffix-icons\">=</span>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Boolean) {\r\n <div>\r\n <label>\r\n <mat-icon class=\"search-icon\">filter_list</mat-icon>\r\n </label>\r\n <mat-radio-group stop-propagation #ctrl=\"matRadioGroup\" #boolField='ngModel' class=\"font\" name=\"filterValue\" [ngModel]=\"undefined\" >\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(true);\" [value]=\"true\">True</mat-radio-button><br/>\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(false)\" [value]=\"false\">False</mat-radio-button><br/>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n @else if (metaData.fieldType === FieldType.Date || metaData.fieldType === FieldType.DateTime) {\r\n <mat-form-field class=\"font auto-width\" stop-propagation >\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrAfter)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrAfter }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrBefore)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrBefore }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateIsOn)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateIsOn }\">\r\n <span class=\"suffix-icons underline\"> =</span>\r\n </button>\r\n </span>\r\n <mat-label>{{currentFilterType === FilterType.DateIsOn ? 'On...' :\r\n currentFilterType === FilterType.DateOnOrBefore ? 'On or Before...' : 'On or After...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\" [matDatepicker]=\"calendar\"\r\n (click)=\"calendar.open()\"/>\r\n <mat-datepicker-toggle class=\"date-toggle header-filter-icon-button\" matSuffix [for]=\"calendar\" preventEnter></mat-datepicker-toggle>\r\n <mat-datepicker #calendar></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n <button mat-button (click)=\"onEnter(myForm.value)\" [disabled]=\"myForm.value.filterValue == undefined\" disableRipple>\r\n Apply\r\n </button>\r\n </ng-form>\r\n }\r\n</mat-menu>\r\n", styles: [":host{--mdc-text-button-container-height: 24px}:host{--mdc-filled-button-container-height: 24px}:host{--mdc-protected-button-container-height: 24px}:host{--mdc-outlined-button-container-height: 24px}:host{--mat-text-button-touch-target-display: none}:host{--mat-filled-button-touch-target-display: none}:host{--mat-protected-button-touch-target-display: none}:host{--mat-outlined-button-touch-target-display: none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.menu-icon{font-size:16px;line-height:16px;vertical-align:top;height:16px;width:16px}.search-icon{margin-right:16px;vertical-align:middle;height:24px;color:#0000008a;font-size:21px;line-height:1.125}.font{font-size:14px}.filter-radio-button:first-of-type{padding-left:0}.filter-radio-button{padding:10px 40px;min-width:110px}.auto-width{width:260px;margin:5px;display:block;height:55px}.open-menu-icon-button{height:28px;width:28px;padding:6px}.header-filter-icon-button{height:18px;width:18px;font-size:18px;padding:0;margin:0 2px}.header-filter-icon-button ::ng-deep *{line-height:initial;font-size:initial;height:18px;width:18px;font-size:18px;bottom:initial}.header-filter-icon-button.chosen-icon,.header-filter-icon-button.chosen-icon ::ng-deep *{height:22px;width:22px;font-size:22px;color:green}mat-icon.mat-icon.suffix-icons.underline{height:20px;text-decoration:underline .1px solid}.chosen-icon mat-icon.mat-icon.suffix-icons.underline{height:24px}::ng-deep .mat-mdc-form-field-icon-prefix:has(.tb-header-prefix),.tb-header-prefix{padding:0;flex-basis:36%}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper{line-height:0}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper:before{height:0}.date-toggle ::ng-deep svg{position:absolute;left:0;top:0}\n"] }]
|
|
3538
|
+
], template: "@let metaData = $metaData();\r\n@let currentFilterType = $currentFilterType();\r\n\r\n<button mat-icon-button class=\"open-menu-icon-button\" disableRipple [matMenuTriggerFor]=\"menu\" [matMenuTriggerRestoreFocus]=\"false\">\r\n <mat-icon class=\"menu-icon\">more_vert</mat-icon>\r\n</button>\r\n<mat-menu #menu=\"matMenu\" >\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <button mat-menu-item (click)=\"tableState.addGroupByKey(metaData.key)\">\r\n <mat-icon color=\"primary\">group</mat-icon>\r\n <span>Group By</span>\r\n </button>\r\n }\r\n <button mat-menu-item (click)=hideField(metaData.key)>\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n <span>Hide Column</span>\r\n </button>\r\n @if (!(metaData.fieldType === FieldType.NotMapped))\r\n {\r\n <ng-form #myForm=\"ngForm\" (keydown.enter)=\"onEnter(myForm.value)\" class=\"tb-header-filter\">\r\n <input type=\"hidden\" name=\"filterId\" [ngModel]=\"'header-column-' + metaData.key\" />\r\n <input type=\"hidden\" name=\"filterType\" [ngModel]=\"currentFilterType\" />\r\n <input type=\"hidden\" name=\"key\" [ngModel]=\"metaData.key\" />\r\n <input type=\"hidden\" name=\"fieldType\" [ngModel]=\"metaData.fieldType\" />\r\n \r\n @if(currentFilterType === FilterType.Or || currentFilterType === FilterType.In){\r\n <tb-in-list-filter name='filterValue' [key]='metaData.key' [ngModel]=\"undefined\"/>\r\n }\r\n @else if(metaData.fieldType === FieldType.Link || metaData.fieldType === FieldType.String || metaData.fieldType === FieldType.Array || metaData.fieldType === FieldType.Unknown || metaData.fieldType === FieldType.PhoneNumber) {\r\n <mat-form-field stop-propagation class=\"font auto-width\">\r\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\r\n <mat-label>{{currentFilterType === FilterType.StringDoesNotContain ? 'Does Not Contain...' : 'Contains...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\"/>\r\n <span matSuffix [matTooltip]=\"currentFilterType === FilterType.StringDoesNotContain ? 'Contains' : 'Does Not Contain'\">\r\n <button mat-icon-button color=\"primary\" (click)=\"setStringFilterType()\" class=\"header-filter-icon-button\">\r\n <mat-icon [class]=\"{'chosen-icon': currentFilterType === FilterType.StringDoesNotContain }\">\r\n block\r\n </mat-icon>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Number || metaData.fieldType === FieldType.Currency) {\r\n <mat-form-field class=\"auto-width\" stop-propagation>\r\n <mat-label>{{currentFilterType === FilterType.NumberEquals ? 'Equals...' : currentFilterType === FilterType.NumberLessThan ? 'Less Than...' : 'More Than...'}}</mat-label>\r\n <input matInput type='number' name=\"filterValue\" [ngModel]=\"undefined\" />\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberLessThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberLessThan }\">\r\n <mat-icon class=\"suffix-icons\"\r\n >\r\n arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberGreaterThan)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberGreaterThan }\" >\r\n <mat-icon class=\"suffix-icons\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.NumberEquals)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.NumberEquals }\">\r\n <span class=\"suffix-icons\">=</span>\r\n </button>\r\n </span>\r\n </mat-form-field>\r\n }\r\n @else if (metaData.fieldType === FieldType.Boolean) {\r\n <div>\r\n <label>\r\n <mat-icon class=\"search-icon\">filter_list</mat-icon>\r\n </label>\r\n <mat-radio-group stop-propagation #ctrl=\"matRadioGroup\" #boolField='ngModel' class=\"font\" name=\"filterValue\" [ngModel]=\"undefined\" >\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(true);\" [value]=\"true\">True</mat-radio-button><br/>\r\n <mat-radio-button class=\"filter-radio-button\" (click)=\"boolField.control.setValue(false)\" [value]=\"false\">False</mat-radio-button><br/>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n @else if (metaData.fieldType === FieldType.Date || metaData.fieldType === FieldType.DateTime) {\r\n <mat-form-field class=\"font auto-width\" stop-propagation >\r\n <span matPrefix class=\"tb-header-prefix\">\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrAfter)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrAfter }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_forward_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateOnOrBefore)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateOnOrBefore }\">\r\n <mat-icon class=\"suffix-icons underline\">arrow_back_ios</mat-icon>\r\n </button>\r\n <button mat-icon-button disableRipple class=\"header-filter-icon-button\" (click)=\"setFilterType(FilterType.DateIsOn)\"\r\n [class]=\"{'chosen-icon': currentFilterType === FilterType.DateIsOn }\">\r\n <span class=\"suffix-icons underline\"> =</span>\r\n </button>\r\n </span>\r\n <mat-label>{{currentFilterType === FilterType.DateIsOn ? 'On...' :\r\n currentFilterType === FilterType.DateOnOrBefore ? 'On or Before...' : 'On or After...'}}</mat-label>\r\n <input matInput name=\"filterValue\" [ngModel]=\"undefined\" [matDatepicker]=\"calendar\"\r\n (click)=\"calendar.open()\"/>\r\n <mat-datepicker-toggle class=\"date-toggle header-filter-icon-button\" matSuffix [for]=\"calendar\" preventEnter></mat-datepicker-toggle>\r\n <mat-datepicker #calendar></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n <button mat-button (click)=\"onEnter(myForm.value)\" [disabled]=\"myForm.value.filterValue == undefined\" disableRipple>\r\n Apply\r\n </button>\r\n </ng-form>\r\n }\r\n</mat-menu>\r\n", styles: [":host{--mdc-text-button-container-height: 24px}:host{--mdc-filled-button-container-height: 24px}:host{--mdc-protected-button-container-height: 24px}:host{--mdc-outlined-button-container-height: 24px}:host{--mat-text-button-touch-target-display: none}:host{--mat-filled-button-touch-target-display: none}:host{--mat-protected-button-touch-target-display: none}:host{--mat-outlined-button-touch-target-display: none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.menu-icon{font-size:16px;line-height:16px;vertical-align:top;height:16px;width:16px}.search-icon{margin-right:16px;vertical-align:middle;height:24px;width:24px;color:#0000008a;font-size:21px;line-height:1.125}.font{font-size:14px}.filter-radio-button:first-of-type{padding-left:0}.filter-radio-button{padding:10px 40px;min-width:110px}.auto-width{width:260px;margin:5px;display:block;height:55px}.open-menu-icon-button{height:28px;width:28px;padding:6px}.header-filter-icon-button{height:18px;width:18px;font-size:18px;padding:0;margin:0 2px}.header-filter-icon-button ::ng-deep *{line-height:initial;font-size:initial;height:18px;width:18px;font-size:18px;bottom:initial}.header-filter-icon-button.chosen-icon,.header-filter-icon-button.chosen-icon ::ng-deep *{height:22px;width:22px;font-size:22px;color:green}mat-icon.mat-icon.suffix-icons.underline{height:20px;text-decoration:underline .1px solid}.chosen-icon mat-icon.mat-icon.suffix-icons.underline{height:24px}::ng-deep .mat-mdc-form-field-icon-prefix:has(.tb-header-prefix),.tb-header-prefix{padding:0;flex-basis:36%}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper{line-height:0}.tb-header-filter ::ng-deep .mat-mdc-form-field-subscript-wrapper:before{height:0}.date-toggle ::ng-deep svg{position:absolute;left:0;top:0}\n"] }]
|
|
3526
3539
|
}] });
|
|
3527
3540
|
|
|
3528
3541
|
class ColumnTotalPipe {
|
|
@@ -3589,7 +3602,7 @@ const columnsStyles = (metaDatas, userDefinedWidths) => {
|
|
|
3589
3602
|
|
|
3590
3603
|
class ColumnBuilderComponent {
|
|
3591
3604
|
FieldType = FieldType;
|
|
3592
|
-
|
|
3605
|
+
config = inject(TableBuilderConfigToken);
|
|
3593
3606
|
table = inject(MatTable);
|
|
3594
3607
|
state = inject(TableStore);
|
|
3595
3608
|
templateService = inject(TableTemplateService);
|
|
@@ -3619,7 +3632,7 @@ class ColumnBuilderComponent {
|
|
|
3619
3632
|
const metaData = this.$metaData();
|
|
3620
3633
|
if (!metaData)
|
|
3621
3634
|
return;
|
|
3622
|
-
return
|
|
3635
|
+
return createTransformer(metaData, this.config);
|
|
3623
3636
|
});
|
|
3624
3637
|
$innerTemplate = computed(() => {
|
|
3625
3638
|
const metaData = this.$metaData();
|
|
@@ -3750,7 +3763,7 @@ class GenericTableComponent {
|
|
|
3750
3763
|
state = inject(TableStore);
|
|
3751
3764
|
dataStore = inject(DataStore);
|
|
3752
3765
|
viewContainer = inject(ViewContainerRef);
|
|
3753
|
-
|
|
3766
|
+
config = inject(TableBuilderConfigToken);
|
|
3754
3767
|
_injector = inject(Injector);
|
|
3755
3768
|
smallFooter = 10;
|
|
3756
3769
|
$headerRow = viewChild(MatHeaderRowDef);
|
|
@@ -3861,8 +3874,9 @@ class GenericTableComponent {
|
|
|
3861
3874
|
});
|
|
3862
3875
|
$usePaginator = computed(() => this.state.$tableSettings().usePaginator);
|
|
3863
3876
|
$useVirtualScroll = computed(() => this.state.$viewType().includes('virtual'));
|
|
3877
|
+
$virtualStart = this.dataStore.selectSignal(d => d.virtualEnds.start);
|
|
3864
3878
|
$offsetIndex = computed(() => {
|
|
3865
|
-
const virtualStart = this
|
|
3879
|
+
const virtualStart = this.$virtualStart();
|
|
3866
3880
|
const pageSize = this.state.$pageSize();
|
|
3867
3881
|
const currentPage = this.state.$currentPage();
|
|
3868
3882
|
if (this.$useVirtualScroll()) {
|
|
@@ -3978,7 +3992,7 @@ class GenericTableComponent {
|
|
|
3978
3992
|
if (val == undefined || val === 'null')
|
|
3979
3993
|
return '';
|
|
3980
3994
|
try {
|
|
3981
|
-
return
|
|
3995
|
+
return createTransformer(this.state.$getMetaData(key)(), this.config, true, true)({ [`${key}`]: val });
|
|
3982
3996
|
}
|
|
3983
3997
|
catch (error) {
|
|
3984
3998
|
return val;
|
|
@@ -4032,14 +4046,14 @@ class GenericTableComponent {
|
|
|
4032
4046
|
});
|
|
4033
4047
|
$stickyFooter = computed(() => this.state.$props().stickyFooter || this.state.$isVirtual());
|
|
4034
4048
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: GenericTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
4035
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { $displayDataLength: { classPropertyName: "$displayDataLength", publicName: "displayDataLength", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, $rows: { classPropertyName: "$rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null }, $dataSource: { classPropertyName: "$dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, $trackBy: { classPropertyName: "$trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "$dropList", first: true, predicate: CdkDropList, descendants: true, isSignal: true }], ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n #table\r\n [dataSource]=\"$dataSource()\"\r\n [trackBy]=\"$trackByFunction()\"\r\n [style]=\"$tableWidth()\"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n @let selection = $selection();\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!($masterToggleChecked())\"\r\n [indeterminate]=\"$masterToggleIndeterminate()\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index
|
|
4049
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { $displayDataLength: { classPropertyName: "$displayDataLength", publicName: "displayDataLength", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, $rows: { classPropertyName: "$rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null }, $dataSource: { classPropertyName: "$dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, $trackBy: { classPropertyName: "$trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "$dropList", first: true, predicate: CdkDropList, descendants: true, isSignal: true }], ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n #table\r\n [dataSource]=\"$dataSource()\"\r\n [trackBy]=\"$trackByFunction()\"\r\n [style]=\"$tableWidth()\"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n @let selection = $selection();\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!($masterToggleChecked())\"\r\n [indeterminate]=\"$masterToggleIndeterminate()\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index; let t\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.$getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.$props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.$props().isSticky\" [style.top.px]=\"($offset()! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$footerHeight()\" [style.min-height]=\"$footerHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? ($offset()) : undefined\"/>\r\n", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$6.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1$6.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1$6.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1$6.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1$2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4036
4050
|
}
|
|
4037
4051
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: GenericTableComponent, decorators: [{
|
|
4038
4052
|
type: Component,
|
|
4039
4053
|
args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
4040
4054
|
MatTableModule, DragDropModule, MatCheckboxModule, MatButtonModule, MatIconModule, NgTemplateOutlet,
|
|
4041
4055
|
MatTooltipModule, FunctionPipe,
|
|
4042
|
-
], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n #table\r\n [dataSource]=\"$dataSource()\"\r\n [trackBy]=\"$trackByFunction()\"\r\n [style]=\"$tableWidth()\"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n @let selection = $selection();\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!($masterToggleChecked())\"\r\n [indeterminate]=\"$masterToggleIndeterminate()\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index
|
|
4056
|
+
], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n #table\r\n [dataSource]=\"$dataSource()\"\r\n [trackBy]=\"$trackByFunction()\"\r\n [style]=\"$tableWidth()\"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n @let selection = $selection();\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!($masterToggleChecked())\"\r\n [indeterminate]=\"$masterToggleIndeterminate()\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index; let t\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.$getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.$props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.$props().isSticky\" [style.top.px]=\"($offset()! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$footerHeight()\" [style.min-height]=\"$footerHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? ($offset()) : undefined\"/>\r\n", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}\n"] }]
|
|
4043
4057
|
}] });
|
|
4044
4058
|
|
|
4045
4059
|
function downloadData(data, filename, mimeType) {
|
|
@@ -4445,17 +4459,20 @@ const tbGroupBy = (data, groupByKeys, parentGroupName) => {
|
|
|
4445
4459
|
};
|
|
4446
4460
|
});
|
|
4447
4461
|
};
|
|
4448
|
-
function updateGroupByState(
|
|
4449
|
-
if (
|
|
4450
|
-
|| dataUpdated(data, groups,
|
|
4451
|
-
|| groupsUpdated(groups,
|
|
4462
|
+
function updateGroupByState(groupedData, { data, groups, expanded }, firstRun) {
|
|
4463
|
+
if (firstRun
|
|
4464
|
+
|| dataUpdated(data, groups, expanded)
|
|
4465
|
+
|| groupsUpdated(groups, expanded)) {
|
|
4452
4466
|
groupedData = groups.value.length ? getGroupedData(data.value, groups.value) : data.value;
|
|
4453
4467
|
}
|
|
4454
|
-
const newDisplayData =
|
|
4468
|
+
const newDisplayData = expanded.value.length === 0
|
|
4455
4469
|
? groupedData
|
|
4456
|
-
: groupedData.map(group => mapGroupHeader(group,
|
|
4470
|
+
: groupedData.map(group => mapGroupHeader(group, expanded.value)).flat();
|
|
4457
4471
|
return ({ displayData: newDisplayData, groupedData });
|
|
4458
4472
|
}
|
|
4473
|
+
function _updateGroupByState({ groupedData }, [data, groups, expanded], index) {
|
|
4474
|
+
return updateGroupByState(groupedData, { data, groups, expanded }, index === 0);
|
|
4475
|
+
}
|
|
4459
4476
|
function mapGroupHeader(obj, data) {
|
|
4460
4477
|
const showChildren = data.find(a => a.expandedHeaders.includes(obj.groupName));
|
|
4461
4478
|
const children = !showChildren ? [] :
|
|
@@ -4492,6 +4509,15 @@ function sortData(data, sorted) {
|
|
|
4492
4509
|
return ordered;
|
|
4493
4510
|
}
|
|
4494
4511
|
function filterData(data, filters, resetAll = false) {
|
|
4512
|
+
if (filters.length === 0) {
|
|
4513
|
+
if (resetAll) {
|
|
4514
|
+
for (let index = 0; index < data.length; index++) {
|
|
4515
|
+
const element = data[index];
|
|
4516
|
+
element[tbNoShowSymbol] = false;
|
|
4517
|
+
}
|
|
4518
|
+
}
|
|
4519
|
+
return data;
|
|
4520
|
+
}
|
|
4495
4521
|
for (let index = 0; index < data.length; index++) {
|
|
4496
4522
|
const element = data[index];
|
|
4497
4523
|
const hide = !filters.every(filter => filter(element));
|
|
@@ -4503,19 +4529,33 @@ function filterData(data, filters, resetAll = false) {
|
|
|
4503
4529
|
}
|
|
4504
4530
|
const tbNoShowSymbol = Symbol('tb_no_show');
|
|
4505
4531
|
|
|
4506
|
-
const
|
|
4532
|
+
const _sortAndFilterData = (data, sortState, filterState) => combineLatest([
|
|
4507
4533
|
data.pipe(timestamp()),
|
|
4508
4534
|
sortState.pipe(timestamp()),
|
|
4509
4535
|
filterState.pipe(timestamp())
|
|
4510
|
-
]).pipe(scan((
|
|
4511
|
-
|
|
4512
|
-
|
|
4513
|
-
|
|
4514
|
-
|
|
4515
|
-
|
|
4516
|
-
|
|
4517
|
-
|
|
4518
|
-
|
|
4536
|
+
]).pipe(scan((mappedData, [data, sort, f], index) => {
|
|
4537
|
+
return mapDataSortsAndFilters(data, f, sort, index === 0, mappedData);
|
|
4538
|
+
}, [])).pipe(map$1((resultData) => resultData.filter(item => !item[tbNoShowSymbol])), defaultShareReplay());
|
|
4539
|
+
const mapDataSortsAndFilters = (allData, filters, sort, firstRun, filteredData) => {
|
|
4540
|
+
const fresh = firstRun || (allData.timestamp > sort.timestamp && allData.timestamp > filters.timestamp);
|
|
4541
|
+
const sortChanged = !fresh && sort.timestamp > filters.timestamp;
|
|
4542
|
+
const filterRemoved = !fresh && !sortChanged && !filters.value.onlyAddedFilters;
|
|
4543
|
+
const runAllOnAllData = fresh || filterRemoved;
|
|
4544
|
+
const resetFilters = !fresh && filterRemoved;
|
|
4545
|
+
if (runAllOnAllData) {
|
|
4546
|
+
const filteredData = filterData(sortData(allData.value, sort.value.sortsToRun), filters.value.allFilters, resetFilters);
|
|
4547
|
+
return filteredData;
|
|
4548
|
+
}
|
|
4549
|
+
if (sortChanged) {
|
|
4550
|
+
return (sortData(filteredData, sort.value.sortsToRun));
|
|
4551
|
+
}
|
|
4552
|
+
return (filterData(filteredData, filters.value.onlyAddedFilters || filters.value.allFilters, resetFilters));
|
|
4553
|
+
};
|
|
4554
|
+
const sortAndFilterData = (data, filters, sort, firstRun, resultData) => {
|
|
4555
|
+
const markedAndSortedData = mapDataSortsAndFilters(data, filters, sort, firstRun, resultData);
|
|
4556
|
+
const filteredData = markedAndSortedData.filter(item => !item[tbNoShowSymbol]);
|
|
4557
|
+
return filteredData;
|
|
4558
|
+
};
|
|
4519
4559
|
const createDataCleaners = (metadatas, mutate = false) => {
|
|
4520
4560
|
const transforms = createCleaners(metadatas);
|
|
4521
4561
|
return (data) => {
|
|
@@ -4748,7 +4788,7 @@ class TableBuilderDataSource extends MatTableDataSource {
|
|
|
4748
4788
|
const $pageSize = state.$pageSize;
|
|
4749
4789
|
const $virtualEnds = data.selectSignal(d => d.virtualEnds);
|
|
4750
4790
|
const $dataLength = computed(() => this.#$dataSrc().length);
|
|
4751
|
-
|
|
4791
|
+
this.$dataSize = computed(() => {
|
|
4752
4792
|
const viewType = state.$viewType();
|
|
4753
4793
|
const dataLength = $dataLength();
|
|
4754
4794
|
const currentPage = $currentPage();
|
|
@@ -4766,7 +4806,6 @@ class TableBuilderDataSource extends MatTableDataSource {
|
|
|
4766
4806
|
}
|
|
4767
4807
|
return ({ start: virtualEnds.start, end: virtualEnds.end });
|
|
4768
4808
|
});
|
|
4769
|
-
this.$dataSize = $dataSize;
|
|
4770
4809
|
}
|
|
4771
4810
|
connect() {
|
|
4772
4811
|
return super.connect();
|
|
@@ -4802,13 +4841,13 @@ function mergeCustomCellMetaData(metaData1, metaData2) {
|
|
|
4802
4841
|
class GroupByListComponent {
|
|
4803
4842
|
tableStore = inject(TableStore);
|
|
4804
4843
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: GroupByListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
4805
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: GroupByListComponent, isStandalone: true, selector: "group-by-list", ngImport: i0, template: "<
|
|
4844
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: GroupByListComponent, isStandalone: true, selector: "group-by-list", ngImport: i0, template: "<span class=\"tb-group-label\">Group By:</span>\r\n<mat-chip-set>\r\n @for (groupByKey of tableStore.$groupByKeys(); track groupByKey)\r\n {\r\n @if($index > 0)\r\n {\r\n <mat-icon class=\"nested-arrow\">arrow_right</mat-icon>\r\n }\r\n <mat-chip (removed)=\"tableStore.removeGroupByKey(groupByKey)\">\r\n {{groupByKey | spaceCase}}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n }\r\n</mat-chip-set>\r\n", styles: [".tb-group-label{font-weight:bolder;padding-right:15px}:host{display:flex;padding-left:8px;align-items:center}:host mat-chip-set mat-chip{margin:0}:host mat-chip-set .nested-arrow{display:flex;width:15px;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4$2.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: i4$2.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i4$2.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: SpaceCasePipe, name: "spaceCase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4806
4845
|
}
|
|
4807
4846
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: GroupByListComponent, decorators: [{
|
|
4808
4847
|
type: Component,
|
|
4809
4848
|
args: [{ selector: 'group-by-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
4810
4849
|
MatChipsModule, MatIconModule, SpaceCasePipe
|
|
4811
|
-
], template: "<
|
|
4850
|
+
], template: "<span class=\"tb-group-label\">Group By:</span>\r\n<mat-chip-set>\r\n @for (groupByKey of tableStore.$groupByKeys(); track groupByKey)\r\n {\r\n @if($index > 0)\r\n {\r\n <mat-icon class=\"nested-arrow\">arrow_right</mat-icon>\r\n }\r\n <mat-chip (removed)=\"tableStore.removeGroupByKey(groupByKey)\">\r\n {{groupByKey | spaceCase}}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n }\r\n</mat-chip-set>\r\n", styles: [".tb-group-label{font-weight:bolder;padding-right:15px}:host{display:flex;padding-left:8px;align-items:center}:host mat-chip-set mat-chip{margin:0}:host mat-chip-set .nested-arrow{display:flex;width:15px;justify-content:center}\n"] }]
|
|
4812
4851
|
}] });
|
|
4813
4852
|
|
|
4814
4853
|
class ProfilesMenuComponent {
|
|
@@ -4992,7 +5031,7 @@ class ResetMenuComponent {
|
|
|
4992
5031
|
$widthsSet = computed(() => Object.keys(this.state.$getUserDefinedWidths()).length);
|
|
4993
5032
|
$rowHeightSet = this.state.$userDefinedRowHeight;
|
|
4994
5033
|
headerHeightSet = this.state.$userDefinedHeaderHeight;
|
|
4995
|
-
pageSizeSet = this.state.$userDefinedPageSize;
|
|
5034
|
+
pageSizeSet = computed(() => this.state.$userDefinedPageSize() && this.state.$userDefinedPageSize() !== this.state.selectSignal(s => s.pageSize)());
|
|
4996
5035
|
showAllSet = this.state.selectSignal(s => s.userDefined.showAll);
|
|
4997
5036
|
$set = computed(() => {
|
|
4998
5037
|
const arr = [];
|
|
@@ -5069,93 +5108,120 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
5069
5108
|
}] });
|
|
5070
5109
|
|
|
5071
5110
|
class TableVirtualScrollStrategy {
|
|
5072
|
-
|
|
5073
|
-
|
|
5111
|
+
constructor(scrollContainer, dataStore) {
|
|
5112
|
+
this.$rowHeight = scrollContainer.computedRowHeight;
|
|
5113
|
+
this.$headerHeight = scrollContainer.computedHeaderHeight;
|
|
5114
|
+
this.viewport = scrollContainer.viewport;
|
|
5115
|
+
this.dataStore = dataStore;
|
|
5116
|
+
this.$dataLength = scrollContainer.$dataLength;
|
|
5117
|
+
}
|
|
5118
|
+
dataStore;
|
|
5074
5119
|
indexChange = new Subject();
|
|
5120
|
+
scrolledIndexChange = this.indexChange.pipe(distinctUntilChanged());
|
|
5075
5121
|
viewport;
|
|
5122
|
+
$dataLength;
|
|
5123
|
+
$dataLengthChange = linkedSignal({
|
|
5124
|
+
source: () => this.$dataLength(),
|
|
5125
|
+
computation: (curr, previous) => ({ curr, previous: previous == undefined ? curr : previous.source })
|
|
5126
|
+
});
|
|
5076
5127
|
$rowHeight;
|
|
5077
5128
|
$rowHeightChange = linkedSignal({
|
|
5078
5129
|
source: () => this.$rowHeight(),
|
|
5079
|
-
computation: (curr, previous) =>
|
|
5130
|
+
computation: (curr, previous) => {
|
|
5131
|
+
return ({ curr, previous: previous == undefined ? curr : previous.source });
|
|
5132
|
+
}
|
|
5080
5133
|
});
|
|
5081
5134
|
$headerHeight;
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5085
|
-
|
|
5086
|
-
}
|
|
5087
|
-
attach(viewport) {
|
|
5088
|
-
this.viewport = viewport;
|
|
5089
|
-
this.onDataLengthChanged();
|
|
5090
|
-
}
|
|
5135
|
+
$headerHeightChange = linkedSignal({
|
|
5136
|
+
source: () => this.$headerHeight(),
|
|
5137
|
+
computation: (curr, previous) => ({ curr, previous: previous == undefined ? curr : previous.source })
|
|
5138
|
+
});
|
|
5091
5139
|
contentScrolled$ = new Subject();
|
|
5092
|
-
sub = subscriber(this.contentScrolled$.pipe(
|
|
5140
|
+
sub = subscriber(this.contentScrolled$.pipe(debounceTime(20), distinctUntilChanged()), offset => {
|
|
5093
5141
|
this.updateContent('scroll');
|
|
5094
5142
|
});
|
|
5095
5143
|
onContentScrolled() {
|
|
5096
|
-
this.contentScrolled$.next();
|
|
5097
|
-
}
|
|
5098
|
-
onDataLengthChanged() {
|
|
5099
|
-
}
|
|
5100
|
-
setDataLength(length) {
|
|
5101
|
-
this.dataLength = length;
|
|
5102
|
-
if (this.viewport && this.$rowHeight) {
|
|
5103
|
-
this.viewport.setTotalContentSize(this.dataLength * this.$rowHeight());
|
|
5104
|
-
// this.updateContent('data ' + dataTrigger);
|
|
5105
|
-
}
|
|
5106
|
-
this.updateContent('data ');
|
|
5107
|
-
}
|
|
5108
|
-
detach() { }
|
|
5109
|
-
onContentRendered() { }
|
|
5110
|
-
onRenderedOffsetChanged() {
|
|
5111
|
-
}
|
|
5112
|
-
scrollToIndex(index, behavior) {
|
|
5144
|
+
this.contentScrolled$.next(this.viewport().measureScrollOffset());
|
|
5113
5145
|
}
|
|
5146
|
+
#onDataLengthChange = effect(() => {
|
|
5147
|
+
const dataLengthChange = this.$dataLengthChange();
|
|
5148
|
+
untracked(() => {
|
|
5149
|
+
if (dataLengthChange.curr === dataLengthChange.previous)
|
|
5150
|
+
return;
|
|
5151
|
+
this.updateContent('data length');
|
|
5152
|
+
});
|
|
5153
|
+
});
|
|
5114
5154
|
#onHeaderChange = effect(() => {
|
|
5115
|
-
|
|
5116
|
-
|
|
5155
|
+
const headerHeightChange = this.$headerHeightChange();
|
|
5156
|
+
untracked(() => {
|
|
5157
|
+
if (headerHeightChange.curr === headerHeightChange.previous)
|
|
5158
|
+
return;
|
|
5159
|
+
this.updateContent('header height');
|
|
5160
|
+
});
|
|
5117
5161
|
});
|
|
5118
5162
|
#onRowChange = effect(() => {
|
|
5119
|
-
|
|
5120
|
-
|
|
5163
|
+
const rowHeightChange = this.$rowHeightChange();
|
|
5164
|
+
untracked(() => {
|
|
5165
|
+
if (rowHeightChange.curr === rowHeightChange.previous)
|
|
5166
|
+
return;
|
|
5167
|
+
this.updateContent('row height');
|
|
5168
|
+
});
|
|
5121
5169
|
});
|
|
5170
|
+
$currentRange = signal({ start: 0, end: 0 });
|
|
5122
5171
|
updateContent(trigger) {
|
|
5123
|
-
|
|
5172
|
+
const viewport = this.viewport && this.viewport();
|
|
5173
|
+
if (!viewport || !this.$rowHeight) {
|
|
5124
5174
|
return;
|
|
5125
5175
|
}
|
|
5126
|
-
const currentContentHeight = +
|
|
5127
|
-
const newContentHeight = this
|
|
5176
|
+
const currentContentHeight = +viewport._totalContentHeight.replace('px', '');
|
|
5177
|
+
const newContentHeight = this.$dataLength() * this.$rowHeight();
|
|
5128
5178
|
if (currentContentHeight !== newContentHeight) {
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
this.update(trigger);
|
|
5132
|
-
}, 0);
|
|
5179
|
+
viewport.setTotalContentSize(newContentHeight);
|
|
5180
|
+
this.update(trigger, viewport, true);
|
|
5133
5181
|
return;
|
|
5134
5182
|
}
|
|
5135
|
-
this.update(trigger);
|
|
5183
|
+
this.update(trigger, viewport);
|
|
5136
5184
|
}
|
|
5137
|
-
update(trigger) {
|
|
5138
|
-
if (!
|
|
5185
|
+
update(trigger, viewport, needsScroll = false) {
|
|
5186
|
+
if (!viewport.getViewportSize())
|
|
5139
5187
|
return;
|
|
5140
|
-
}
|
|
5141
5188
|
const rowHeightChangeEvent = this.$rowHeightChange();
|
|
5142
5189
|
const rowHeight = rowHeightChangeEvent.curr;
|
|
5143
5190
|
const rowHeightAdjustment = trigger === 'row height' ? rowHeightChangeEvent.curr / rowHeightChangeEvent.previous : 1;
|
|
5144
|
-
const amountOfRows = Math.ceil((
|
|
5145
|
-
const f =
|
|
5146
|
-
const offset =
|
|
5147
|
-
|
|
5148
|
-
this.viewport.scrollToOffset(offset);
|
|
5149
|
-
}
|
|
5150
|
-
const buffer = 35;
|
|
5191
|
+
const amountOfRows = Math.ceil((viewport.getViewportSize() - this.$headerHeight()) / rowHeight);
|
|
5192
|
+
const f = viewport.measureScrollOffset();
|
|
5193
|
+
const offset = viewport.measureScrollOffset() * rowHeightAdjustment;
|
|
5194
|
+
const buffer = 35 + Math.round((40 - rowHeight) / 10);
|
|
5151
5195
|
const skip = Math.round(offset / rowHeight);
|
|
5152
5196
|
const index = skip % 2 === 0 ? skip : skip - 1;
|
|
5153
5197
|
const start = Math.max(0, index - buffer);
|
|
5154
|
-
const end = Math.min(this
|
|
5155
|
-
|
|
5156
|
-
|
|
5198
|
+
const end = Math.min(this.$dataLength(), index + amountOfRows + buffer);
|
|
5199
|
+
if (start > this.$dataLength()) {
|
|
5200
|
+
this.viewport().scrollToOffset(0);
|
|
5201
|
+
}
|
|
5202
|
+
else if (f !== offset) {
|
|
5203
|
+
if (offset < f)
|
|
5204
|
+
viewport.scrollToOffset(offset);
|
|
5205
|
+
else
|
|
5206
|
+
setTimeout(() => {
|
|
5207
|
+
viewport.scrollToOffset(offset);
|
|
5208
|
+
}, 0);
|
|
5209
|
+
}
|
|
5210
|
+
if (this.$currentRange().start === start && this.$currentRange().end === end) {
|
|
5211
|
+
return;
|
|
5212
|
+
}
|
|
5213
|
+
this.$currentRange.set({ start, end });
|
|
5214
|
+
viewport.setRenderedContentOffset(rowHeight * start);
|
|
5215
|
+
this.dataStore.patchState({ virtualScrollOffset: offset });
|
|
5216
|
+
viewport.setRenderedRange({ start, end });
|
|
5157
5217
|
this.indexChange.next(index);
|
|
5158
5218
|
}
|
|
5219
|
+
attach(viewport) { }
|
|
5220
|
+
onDataLengthChanged() { }
|
|
5221
|
+
detach() { }
|
|
5222
|
+
onContentRendered() { }
|
|
5223
|
+
onRenderedOffsetChanged() { }
|
|
5224
|
+
scrollToIndex(index, behavior) { }
|
|
5159
5225
|
}
|
|
5160
5226
|
|
|
5161
5227
|
class VirtualScrollContainer {
|
|
@@ -5173,7 +5239,13 @@ class VirtualScrollContainer {
|
|
|
5173
5239
|
viewPort$ = toObservable(this.viewport).pipe(notNull());
|
|
5174
5240
|
$scrolledIndexChange = toSignal(this.viewPort$.pipe(switchMap$1(v => v.scrolledIndexChange)));
|
|
5175
5241
|
$renderedRange = toSignal(this.viewPort$.pipe(switchMap$1(v => v.renderedRangeStream)));
|
|
5176
|
-
$virtualScrollOptions = computed(() =>
|
|
5242
|
+
$virtualScrollOptions = computed(() => {
|
|
5243
|
+
if (this.state.$initializationState() >= InitializationState.Ready)
|
|
5244
|
+
return this.state.$tableSettings().virtualSettings;
|
|
5245
|
+
else
|
|
5246
|
+
return undefined;
|
|
5247
|
+
});
|
|
5248
|
+
$optionsSet = computed(() => !!this.$virtualScrollOptions());
|
|
5177
5249
|
$dataLength = computed(() => {
|
|
5178
5250
|
const paginated = this.$usePaginator() && !this.$showAll();
|
|
5179
5251
|
const pageSize = this.$pageSize();
|
|
@@ -5186,58 +5258,41 @@ class VirtualScrollContainer {
|
|
|
5186
5258
|
constructor() {
|
|
5187
5259
|
addEventListener('resize', this.resizeHandler);
|
|
5188
5260
|
}
|
|
5189
|
-
setViewportEffect = effect(() => {
|
|
5261
|
+
#setViewportEffect = effect(() => {
|
|
5190
5262
|
const viewport = this.viewport();
|
|
5263
|
+
const options = this.$optionsSet();
|
|
5191
5264
|
untracked(() => {
|
|
5192
|
-
if (!!viewport) {
|
|
5193
|
-
this.setSize(this.viewport().elementRef);
|
|
5265
|
+
if (!!viewport && !!options) {
|
|
5266
|
+
this.setSize(this.viewport().elementRef, 'initial');
|
|
5194
5267
|
}
|
|
5195
5268
|
;
|
|
5196
5269
|
});
|
|
5197
5270
|
});
|
|
5198
|
-
subscriber = subscriber();
|
|
5199
5271
|
#onRenderedRangeEffect = effect(() => {
|
|
5200
5272
|
const renderedRange = this.$renderedRange();
|
|
5273
|
+
const viewport = this.viewport();
|
|
5201
5274
|
if (!renderedRange)
|
|
5202
5275
|
return;
|
|
5203
5276
|
untracked(() => {
|
|
5204
5277
|
this.dataStore.patchState({
|
|
5205
5278
|
virtualEnds: {
|
|
5206
5279
|
start: renderedRange.start,
|
|
5207
|
-
end: renderedRange.end
|
|
5280
|
+
end: renderedRange.end,
|
|
5208
5281
|
}
|
|
5209
5282
|
});
|
|
5210
|
-
|
|
5211
|
-
|
|
5212
|
-
|
|
5213
|
-
#onDataLengthEffect = effect(() => {
|
|
5214
|
-
const dataLength = this.$dataLength();
|
|
5215
|
-
untracked(() => {
|
|
5216
|
-
const renderedRange = this.$renderedRange();
|
|
5217
|
-
this.scrollStrategy.setDataLength(dataLength);
|
|
5218
|
-
if ((renderedRange?.start || 0) > dataLength) {
|
|
5219
|
-
this.viewport().scrollToOffset(0);
|
|
5220
|
-
}
|
|
5221
|
-
});
|
|
5222
|
-
});
|
|
5223
|
-
#onOffsetEffect = effect(() => {
|
|
5224
|
-
const offset = this.$offset();
|
|
5225
|
-
untracked(() => {
|
|
5226
|
-
this.dataStore.patchState({ virtualScrollOffset: offset });
|
|
5283
|
+
if (!viewport)
|
|
5284
|
+
return;
|
|
5285
|
+
this.setSize(viewport.elementRef, 'rendered range');
|
|
5227
5286
|
});
|
|
5228
5287
|
});
|
|
5229
|
-
$offset = computed(() => {
|
|
5230
|
-
const viewport = this.viewport();
|
|
5231
|
-
const scrolledIndexChange = this.$scrolledIndexChange();
|
|
5232
|
-
if (!scrolledIndexChange || !viewport)
|
|
5233
|
-
return 0;
|
|
5234
|
-
return viewport.getOffsetToRenderedContentStart() ?? 0;
|
|
5235
|
-
});
|
|
5236
5288
|
ngOnDestroy() {
|
|
5237
5289
|
removeEventListener('resize', this.resizeHandler);
|
|
5238
5290
|
}
|
|
5239
|
-
setSize(el) {
|
|
5291
|
+
setSize(el, trigger) {
|
|
5292
|
+
console.log(trigger);
|
|
5240
5293
|
const virtualScrollOptions = this.$virtualScrollOptions();
|
|
5294
|
+
if (!virtualScrollOptions)
|
|
5295
|
+
return;
|
|
5241
5296
|
if (virtualScrollOptions.dynamicHeight) {
|
|
5242
5297
|
this.calcDynamic(el);
|
|
5243
5298
|
return;
|
|
@@ -5254,18 +5309,10 @@ class VirtualScrollContainer {
|
|
|
5254
5309
|
height = maxViewPortHeightPx;
|
|
5255
5310
|
this.setHeight(height, el);
|
|
5256
5311
|
}
|
|
5257
|
-
calcDynamic$ = new Subject();
|
|
5258
|
-
$calcDynamic = toSignal(this.calcDynamic$.pipe(debounceTime$1(300)));
|
|
5259
|
-
#onCalcDynamicEffect = effect(() => {
|
|
5260
|
-
const el = this.$calcDynamic();
|
|
5261
|
-
if (!el)
|
|
5262
|
-
return;
|
|
5263
|
-
untracked(() => {
|
|
5264
|
-
this.calcDynamic(el);
|
|
5265
|
-
});
|
|
5266
|
-
});
|
|
5267
5312
|
calcDynamic(el) {
|
|
5268
5313
|
const virtualScrollOptions = this.$virtualScrollOptions();
|
|
5314
|
+
if (!virtualScrollOptions)
|
|
5315
|
+
return;
|
|
5269
5316
|
const t = this.tableContainer.elementRef.nativeElement.querySelector(`#${TableContainerComponent.headerId}`);
|
|
5270
5317
|
const rect = t?.getBoundingClientRect();
|
|
5271
5318
|
const windowHeight = window.innerHeight;
|
|
@@ -5300,8 +5347,8 @@ class VirtualScrollContainer {
|
|
|
5300
5347
|
this.dataStore.patchState({ virtualScrollOffset });
|
|
5301
5348
|
}
|
|
5302
5349
|
resizeHandler = () => {
|
|
5303
|
-
if (this.viewport() && this.$virtualScrollOptions()
|
|
5304
|
-
this.setSize(this.viewport().elementRef);
|
|
5350
|
+
if (this.viewport() && this.$virtualScrollOptions()?.dynamicHeight) {
|
|
5351
|
+
this.setSize(this.viewport().elementRef, 'resize');
|
|
5305
5352
|
}
|
|
5306
5353
|
};
|
|
5307
5354
|
computedRowHeight = computed(() => {
|
|
@@ -5325,7 +5372,7 @@ class VirtualScrollContainer {
|
|
|
5325
5372
|
return 0;
|
|
5326
5373
|
return parseTbSizeToPixels(virtualScrollOptions.dynamicalHeightBuffer) || 0;
|
|
5327
5374
|
});
|
|
5328
|
-
scrollStrategy = new TableVirtualScrollStrategy(this);
|
|
5375
|
+
scrollStrategy = new TableVirtualScrollStrategy(this, this.dataStore);
|
|
5329
5376
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: VirtualScrollContainer, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5330
5377
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.0.0", type: VirtualScrollContainer, isStandalone: true, selector: "tb-virtual-scroll-container", queries: [{ propertyName: "genericTable", first: true, predicate: GenericTableComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
5331
5378
|
<cdk-virtual-scroll-viewport>
|
|
@@ -5381,35 +5428,27 @@ class TableContainerComponent {
|
|
|
5381
5428
|
parent: this.injector
|
|
5382
5429
|
});
|
|
5383
5430
|
$tableBuilder = input.required({ alias: 'tableBuilder' });
|
|
5384
|
-
$
|
|
5385
|
-
$
|
|
5386
|
-
$inputFilters =
|
|
5431
|
+
$tableIdInput = input(undefined, { alias: 'tableId' });
|
|
5432
|
+
$trackByInput = input(undefined, { alias: 'trackBy' });
|
|
5433
|
+
$inputFilters = input([], { alias: 'inputFilters' });
|
|
5387
5434
|
predicateInputFilters$ = toObservable(computed(() => this.$inputFilters().filter(isFunction$1)));
|
|
5388
5435
|
$filterInfoInputs = computed(() => this.$inputFilters().filter(i => !isFunction$1(i)));
|
|
5389
|
-
$
|
|
5390
|
-
$
|
|
5391
|
-
$
|
|
5392
|
-
$
|
|
5436
|
+
$indexColumnInput = input(false, { alias: 'indexColumn' });
|
|
5437
|
+
$selectionColumnInput = input(false, { alias: 'selectionColumn' });
|
|
5438
|
+
$stickyHeaderInput = input(true, { alias: 'stickyHeader' });
|
|
5439
|
+
$stickyFooterInput = input(false, { alias: 'stickyFooter' });
|
|
5393
5440
|
$groupHeaderTemplate = input(undefined, { alias: 'groupHeaderTemplate' });
|
|
5394
5441
|
$groupHeaderHeight = input(undefined, { alias: 'groupHeaderHeight' });
|
|
5395
5442
|
$pageSize = input(undefined, { alias: 'pageSize' });
|
|
5396
|
-
$props = computed(() => {
|
|
5397
|
-
const indexColumn = this.$indexColumn();
|
|
5398
|
-
const selectionColumn = this.$selectionColumn();
|
|
5399
|
-
const isSticky = this.$isSticky();
|
|
5400
|
-
const stickyFooter = this.$stickyFooter();
|
|
5401
|
-
const groupHeaderTemplate = this.$groupHeaderTemplate();
|
|
5402
|
-
const groupHeaderHeight = this.$groupHeaderHeight();
|
|
5403
|
-
return ({ indexColumn, selectionColumn, isSticky, stickyFooter, groupHeaderTemplate, groupHeaderHeight });
|
|
5404
|
-
});
|
|
5405
5443
|
selection$ = output({ alias: 'selection' });
|
|
5406
5444
|
onStateReset$ = output({ alias: 'onStateReset' });
|
|
5407
5445
|
onSaveState$ = output({ alias: 'onSaveState' });
|
|
5408
5446
|
_state$ = toObservable(this.state.$savableState);
|
|
5409
5447
|
state$ = outputFromObservable(this._state$, { alias: 'state' });
|
|
5410
|
-
|
|
5448
|
+
$data = computed(() => this.$sortedAndFilteredData()?.value || []);
|
|
5449
|
+
_data$ = toObservable(this.$data);
|
|
5411
5450
|
data$ = outputFromObservable(this._data$, { alias: 'data' });
|
|
5412
|
-
$
|
|
5451
|
+
$displayData = computed(() => this.$tableBuilder() && this.$filteredSortedAndGrouped()?.displayData);
|
|
5413
5452
|
clearSelections() {
|
|
5414
5453
|
this.$genericTable()?.$selection().clear(true);
|
|
5415
5454
|
}
|
|
@@ -5433,14 +5472,37 @@ class TableContainerComponent {
|
|
|
5433
5472
|
$useVirtual = this.state.$isVirtual;
|
|
5434
5473
|
$collapsedFooter = this.state.$footerCollapsed;
|
|
5435
5474
|
$collapsedHeader = this.state.$headerCollapsed;
|
|
5436
|
-
$displayDataLength = computed(() => this.$displayData()
|
|
5475
|
+
$displayDataLength = computed(() => this.$displayData()?.length || 0);
|
|
5476
|
+
$tableBuilderSettings = computed(() => this.$tableBuilder().$settings());
|
|
5477
|
+
$trackBy = computed(() => this.$trackByInput() || this.$tableBuilderSettings()?.tableSettings?.trackBy);
|
|
5478
|
+
$tableId = computed(() => this.$tableIdInput() || this.$tableBuilderSettings()?.tableSettings?.tableId);
|
|
5479
|
+
$includeSelectionColumn = computed(() => this.$selectionColumnInput() || !!this.$tableBuilderSettings()?.tableSettings?.includeSelectionColumn);
|
|
5480
|
+
$includeIndexColumn = computed(() => this.$indexColumnInput() || !!this.$tableBuilderSettings()?.tableSettings?.includeIndexColumn);
|
|
5481
|
+
$stickyHeader = computed(() => {
|
|
5482
|
+
const settings = this.$tableBuilderSettings()?.columnHeaderSettings?.stickyHeaderRow;
|
|
5483
|
+
if (settings != null) {
|
|
5484
|
+
return settings;
|
|
5485
|
+
}
|
|
5486
|
+
return this.$stickyHeaderInput();
|
|
5487
|
+
});
|
|
5488
|
+
$stickyFooter = computed(() => this.$stickyFooterInput() || !!this.$tableBuilderSettings()?.columnFooterSettings?.stickyFooterRow);
|
|
5489
|
+
$props = computed(() => {
|
|
5490
|
+
const indexColumn = this.$includeIndexColumn();
|
|
5491
|
+
const selectionColumn = this.$includeSelectionColumn();
|
|
5492
|
+
const stickHeader = this.$stickyHeader();
|
|
5493
|
+
const stickyFooter = this.$stickyFooter();
|
|
5494
|
+
const groupHeaderTemplate = this.$groupHeaderTemplate();
|
|
5495
|
+
const groupHeaderHeight = this.$groupHeaderHeight();
|
|
5496
|
+
return ({ indexColumn, selectionColumn, isSticky: stickHeader, stickyFooter, groupHeaderTemplate, groupHeaderHeight });
|
|
5497
|
+
});
|
|
5437
5498
|
#initializeTableSettingsFromTableBuilderAndPersistedStateEffect = effect(() => {
|
|
5438
5499
|
const metaLoaded = this.$isInitializationState(InitializationState.MetaDataLoaded)();
|
|
5439
5500
|
if (!metaLoaded)
|
|
5440
5501
|
return;
|
|
5441
5502
|
const persistedState = this.$persistedState();
|
|
5503
|
+
const tbSettings = this.$tableBuilderSettings();
|
|
5442
5504
|
untracked(() => {
|
|
5443
|
-
this.state.setTableSettings(
|
|
5505
|
+
this.state.setTableSettings(tbSettings);
|
|
5444
5506
|
if (persistedState) {
|
|
5445
5507
|
persistedState.persistedTableSettings = new PersistedTableSettings(persistedState.persistedTableSettings);
|
|
5446
5508
|
this.state.updateStateFromPersistedState(persistedState);
|
|
@@ -5507,10 +5569,22 @@ class TableContainerComponent {
|
|
|
5507
5569
|
});
|
|
5508
5570
|
#initializeDataEffect = effect(() => {
|
|
5509
5571
|
const tableBuilder = this.$tableBuilder();
|
|
5510
|
-
|
|
5572
|
+
const data = this.$sortedAndFilteredData();
|
|
5573
|
+
if (!tableBuilder || !data)
|
|
5574
|
+
return;
|
|
5575
|
+
untracked(() => {
|
|
5576
|
+
this.dataStore.patchState({ sortedFilteredDataLength: data.value.length });
|
|
5577
|
+
});
|
|
5578
|
+
});
|
|
5579
|
+
#initializeDataEffect2 = effect(() => {
|
|
5580
|
+
const tableBuilder = this.$tableBuilder();
|
|
5581
|
+
const flat = this.$filteredSortedAndGrouped();
|
|
5582
|
+
if (!tableBuilder || !flat)
|
|
5511
5583
|
return;
|
|
5512
5584
|
untracked(() => {
|
|
5513
|
-
|
|
5585
|
+
const data = flat.displayData;
|
|
5586
|
+
this.dataSource.setData(data);
|
|
5587
|
+
this.dataStore.patchState({ sortedFilteredGroupedDataLength: data.length });
|
|
5514
5588
|
});
|
|
5515
5589
|
});
|
|
5516
5590
|
$persistedState = computed(() => {
|
|
@@ -5526,12 +5600,7 @@ class TableContainerComponent {
|
|
|
5526
5600
|
}
|
|
5527
5601
|
return [...this.$filterDirectives(), ...this.$customFilterDirectives()];
|
|
5528
5602
|
});
|
|
5529
|
-
|
|
5530
|
-
const a = d.map(d => d.filter$);
|
|
5531
|
-
return combineLatest(a).pipe(startWith([]));
|
|
5532
|
-
}), map(createFilterFuncs));
|
|
5533
|
-
tableBuilderMetaData$ = toObservable(this.$tableBuilder).pipe(notNull(), switchMap(tb => tb.metaData$));
|
|
5534
|
-
$tableBuilderMetaData = toSignal(this.tableBuilderMetaData$);
|
|
5603
|
+
$tableBuilderMetaData = computed(() => this.$tableBuilder()?.$metaData());
|
|
5535
5604
|
$allMetaDatas = computed(() => {
|
|
5536
5605
|
const tableBuilderMetaData = this.$tableBuilderMetaData();
|
|
5537
5606
|
if (!tableBuilderMetaData)
|
|
@@ -5540,39 +5609,117 @@ class TableContainerComponent {
|
|
|
5540
5609
|
const mappedCustomCellMetaDatas = customCellMetaDatas.map(md => mergeCustomCellMetaData(md, tableBuilderMetaData.find(item => item.key === md.key)));
|
|
5541
5610
|
return [...tableBuilderMetaData, ...mappedCustomCellMetaDatas];
|
|
5542
5611
|
});
|
|
5543
|
-
|
|
5612
|
+
ngOnInit() {
|
|
5613
|
+
this.$tableBuilder().prep(this.injector);
|
|
5614
|
+
}
|
|
5544
5615
|
ngOnDestroy() {
|
|
5545
5616
|
const tableId = this.$tableId();
|
|
5546
5617
|
if (tableId) {
|
|
5547
5618
|
this.stateService.saveTableStateToLocal({ tableId, tableState: this.state.$savableState() });
|
|
5548
5619
|
}
|
|
5549
5620
|
}
|
|
5550
|
-
|
|
5551
|
-
const
|
|
5552
|
-
|
|
5553
|
-
|
|
5554
|
-
|
|
5555
|
-
|
|
5556
|
-
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5562
|
-
|
|
5563
|
-
|
|
5621
|
+
$preds = computed(() => {
|
|
5622
|
+
const predicateInputFilters = this.$inputFilters().filter(isFunction$1);
|
|
5623
|
+
const notSavableFilterDirectives = this.$allFilterDirectives()
|
|
5624
|
+
.filter(d => !d.savable)
|
|
5625
|
+
.map(d => d.$filter())
|
|
5626
|
+
.filter(d => !!d && needsFilterCreation(d))
|
|
5627
|
+
.map(d => createFilterFunc(d));
|
|
5628
|
+
return [...predicateInputFilters, ...notSavableFilterDirectives];
|
|
5629
|
+
});
|
|
5630
|
+
$predicateFiltersState = linkedSignal({
|
|
5631
|
+
source: this.$preds,
|
|
5632
|
+
computation: (curr, previous) => {
|
|
5633
|
+
if (!previous?.value)
|
|
5634
|
+
return ({ value: updateFilterPredicateState({ allFilters: [] }, curr), timestamp: new Date().getTime() });
|
|
5635
|
+
return ({ value: updateFilterPredicateState(previous.value.value, curr), timestamp: new Date().getTime() });
|
|
5636
|
+
}
|
|
5637
|
+
});
|
|
5638
|
+
$savableFiltersState = linkedSignal({
|
|
5639
|
+
source: this.state.$filters,
|
|
5640
|
+
computation: (curr, previous) => {
|
|
5641
|
+
if (!previous?.value)
|
|
5642
|
+
return ({ value: updateFilterInfoState({ allFilters: {} }, curr), timestamp: new Date().getTime() });
|
|
5643
|
+
return ({ value: updateFilterInfoState(previous.value.value, curr), timestamp: new Date().getTime() });
|
|
5644
|
+
}
|
|
5645
|
+
});
|
|
5646
|
+
$allFilterStatesTimeStamped = computed(() => {
|
|
5647
|
+
if (!this.$isInitializationState(InitializationState.Ready)())
|
|
5648
|
+
return undefined;
|
|
5649
|
+
return ({ value: updateFilterState(this.$savableFiltersState(), this.$predicateFiltersState()), timestamp: new Date().getTime() });
|
|
5650
|
+
});
|
|
5651
|
+
$sortStateTimeStamped = linkedSignal({
|
|
5652
|
+
source: computed(() => this.$isInitializationState(InitializationState.Ready)() && this.state.$getSorts()),
|
|
5653
|
+
computation: (curr, prev) => {
|
|
5654
|
+
if (!curr)
|
|
5655
|
+
return undefined;
|
|
5656
|
+
if (!prev?.value)
|
|
5657
|
+
return ({ value: updateSortState(initialSortState, curr), timestamp: new Date().getTime() });
|
|
5658
|
+
return ({ value: updateSortState(prev.value.value, curr), timestamp: new Date().getTime() });
|
|
5659
|
+
}
|
|
5660
|
+
});
|
|
5661
|
+
$allData = computed(() => this.$tableBuilder()?.$data() || []);
|
|
5662
|
+
$allDataTimeStamped = computed(() => {
|
|
5663
|
+
const data = this.$allData();
|
|
5664
|
+
if (!data)
|
|
5665
|
+
return undefined;
|
|
5666
|
+
return ({
|
|
5667
|
+
value: data,
|
|
5668
|
+
timestamp: new Date().getTime()
|
|
5564
5669
|
});
|
|
5565
|
-
|
|
5566
|
-
|
|
5567
|
-
|
|
5568
|
-
|
|
5670
|
+
});
|
|
5671
|
+
$allTimeStamped = computed(() => {
|
|
5672
|
+
const data = this.$allDataTimeStamped();
|
|
5673
|
+
const sort = this.$sortStateTimeStamped();
|
|
5674
|
+
const filter = this.$allFilterStatesTimeStamped();
|
|
5675
|
+
if (!data?.value || !sort?.value || !filter?.value)
|
|
5676
|
+
return undefined;
|
|
5677
|
+
return ({
|
|
5678
|
+
data,
|
|
5679
|
+
sort,
|
|
5680
|
+
filter
|
|
5569
5681
|
});
|
|
5570
|
-
}
|
|
5682
|
+
});
|
|
5683
|
+
$sortedAndFilteredData = linkedSignal({
|
|
5684
|
+
source: this.$allTimeStamped,
|
|
5685
|
+
computation: (values, prev) => {
|
|
5686
|
+
const init = this.$isInitializationState(InitializationState.Ready);
|
|
5687
|
+
if (!values || !init)
|
|
5688
|
+
return undefined;
|
|
5689
|
+
const { data, filter, sort } = values;
|
|
5690
|
+
const val = prev?.value?.value || data.value;
|
|
5691
|
+
const filteredData = sortAndFilterData(data, filter, sort, !prev?.value, val);
|
|
5692
|
+
return ({ value: filteredData, timestamp: new Date().getTime() });
|
|
5693
|
+
}
|
|
5694
|
+
});
|
|
5695
|
+
$timestampedGroups = computed(() => ({ value: this.state.$groupByKeys(), timestamp: new Date().getTime() }));
|
|
5696
|
+
$timestampedExpanded = computed(() => ({ value: this.state.$expandGroups(), timestamp: new Date().getTime() }));
|
|
5697
|
+
$dataAndGroupsTimestamped = computed(() => {
|
|
5698
|
+
const data = this.$sortedAndFilteredData();
|
|
5699
|
+
const groups = this.$timestampedGroups();
|
|
5700
|
+
const expanded = this.$timestampedExpanded();
|
|
5701
|
+
if (!data)
|
|
5702
|
+
return undefined;
|
|
5703
|
+
return ({
|
|
5704
|
+
data,
|
|
5705
|
+
groups,
|
|
5706
|
+
expanded
|
|
5707
|
+
});
|
|
5708
|
+
});
|
|
5709
|
+
$filteredSortedAndGrouped = linkedSignal({
|
|
5710
|
+
source: this.$dataAndGroupsTimestamped,
|
|
5711
|
+
computation: (curr, prev) => {
|
|
5712
|
+
if (!curr)
|
|
5713
|
+
return undefined;
|
|
5714
|
+
const val = prev?.value?.groupedData || [];
|
|
5715
|
+
return updateGroupByState(val, curr, !prev?.value);
|
|
5716
|
+
}
|
|
5717
|
+
});
|
|
5571
5718
|
$isInitializationState = (state) => computed(() => this.state.selectSignal(s => s.initializationState >= state)());
|
|
5572
5719
|
static headerId = 'tb-header-wrapper';
|
|
5573
5720
|
headerId = TableContainerComponent.headerId;
|
|
5574
5721
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TableContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5575
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: TableContainerComponent, isStandalone: true, selector: "tb-table-container", inputs: { $tableBuilder: { classPropertyName: "$tableBuilder", publicName: "tableBuilder", isSignal: true, isRequired: true, transformFunction: null }, $
|
|
5722
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: TableContainerComponent, isStandalone: true, selector: "tb-table-container", inputs: { $tableBuilder: { classPropertyName: "$tableBuilder", publicName: "tableBuilder", isSignal: true, isRequired: true, transformFunction: null }, $tableIdInput: { classPropertyName: "$tableIdInput", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, $trackByInput: { classPropertyName: "$trackByInput", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, $inputFilters: { classPropertyName: "$inputFilters", publicName: "inputFilters", isSignal: true, isRequired: false, transformFunction: null }, $indexColumnInput: { classPropertyName: "$indexColumnInput", publicName: "indexColumn", isSignal: true, isRequired: false, transformFunction: null }, $selectionColumnInput: { classPropertyName: "$selectionColumnInput", publicName: "selectionColumn", isSignal: true, isRequired: false, transformFunction: null }, $stickyHeaderInput: { classPropertyName: "$stickyHeaderInput", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, $stickyFooterInput: { classPropertyName: "$stickyFooterInput", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null }, $groupHeaderTemplate: { classPropertyName: "$groupHeaderTemplate", publicName: "groupHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, $groupHeaderHeight: { classPropertyName: "$groupHeaderHeight", publicName: "groupHeaderHeight", isSignal: true, isRequired: false, transformFunction: null }, $pageSize: { classPropertyName: "$pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection", onStateReset$: "onStateReset", onSaveState$: "onSaveState", state$: "state", data$: "data" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore, DataStore], queries: [{ propertyName: "$filterDirectives", predicate: TableFilterDirective, descendants: true, isSignal: true }, { propertyName: "$customFilterDirectives", predicate: TableCustomFilterDirective, descendants: true, isSignal: true }, { propertyName: "_$customRows", predicate: (MatRowDef), isSignal: true }, { propertyName: "$customCells", predicate: CustomCellDirective, isSignal: true }], viewQueries: [{ propertyName: "$paginatorComponent", first: true, predicate: PaginatorComponent, descendants: true, isSignal: true }, { propertyName: "$genericTable", first: true, predicate: GenericTableComponent, descendants: true, isSignal: true }, { propertyName: "$menu", first: true, predicate: MatMenu, descendants: true, isSignal: true }], ngImport: i0, template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)\r\n {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n </div>\r\n @if(state.$groupByKeys().length){\r\n <group-by-list />\r\n }\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader) {\r\n @if (!$collapsedHeader()) {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"l.menu()\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <lib-table-header-menu #l/>\r\n\r\n }\r\n @else {\r\n <mat-icon color=\"primary\" [matMenuTriggerFor]=\"mainMenu\" class=\"flat-menu-button pointer\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu; injector menuInjector\"/>\r\n </div>\r\n <lib-table-header-menu />\r\n </mat-menu>\r\n }\r\n <mat-icon [matTooltip]=\"$collapsedHeader() ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n @if($useVirtual())\r\n {\r\n <tb-virtual-scroll-container class=\"scrollable\">\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n (selection)='selection$.emit($event)' [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" />\r\n </tb-virtual-scroll-container>\r\n }\r\n @else\r\n {\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n (selection)='selection$.emit($event)' [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" />\r\n }\r\n @if(tableSettings.usePaginator)\r\n {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator />\r\n\r\n <mat-icon [matTooltip]=\"$collapsedFooter() ? 'expand' : 'collapse'\" class=\"collapse-icon footer\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n\r\n <ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n @if (!!tableId) {<tb-profiles-menu [tableId]=\"tableId\"/>}\r\n </ng-template>\r\n\r\n</ng-container>\r\n", styles: [".tb-header-wrapper{display:flex;flex-direction:row;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-left:auto}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.profiles-menu{visibility:hidden;width:0px;height:0px;display:block;overflow:hidden;position:absolute;top:50px}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}.paginator-row{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PaginatorComponent, selector: "tb-paginator" }, { kind: "directive", type: MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: GroupByListComponent, selector: "group-by-list" }, { kind: "component", type: FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "component", type: GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: GenericTableComponent, selector: "tb-generic-table", inputs: ["displayDataLength", "data", "rows", "columnInfos", "dataSource", "trackBy"], outputs: ["selection"] }, { kind: "component", type: ProfilesMenuComponent, selector: "tb-profiles-menu", inputs: ["tableId", "isMatMenuChild"] }, { kind: "component", type: TableHeaderMenuComponent, selector: "lib-table-header-menu" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i1$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: VirtualScrollContainer, selector: "tb-virtual-scroll-container" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
5576
5723
|
}
|
|
5577
5724
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TableContainerComponent, decorators: [{
|
|
5578
5725
|
type: Component,
|
|
@@ -5580,7 +5727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
5580
5727
|
PaginatorComponent,
|
|
5581
5728
|
MultiSortDirective, GroupByListComponent, FilterChipsComponent, GenFilterDisplayerComponent, GenColDisplayerComponent,
|
|
5582
5729
|
SortMenuComponent, GenericTableComponent, ProfilesMenuComponent, TableHeaderMenuComponent,
|
|
5583
|
-
MatButtonModule, MatMenuModule, MatIconModule, MatTooltipModule, VirtualScrollContainer], template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)
|
|
5730
|
+
MatButtonModule, MatMenuModule, MatIconModule, MatTooltipModule, VirtualScrollContainer], template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)\r\n {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n </div>\r\n @if(state.$groupByKeys().length){\r\n <group-by-list />\r\n }\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader) {\r\n @if (!$collapsedHeader()) {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"l.menu()\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <lib-table-header-menu #l/>\r\n\r\n }\r\n @else {\r\n <mat-icon color=\"primary\" [matMenuTriggerFor]=\"mainMenu\" class=\"flat-menu-button pointer\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu; injector menuInjector\"/>\r\n </div>\r\n <lib-table-header-menu />\r\n </mat-menu>\r\n }\r\n <mat-icon [matTooltip]=\"$collapsedHeader() ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n @if($useVirtual())\r\n {\r\n <tb-virtual-scroll-container class=\"scrollable\">\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n (selection)='selection$.emit($event)' [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" />\r\n </tb-virtual-scroll-container>\r\n }\r\n @else\r\n {\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n (selection)='selection$.emit($event)' [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" />\r\n }\r\n @if(tableSettings.usePaginator)\r\n {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator />\r\n\r\n <mat-icon [matTooltip]=\"$collapsedFooter() ? 'expand' : 'collapse'\" class=\"collapse-icon footer\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n\r\n <ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n @if (!!tableId) {<tb-profiles-menu [tableId]=\"tableId\"/>}\r\n </ng-template>\r\n\r\n</ng-container>\r\n", styles: [".tb-header-wrapper{display:flex;flex-direction:row;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-left:auto}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.profiles-menu{visibility:hidden;width:0px;height:0px;display:block;overflow:hidden;position:absolute;top:50px}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}.paginator-row{display:flex;align-items:center}\n"] }]
|
|
5584
5731
|
}] });
|
|
5585
5732
|
|
|
5586
5733
|
class TableBuilderModule {
|
|
@@ -5593,102 +5740,38 @@ class TableBuilderModule {
|
|
|
5593
5740
|
};
|
|
5594
5741
|
}
|
|
5595
5742
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TableBuilderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
5596
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: TableBuilderModule, imports: [
|
|
5597
|
-
MatDialogModule,
|
|
5598
|
-
MatNativeDateModule,
|
|
5599
|
-
RouterModule,
|
|
5600
|
-
TableContainerComponent,
|
|
5601
|
-
GenericTableComponent,
|
|
5602
|
-
TableContainerComponent,
|
|
5743
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: TableBuilderModule, imports: [TableContainerComponent,
|
|
5603
5744
|
CustomCellDirective,
|
|
5604
|
-
FilterComponent,
|
|
5605
|
-
MatSlideToggleTbFilterDirective,
|
|
5606
|
-
MatRadioButtonTbFilterDirective,
|
|
5607
|
-
MatOptionTbFilterDirective,
|
|
5608
|
-
MatCheckboxTbFilterDirective,
|
|
5609
|
-
MatButtonToggleFilterDirective,
|
|
5610
5745
|
TableFilterDirective,
|
|
5611
5746
|
TableFilterStringContainsDirective,
|
|
5612
|
-
TableWrapperDirective,
|
|
5613
|
-
ResizeColumnDirective,
|
|
5614
|
-
UtilitiesModule], exports: [GenericTableComponent,
|
|
5615
|
-
TableContainerComponent,
|
|
5747
|
+
TableWrapperDirective], exports: [TableContainerComponent,
|
|
5616
5748
|
CustomCellDirective,
|
|
5617
|
-
FilterComponent,
|
|
5618
|
-
MatSlideToggleTbFilterDirective,
|
|
5619
|
-
MatRadioButtonTbFilterDirective,
|
|
5620
|
-
MatOptionTbFilterDirective,
|
|
5621
|
-
MatCheckboxTbFilterDirective,
|
|
5622
|
-
MatButtonToggleFilterDirective,
|
|
5623
|
-
TableFilterDirective,
|
|
5624
5749
|
TableFilterStringContainsDirective,
|
|
5625
5750
|
TableWrapperDirective,
|
|
5626
|
-
ResizeColumnDirective,
|
|
5627
5751
|
UtilitiesModule] });
|
|
5628
5752
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TableBuilderModule, providers: [
|
|
5629
|
-
SpaceCasePipe,
|
|
5630
|
-
DatePipe,
|
|
5631
|
-
CurrencyPipe,
|
|
5632
|
-
PhoneNumberPipe,
|
|
5633
5753
|
MultiSortDirective,
|
|
5634
|
-
|
|
5635
|
-
], imports: [CommonModule,
|
|
5636
|
-
MatDialogModule,
|
|
5637
|
-
MatNativeDateModule,
|
|
5638
|
-
RouterModule,
|
|
5639
|
-
TableContainerComponent,
|
|
5640
|
-
GenericTableComponent,
|
|
5641
|
-
TableContainerComponent,
|
|
5642
|
-
FilterComponent,
|
|
5643
|
-
UtilitiesModule, UtilitiesModule] });
|
|
5754
|
+
], imports: [TableContainerComponent, UtilitiesModule] });
|
|
5644
5755
|
}
|
|
5645
5756
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TableBuilderModule, decorators: [{
|
|
5646
5757
|
type: NgModule,
|
|
5647
5758
|
args: [{
|
|
5648
5759
|
imports: [
|
|
5649
|
-
CommonModule,
|
|
5650
|
-
MatDialogModule,
|
|
5651
|
-
MatNativeDateModule,
|
|
5652
|
-
RouterModule,
|
|
5653
|
-
TableContainerComponent,
|
|
5654
|
-
GenericTableComponent,
|
|
5655
5760
|
TableContainerComponent,
|
|
5656
5761
|
CustomCellDirective,
|
|
5657
|
-
FilterComponent,
|
|
5658
|
-
MatSlideToggleTbFilterDirective,
|
|
5659
|
-
MatRadioButtonTbFilterDirective,
|
|
5660
|
-
MatOptionTbFilterDirective,
|
|
5661
|
-
MatCheckboxTbFilterDirective,
|
|
5662
|
-
MatButtonToggleFilterDirective,
|
|
5663
5762
|
TableFilterDirective,
|
|
5664
5763
|
TableFilterStringContainsDirective,
|
|
5665
5764
|
TableWrapperDirective,
|
|
5666
|
-
ResizeColumnDirective,
|
|
5667
|
-
UtilitiesModule,
|
|
5668
5765
|
],
|
|
5669
5766
|
exports: [
|
|
5670
|
-
GenericTableComponent,
|
|
5671
5767
|
TableContainerComponent,
|
|
5672
5768
|
CustomCellDirective,
|
|
5673
|
-
FilterComponent,
|
|
5674
|
-
MatSlideToggleTbFilterDirective,
|
|
5675
|
-
MatRadioButtonTbFilterDirective,
|
|
5676
|
-
MatOptionTbFilterDirective,
|
|
5677
|
-
MatCheckboxTbFilterDirective,
|
|
5678
|
-
MatButtonToggleFilterDirective,
|
|
5679
|
-
TableFilterDirective,
|
|
5680
5769
|
TableFilterStringContainsDirective,
|
|
5681
5770
|
TableWrapperDirective,
|
|
5682
|
-
ResizeColumnDirective,
|
|
5683
5771
|
UtilitiesModule,
|
|
5684
5772
|
],
|
|
5685
5773
|
providers: [
|
|
5686
|
-
SpaceCasePipe,
|
|
5687
|
-
DatePipe,
|
|
5688
|
-
CurrencyPipe,
|
|
5689
|
-
PhoneNumberPipe,
|
|
5690
5774
|
MultiSortDirective,
|
|
5691
|
-
TableBuilderStateStore,
|
|
5692
5775
|
]
|
|
5693
5776
|
}]
|
|
5694
5777
|
}] });
|
|
@@ -5716,66 +5799,86 @@ class MatTableObservableDataSource extends MatTableDataSource {
|
|
|
5716
5799
|
}
|
|
5717
5800
|
|
|
5718
5801
|
class TableBuilder {
|
|
5719
|
-
|
|
5720
|
-
|
|
5721
|
-
settings
|
|
5802
|
+
data;
|
|
5803
|
+
metaData;
|
|
5804
|
+
settings;
|
|
5805
|
+
#$metaData;
|
|
5806
|
+
#$data;
|
|
5807
|
+
#$settings;
|
|
5808
|
+
$metaData = computed(() => this.$inited() && this.#$metaData());
|
|
5809
|
+
$settings = computed(() => this.$inited() ? this.#$settings() : undefined);
|
|
5810
|
+
metaNeeds = false;
|
|
5811
|
+
dataObs = false;
|
|
5812
|
+
settingsObs = false;
|
|
5813
|
+
$inited = signal(false);
|
|
5722
5814
|
constructor(data, metaData, settings = new GeneralTableSettings()) {
|
|
5723
|
-
this.
|
|
5724
|
-
|
|
5725
|
-
this.
|
|
5726
|
-
|
|
5727
|
-
|
|
5728
|
-
this.coerceToObservable(metaData, this.settings$).pipe(defaultShareReplay())
|
|
5729
|
-
:
|
|
5730
|
-
this.data$.pipe(first$1(), map(d => this.createMetaData(d[0])), defaultShareReplay());
|
|
5731
|
-
}
|
|
5732
|
-
getData$() {
|
|
5733
|
-
return this.metaData$.pipe(map(md => createDataCleaners(md)), switchMap(cleaner => this.data$.pipe(map((datas, ii) => {
|
|
5734
|
-
return datas.map((data, i) => {
|
|
5735
|
-
const cleaned = cleaner(data);
|
|
5736
|
-
cleaned[initIndexSymbol] = i * ((ii % 2) + 1);
|
|
5737
|
-
return cleaned;
|
|
5738
|
-
});
|
|
5739
|
-
}))), defaultShareReplay());
|
|
5740
|
-
}
|
|
5741
|
-
createMetaData(obj) {
|
|
5742
|
-
return Object.keys(obj ?? {})
|
|
5743
|
-
.map(key => ({
|
|
5744
|
-
key,
|
|
5745
|
-
fieldType: FieldType.Unknown,
|
|
5746
|
-
order: -1
|
|
5747
|
-
}));
|
|
5748
|
-
}
|
|
5749
|
-
coerceToObservable(arg, settings) {
|
|
5750
|
-
if (isObservable(arg)) {
|
|
5751
|
-
return arg;
|
|
5815
|
+
this.data = data;
|
|
5816
|
+
this.metaData = metaData;
|
|
5817
|
+
this.settings = settings;
|
|
5818
|
+
if (isObservable(data)) {
|
|
5819
|
+
this.dataObs = true;
|
|
5752
5820
|
}
|
|
5753
|
-
else
|
|
5754
|
-
|
|
5755
|
-
|
|
5756
|
-
|
|
5757
|
-
|
|
5821
|
+
else {
|
|
5822
|
+
this.#$data = isSignal(data) ? data : signal(data);
|
|
5823
|
+
}
|
|
5824
|
+
if (isObservable(metaData) || !metaData) {
|
|
5825
|
+
this.metaNeeds = true;
|
|
5758
5826
|
}
|
|
5759
5827
|
else {
|
|
5760
|
-
|
|
5828
|
+
this.#$metaData = isSignal(metaData) ? metaData : signal(metaData);
|
|
5761
5829
|
}
|
|
5762
|
-
}
|
|
5763
|
-
coerceSettingsToObservable(settings) {
|
|
5764
5830
|
if (isObservable(settings)) {
|
|
5765
|
-
|
|
5766
|
-
}
|
|
5767
|
-
else if (isSignal(settings)) {
|
|
5768
|
-
this.assertInjector(settings());
|
|
5769
|
-
return toObservable(settings, { injector: settings().injector });
|
|
5831
|
+
this.settingsObs = true;
|
|
5770
5832
|
}
|
|
5771
5833
|
else {
|
|
5772
|
-
|
|
5834
|
+
this.#$settings = isSignal(settings) ? settings : signal(settings);
|
|
5835
|
+
}
|
|
5836
|
+
if (!this.dataObs && !this.settingsObs && !this.metaNeeds) {
|
|
5837
|
+
this.$inited.set(true);
|
|
5773
5838
|
}
|
|
5774
5839
|
}
|
|
5775
|
-
|
|
5776
|
-
if (
|
|
5777
|
-
|
|
5840
|
+
prep(injector) {
|
|
5841
|
+
if (this.settingsObs) {
|
|
5842
|
+
this.#$settings = toSignal(this.settings, { injector, requireSync: true });
|
|
5843
|
+
}
|
|
5844
|
+
if (this.dataObs) {
|
|
5845
|
+
this.#$data = toSignal(this.data, { injector, initialValue: [] });
|
|
5778
5846
|
}
|
|
5847
|
+
if (this.metaNeeds) {
|
|
5848
|
+
if (this.metaData) {
|
|
5849
|
+
this.#$metaData = toSignal(this.metaData, { injector, initialValue: [] });
|
|
5850
|
+
}
|
|
5851
|
+
else {
|
|
5852
|
+
this.#$metaData = computed(() => this.createMetaData(this.#$data()[0]));
|
|
5853
|
+
}
|
|
5854
|
+
}
|
|
5855
|
+
this.$inited.set(true);
|
|
5856
|
+
}
|
|
5857
|
+
#dataCleaners = computed(() => {
|
|
5858
|
+
const metaData = this.$metaData();
|
|
5859
|
+
if (!metaData)
|
|
5860
|
+
return undefined;
|
|
5861
|
+
return createDataCleaners(metaData);
|
|
5862
|
+
});
|
|
5863
|
+
$data = computed(() => {
|
|
5864
|
+
const data = this.#$data();
|
|
5865
|
+
const cleaners = this.#dataCleaners();
|
|
5866
|
+
if (!data || !cleaners)
|
|
5867
|
+
return [];
|
|
5868
|
+
const cleanedData = data.map((data, i) => {
|
|
5869
|
+
const cleaned = cleaners(data);
|
|
5870
|
+
cleaned[initIndexSymbol] = i;
|
|
5871
|
+
return cleaned;
|
|
5872
|
+
});
|
|
5873
|
+
return cleanedData;
|
|
5874
|
+
});
|
|
5875
|
+
createMetaData(obj) {
|
|
5876
|
+
return Object.keys(obj ?? {})
|
|
5877
|
+
.map(key => ({
|
|
5878
|
+
key,
|
|
5879
|
+
fieldType: FieldType.Unknown,
|
|
5880
|
+
order: -1
|
|
5881
|
+
}));
|
|
5779
5882
|
}
|
|
5780
5883
|
}
|
|
5781
5884
|
const CreateTableBuilder = (reportDef$) => {
|
|
@@ -6001,5 +6104,5 @@ function setUpStoreFactoryOld(store, env) {
|
|
|
6001
6104
|
* Generated bundle index. Do not edit.
|
|
6002
6105
|
*/
|
|
6003
6106
|
|
|
6004
|
-
export { ActionStateSpinnerComponent, ActionStateUiModule, ActionStatus, AppStatusState, ArrayStyle, AutoFocusDirective, CancellationToken, ClickEmitterDirective, ClickSubjectDirective, ConditionalClassesDirective, CreateTableBuilder, CustomCellDirective, DateFilterComponent, DefaultVirtualScrollOptions, DialogDirective, DialogService, DialogWrapper, FieldType, FilterChipsComponent, FilterComponent, FilterType, FunctionPipe, GenColDisplayerComponent, GenFilterDisplayerComponent, GeneralTableSettings, GenericTableComponent, GroupByListComponent, HttpErrorStateDirective, HttpInProgressStateDirective, HttpNotStartedStateDirective, HttpRequestModule, HttpRequestStateDirective, HttpRequestStateFactory, HttpRequestStateStore, HttpRequestStatus, HttpRequestStrategy, HttpSuccessStateDirective, MatButtonToggleFilterDirective, MatCheckboxTbFilterDirective, MatOptionTbFilterDirective, MatRadioButtonTbFilterDirective, MatSlideToggleGroupDirective, MatSlideToggleTbFilterDirective, MatTableObservableDataSource, MultiSortDirective, NgrxExtModule, NotPersistedTableSettings, PaginatorComponent, PaginatorOptions, PersistedTableSettings, PhoneNumberPipe, PreventEnterDirective, ResizeColumnDirective, SortDirection, SpaceCasePipe, StopPropagationDirective, StylerDirective, Subjectifier, Subscriber, TableBuilder, TableBuilderConfigToken, TableBuilderModule, TableColumnHeaderSettings, TableContainerComponent, TableCustomFilterDirective, TableCustomFilterDirectiveBase, TableFilterDirective, TableFilterStringContainsDirective, TableSettings, TableWrapperDirective, TableWrapperFooterSettings, TableWrapperHeaderSettings, Target, TbSelectedFilterDirective, TrimWhitespaceDirective, UtilitiesModule, VirtualScrollOptions, actionStatusReducer, chainRequest, clearActionableSelectorRequestCache, combineArrays, createActionResultSelector, createActionSelector, createActionableResultSelector, createActionableSelector, createFailure, createRequestor, createSuccess, defaultFilter, defaultShareReplay, delayOn, filterArray, getRequestorBody, getRequestorStatus, getStatusState, httpRequest, httpRequestor, inProgress, initialState, isErrorState, isSuccessOrErrorState, isSuccessState, mapArray, mapError, metaDataArrToDict, notNull, notStarted, onWait, onceWhen, parseTbSizeToPixels, previousAndCurrent, provideActionableSelector, provideTableBuilder, selectAll, selectEntities, selectEntity, selectIds, selectTotal, serverStatusTypes, setUpStoreFactory, setUpStoreFactoryOld, skipOneWhen, sortsAreSame, spaceCase, startWithIfEmpty, statusAdapter, statusIsSuccessOrInProgress, subscriber, switchOff, tapError, tapSuccess, wrapInArr };
|
|
6107
|
+
export { ActionStateSpinnerComponent, ActionStateUiModule, ActionStatus, AppStatusState, ArrayStyle, AutoFocusDirective, CancellationToken, ClickEmitterDirective, ClickSubjectDirective, ConditionalClassesDirective, CreateTableBuilder, CustomCellDirective, DateFilterComponent, DefaultVirtualScrollOptions, DialogDirective, DialogService, DialogWrapper, FieldType, FilterChipsComponent, FilterComponent, FilterType, FunctionPipe, GenColDisplayerComponent, GenFilterDisplayerComponent, GeneralTableSettings, GenericTableComponent, GroupByListComponent, HttpErrorStateDirective, HttpInProgressStateDirective, HttpNotStartedStateDirective, HttpRequestModule, HttpRequestStateDirective, HttpRequestStateFactory, HttpRequestStateStore, HttpRequestStatus, HttpRequestStrategy, HttpSuccessStateDirective, MatButtonToggleFilterDirective, MatCheckboxTbFilterDirective, MatOptionTbFilterDirective, MatRadioButtonTbFilterDirective, MatSlideToggleGroupDirective, MatSlideToggleTbFilterDirective, MatTableObservableDataSource, MultiSortDirective, NgrxExtModule, NotPersistedTableSettings, PaginatorComponent, PaginatorOptions, PersistedTableSettings, PhoneNumberPipe, PreventEnterDirective, ResizeColumnDirective, SortDirection, SpaceCasePipe, StopPropagationDirective, StylerDirective, Subjectifier, Subscriber, TableBuilder, TableBuilderConfigToken, TableBuilderModule, TableColumnFooterSettings, TableColumnHeaderSettings, TableContainerComponent, TableCustomFilterDirective, TableCustomFilterDirectiveBase, TableFilterDirective, TableFilterStringContainsDirective, TableSettings, TableWrapperDirective, TableWrapperFooterSettings, TableWrapperHeaderSettings, Target, TbSelectedFilterDirective, TrimWhitespaceDirective, UtilitiesModule, VirtualScrollOptions, actionStatusReducer, chainRequest, clearActionableSelectorRequestCache, combineArrays, createActionResultSelector, createActionSelector, createActionableResultSelector, createActionableSelector, createFailure, createRequestor, createSuccess, defaultFilter, defaultShareReplay, delayOn, filterArray, getRequestorBody, getRequestorStatus, getStatusState, httpRequest, httpRequestor, inProgress, initialState, isErrorState, isSuccessOrErrorState, isSuccessState, mapArray, mapError, metaDataArrToDict, notNull, notStarted, onWait, onceWhen, parseTbSizeToPixels, phoneFormatter, previousAndCurrent, provideActionableSelector, provideTableBuilder, selectAll, selectEntities, selectEntity, selectIds, selectTotal, serverStatusTypes, setUpStoreFactory, setUpStoreFactoryOld, skipOneWhen, sortsAreSame, spaceCase, startWithIfEmpty, statusAdapter, statusIsSuccessOrInProgress, subscriber, switchOff, tapError, tapSuccess, wrapInArr };
|
|
6005
6108
|
//# sourceMappingURL=one-paragon-angular-utilities.mjs.map
|