@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.
@@ -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, Pipe, input, signal, Renderer2, ElementRef, booleanAttribute, InjectionToken, makeEnvironmentProviders, Component, ChangeDetectionStrategy, HostListener, EventEmitter, untracked, Output, ContentChildren, ChangeDetectorRef, output, ViewChild, EnvironmentInjector, createComponent, viewChild, linkedSignal, effect, contentChild, forwardRef, contentChildren, model, runInInjectionContext, provideAppInitializer } from '@angular/core';
3
- import { shareReplay, switchAll, map, filter, tap, catchError, startWith, switchMap, mergeMap, concatMap as concatMap$1, takeUntil, distinctUntilChanged, observeOn, debounceTime, scan as scan$1, timestamp as timestamp$1, first as first$1 } from 'rxjs/operators';
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, animationFrameScheduler, debounceTime as debounceTime$1, BehaviorSubject } 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 } 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, MatNativeDateModule } from '@angular/material/core';
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, MatDialogModule } from '@angular/material/dialog';
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
- if (phoneNum) {
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
- sort$ = this.select(state => state.initializationState).pipe(filter(i => i === InitializationState.Ready))
1918
- .pipe(switchMap(() => this.selectSorted$));
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
- class TransformCreator {
3164
- datePipe = inject(DatePipe);
3165
- currencyPipe = inject(CurrencyPipe);
3166
- phonePipe = inject(PhoneNumberPipe);
3167
- config = inject(TableBuilderConfigToken);
3168
- createTransformer(metaData, noIcons = false, forItem = false) {
3169
- const nested = metaData.key.includes('.');
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
- createItemTransformer = (metaData, noIcons = false, mutate = false) => {
3226
- const transform = this.createTransformer(metaData, noIcons);
3227
- return (t) => {
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
- createItemTransformers = (metaDatas, noIcons = false, mutate = false) => {
3235
- const transformers = metaDatas.map(meta => this.createItemTransformer(meta, noIcons, true));
3236
- return (t) => {
3237
- if (!t)
3238
- return t;
3239
- if (!mutate) {
3240
- t = { ...t };
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
- transformers.forEach(m => m(t));
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
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: TransformCreator, decorators: [{
3250
- type: Injectable,
3251
- args: [{
3252
- providedIn: 'root',
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
- transformCreator = inject(TransformCreator);
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 this.transformCreator.createTransformer(metaData);
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
- transformCreator = inject(TransformCreator);
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.dataStore.selectSignal(d => d.virtualEnds.start)();
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 this.transformCreator.createTransformer(this.state.$getMetaData(key)(), true, true)({ [`${key}`]: val });
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;\" 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 });
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;\" 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"] }]
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({ groupedData }, [data, groups, expandedGroups], index) {
4449
- if (index === 0
4450
- || dataUpdated(data, groups, expandedGroups)
4451
- || groupsUpdated(groups, expandedGroups)) {
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 = expandedGroups.value.length === 0
4468
+ const newDisplayData = expanded.value.length === 0
4455
4469
  ? groupedData
4456
- : groupedData.map(group => mapGroupHeader(group, expandedGroups.value)).flat();
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 sortAndFilterData = (data, sortState, filterState) => combineLatest([
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(({ mappedData: resultData }, [data, sort, f], index) => {
4511
- if (index === 0 || (data.timestamp > sort.timestamp && data.timestamp > f.timestamp)) {
4512
- return ({ mappedData: filterData(sortData(data.value, sort.value.sortsToRun), f.value.allFilters) });
4513
- }
4514
- if (sort.timestamp > f.timestamp) {
4515
- return ({ mappedData: sortData(resultData, sort.value.sortsToRun) });
4516
- }
4517
- return ({ mappedData: filterData(resultData, f.value.onlyAddedFilters || f.value.allFilters, !f.value.onlyAddedFilters) });
4518
- }, { mappedData: [] })).pipe(map$1(({ mappedData: resultData }) => resultData.filter(item => !item[tbNoShowSymbol])), defaultShareReplay());
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
- const $dataSize = computed(() => {
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: "<mat-chip-set>\r\n <span class=\"tb-group-label\">Group By:</span>\r\n @for (groupByKey of tableStore.$groupByKeys(); track groupByKey) {\r\n @if($index > 0){\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{padding-right:5px}.nested-arrow{margin-right:-8px;margin-left:-8px}\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 });
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: "<mat-chip-set>\r\n <span class=\"tb-group-label\">Group By:</span>\r\n @for (groupByKey of tableStore.$groupByKeys(); track groupByKey) {\r\n @if($index > 0){\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{padding-right:5px}.nested-arrow{margin-right:-8px;margin-left:-8px}\n"] }]
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
- scrolledIndexChange;
5073
- dataLength = 0;
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) => ({ curr, previous: previous?.source || curr })
5130
+ computation: (curr, previous) => {
5131
+ return ({ curr, previous: previous == undefined ? curr : previous.source });
5132
+ }
5080
5133
  });
5081
5134
  $headerHeight;
5082
- constructor(scrollContainer) {
5083
- this.scrolledIndexChange = this.indexChange.pipe(distinctUntilChanged());
5084
- this.$rowHeight = scrollContainer.computedRowHeight;
5085
- this.$headerHeight = scrollContainer.computedHeaderHeight;
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(observeOn(animationFrameScheduler), debounceTime(20)), () => {
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
- this.$headerHeight && this.$headerHeight();
5116
- this.updateContent('header height');
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
- this.$rowHeight && this.$rowHeight();
5120
- this.updateContent('row height');
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
- if (!this.viewport || !this.$rowHeight) {
5172
+ const viewport = this.viewport && this.viewport();
5173
+ if (!viewport || !this.$rowHeight) {
5124
5174
  return;
5125
5175
  }
5126
- const currentContentHeight = +this.viewport._totalContentHeight.replace('px', '');
5127
- const newContentHeight = this.dataLength * this.$rowHeight();
5176
+ const currentContentHeight = +viewport._totalContentHeight.replace('px', '');
5177
+ const newContentHeight = this.$dataLength() * this.$rowHeight();
5128
5178
  if (currentContentHeight !== newContentHeight) {
5129
- this.viewport.setTotalContentSize(newContentHeight);
5130
- setTimeout(() => {
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 (!this.viewport || !this.$rowHeight) {
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((this.viewport.getViewportSize() - this.$headerHeight()) / rowHeight);
5145
- const f = this.viewport.measureScrollOffset();
5146
- const offset = this.viewport.measureScrollOffset() * rowHeightAdjustment;
5147
- if (offset !== f) {
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.dataLength, index + amountOfRows + buffer);
5155
- this.viewport.setRenderedContentOffset(rowHeight * start);
5156
- this.viewport.setRenderedRange({ start, end });
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(() => this.state.$tableSettings().virtualSettings);
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 + 25,
5280
+ end: renderedRange.end,
5208
5281
  }
5209
5282
  });
5210
- this.setSize(this.viewport().elementRef);
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().dynamicHeight) {
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
- $tableId = input(undefined, { alias: 'tableId' });
5385
- $trackBy = input(undefined, { alias: 'trackBy' });
5386
- $inputFilters = model([], { alias: '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
- $indexColumn = input(false, { alias: 'indexColumn' });
5390
- $selectionColumn = input(false, { alias: 'selectionColumn' });
5391
- $isSticky = input(true, { alias: 'isSticky' });
5392
- $stickyFooter = input(false, { alias: 'stickyFooter' });
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
- _data$ = new BehaviorSubject([]);
5448
+ $data = computed(() => this.$sortedAndFilteredData()?.value || []);
5449
+ _data$ = toObservable(this.$data);
5411
5450
  data$ = outputFromObservable(this._data$, { alias: 'data' });
5412
- $data = toSignal(this._data$, { initialValue: [] });
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().length);
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(this.$tableBuilder().settings$);
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
- if (!tableBuilder)
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
- this.initializeData();
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
- allNotSavableFilterDirectivesFilters$ = toObservable(this.$allFilterDirectives).pipe(filterArray(d => !d.savable), switchMap(d => {
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
- $displayData = signal([]);
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
- initializeData() {
5551
- const predicateFilters$ = combineLatest([this.predicateInputFilters$.pipe(), this.allNotSavableFilterDirectivesFilters$])
5552
- .pipe(map(([a, b]) => [...a, ...b]));
5553
- const filters$ = combineLatest([
5554
- this.state.filters$.pipe(scan$1(updateFilterInfoState, { allFilters: {} }), timestamp$1()),
5555
- predicateFilters$.pipe(scan$1(updateFilterPredicateState, { allFilters: [] }), timestamp$1())
5556
- ])
5557
- .pipe(map(([filterInfo, pred]) => updateFilterState(filterInfo, pred)));
5558
- const sortsState$ = this.state.sort$.pipe(scan$1(updateSortState, initialSortState));
5559
- const sortedAndFilteredData$ = sortAndFilterData(this.$tableBuilder().getData$(), sortsState$, filters$);
5560
- const flatGrouped$ = combineLatest([sortedAndFilteredData$.pipe(timestamp$1()), this.state.groupByKeys$.pipe(timestamp$1()), this.state.expandedGroups$.pipe(timestamp$1())]).pipe(scan$1(updateGroupByState, initialGroupByState), map(({ displayData }) => displayData), defaultShareReplay());
5561
- this.state.on(sortedAndFilteredData$, (data) => {
5562
- this._data$.next(data);
5563
- this.dataStore.patchState({ sortedFilteredDataLength: data.length });
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
- this.state.on(flatGrouped$, (data) => {
5566
- this.dataSource.setData(data);
5567
- this.$displayData.set(data);
5568
- this.dataStore.patchState({ sortedFilteredGroupedDataLength: data.length });
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 }, $tableId: { classPropertyName: "$tableId", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, $trackBy: { classPropertyName: "$trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, $inputFilters: { classPropertyName: "$inputFilters", publicName: "inputFilters", isSignal: true, isRequired: false, transformFunction: null }, $indexColumn: { classPropertyName: "$indexColumn", publicName: "indexColumn", isSignal: true, isRequired: false, transformFunction: null }, $selectionColumn: { classPropertyName: "$selectionColumn", publicName: "selectionColumn", isSignal: true, isRequired: false, transformFunction: null }, $isSticky: { classPropertyName: "$isSticky", publicName: "isSticky", isSignal: true, isRequired: false, transformFunction: null }, $stickyFooter: { classPropertyName: "$stickyFooter", 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: { $inputFilters: "inputFiltersChange", 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 <ng-content select=\".tb-header-title\"/>\r\n }\r\n @if(state.$groupByKeys().length){\r\n <group-by-list />\r\n }\r\n </div>\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;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.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 });
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) {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n @if(state.$groupByKeys().length){\r\n <group-by-list />\r\n }\r\n </div>\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;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.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"] }]
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: [CommonModule,
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
- TableBuilderStateStore,
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
- metaData$;
5720
- data$;
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.settings$ = this.coerceSettingsToObservable(settings)
5724
- .pipe(defaultShareReplay());
5725
- this.data$ = this.coerceToObservable(data, this.settings$)
5726
- .pipe(notNull(), defaultShareReplay());
5727
- this.metaData$ = metaData ?
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 if (isSignal(arg)) {
5754
- return settings.pipe(switchMap(s => {
5755
- this.assertInjector(s);
5756
- return toObservable(arg, { injector: s.injector });
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
- return of(arg);
5828
+ this.#$metaData = isSignal(metaData) ? metaData : signal(metaData);
5761
5829
  }
5762
- }
5763
- coerceSettingsToObservable(settings) {
5764
5830
  if (isObservable(settings)) {
5765
- return settings;
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
- return of(settings);
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
- assertInjector(s) {
5776
- if (!s.injector) {
5777
- throw new Error('Injector must be provided when passing a signal to table builder');
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