@elderbyte/ngx-starter 16.1.0 → 16.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/esm2022/lib/common/data/filters/filter-context.mjs +8 -2
  2. package/esm2022/lib/components/forms/clipboard/elder-clipboard.service.mjs +1 -1
  3. package/esm2022/lib/components/forms/directives/elder-initial-value.directive.mjs +56 -0
  4. package/esm2022/lib/components/forms/search/elder-search-context-url-binding.directive.mjs +68 -0
  5. package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +40 -31
  6. package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +84 -29
  7. package/esm2022/lib/components/forms/search/elder-search.module.mjs +47 -30
  8. package/esm2022/lib/components/forms/search/search-box/elder-search-box.component.mjs +1 -1
  9. package/esm2022/lib/components/forms/search/search-box/elder-search-context-filters.mjs +10 -0
  10. package/esm2022/lib/components/forms/search/search-box/elder-search-url-binding.service.mjs +136 -0
  11. package/esm2022/lib/components/select/multi/elder-multi-select-base.mjs +3 -2
  12. package/fesm2022/elderbyte-ngx-starter.mjs +505 -171
  13. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  14. package/lib/common/data/filters/filter-context.d.ts +2 -1
  15. package/lib/components/forms/directives/elder-initial-value.directive.d.ts +21 -0
  16. package/lib/components/forms/search/elder-search-context-url-binding.directive.d.ts +42 -0
  17. package/lib/components/forms/search/elder-search-context.directive.d.ts +14 -13
  18. package/lib/components/forms/search/elder-search-input.directive.d.ts +25 -12
  19. package/lib/components/forms/search/elder-search.module.d.ts +22 -19
  20. package/lib/components/forms/search/search-box/elder-search-context-filters.d.ts +7 -0
  21. package/lib/components/forms/search/search-box/elder-search-url-binding.service.d.ts +38 -0
  22. package/package.json +1 -1
@@ -5,7 +5,7 @@ import { Pipe, Injectable, LOCALE_ID, Inject, NgModule, Optional, SkipSelf, Dire
5
5
  import * as i1 from '@angular/platform-browser';
6
6
  import { Duration, Period, TemporalQueries, LocalTime, Instant, LocalDate, nativeJs, ZoneId, DateTimeFormatter, convert, ZonedDateTime, Temporal } from '@js-joda/core';
7
7
  import { LoggerFactory } from '@elderbyte/ts-logger';
8
- import { timer, defer, ReplaySubject, concat, finalize, exhaustMap, BehaviorSubject, Subject, EMPTY, combineLatest, merge, of, forkJoin, throwError, mergeWith, switchMap as switchMap$1, Observable, zip, mergeMap as mergeMap$1, fromEvent, NEVER } from 'rxjs';
8
+ import { timer, defer, ReplaySubject, concat, finalize, exhaustMap, BehaviorSubject, lastValueFrom, Subject, EMPTY, combineLatest, merge, of, forkJoin, throwError, mergeWith, switchMap as switchMap$1, Observable, zip, mergeMap as mergeMap$1, fromEvent, takeUntil as takeUntil$1, combineLatestWith as combineLatestWith$1, skipUntil, filter as filter$1, NEVER } from 'rxjs';
9
9
  import { tap, takeUntil, takeWhile, map, filter, distinctUntilChanged, debounceTime, catchError, first, take, switchMap, mergeMap, expand, reduce, startWith, skip, delay, share, combineLatestWith, timeout, skipWhile } from 'rxjs/operators';
10
10
  import * as i1$2 from '@angular/common/http';
11
11
  import { HttpParams, HttpEventType, HttpRequest, HttpClient, HttpErrorResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
@@ -2569,6 +2569,12 @@ class FilterContext {
2569
2569
  }
2570
2570
  return Array.from(filterMap.values());
2571
2571
  }
2572
+ static async of(filters) {
2573
+ const filterContext = new FilterContext();
2574
+ filterContext.updateFilters(filters);
2575
+ await lastValueFrom(filterContext.filters);
2576
+ return filterContext;
2577
+ }
2572
2578
  /***************************************************************************
2573
2579
  * *
2574
2580
  * Read API *
@@ -21290,6 +21296,7 @@ class ElderMultiSelectBase extends ElderSelectBase {
21290
21296
  }, () => this.removeEntities(toRemove));
21291
21297
  }
21292
21298
  removeEntities(toRemove) {
21299
+ console.warn("REMOVE");
21293
21300
  toRemove.forEach(e => this.removeEntity(e));
21294
21301
  }
21295
21302
  removeEntity(toRemove) {
@@ -21417,7 +21424,7 @@ class ElderMultiSelectBase extends ElderSelectBase {
21417
21424
  });
21418
21425
  }
21419
21426
  findOrLoadEntitiesByIds(ids) {
21420
- if (ids.length == 0) {
21427
+ if (ids === null || ids.length == 0) {
21421
21428
  return of([]);
21422
21429
  }
21423
21430
  if (this.dataContext) {
@@ -25496,144 +25503,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
25496
25503
  type: Input
25497
25504
  }] } });
25498
25505
 
25499
- /**
25500
- * The search container manages a group of search-inputs
25501
- * and holds their values in a central search model.
25502
- */
25503
- class ElderSearchContextDirective {
25504
- constructor() {
25505
- /***************************************************************************
25506
- * *
25507
- * Fields *
25508
- * *
25509
- **************************************************************************/
25510
- this.forcedFilters$ = new BehaviorSubject$1([]);
25511
- this.log = LoggerFactory.getLogger(this.constructor.name);
25512
- this.unsubscribe$ = new Subject$1();
25513
- this._searchInputs = new BehaviorSubject$1([]);
25514
- this._searchStates = new BehaviorSubject$1([]);
25515
- this._filters = new BehaviorSubject$1([]);
25516
- }
25517
- /***************************************************************************
25518
- * *
25519
- * Life Cycle *
25520
- * *
25521
- **************************************************************************/
25522
- ngAfterViewInit() {
25523
- this._searchInputs.pipe(takeUntil(this.unsubscribe$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), combineLatestWith(this.forcedFilters$), debounceTime(5)).subscribe(([states, forcedFilters]) => {
25524
- this._searchStates.next(states);
25525
- const userFilters = this.convertToFilters(states);
25526
- this._filters.next(userFilters);
25527
- this.applyFilters(userFilters, forcedFilters);
25528
- });
25529
- }
25530
- ngOnDestroy() {
25531
- this.unsubscribe$.next();
25532
- this.unsubscribe$.complete();
25533
- }
25534
- /***************************************************************************
25535
- * *
25536
- * Properties *
25537
- * *
25538
- **************************************************************************/
25539
- set filterContext(value) {
25540
- this._filterContext = value;
25541
- }
25542
- get filterContext() {
25543
- return this._filterContext;
25544
- }
25545
- /**
25546
- * Forced filters are always merged into the final FilterContext.
25547
- *
25548
- * This means they override user defined filters, but attempt
25549
- * to also keep the users intent (by merging) them.
25550
- */
25551
- set forcedFilters(filters) {
25552
- this.forcedFilters$.next(filters);
25553
- }
25554
- get forcedFilters() {
25555
- return this.forcedFilters$.getValue();
25556
- }
25557
- get attributes() {
25558
- return this._searchInputs.asObservable();
25559
- }
25560
- get attributesSnapshot() {
25561
- return this._searchInputs.getValue();
25562
- }
25563
- get states$() {
25564
- return this._searchStates.asObservable();
25565
- }
25566
- get statesSnapshot() {
25567
- return this._searchStates.getValue();
25568
- }
25569
- /**
25570
- * Returns the current user touched attributes. (ignoring fallbacks)
25571
- */
25572
- get userDefinedAttributes$() {
25573
- return this.states$.pipe(map(states => states.filter(s => !s.pristine)));
25574
- }
25575
- /**
25576
- * Returns the current active filters
25577
- */
25578
- get filters$() {
25579
- return this._filters.asObservable();
25580
- }
25581
- get filtersSnapshot() {
25582
- return this._filters.getValue();
25583
- }
25584
- /***************************************************************************
25585
- * *
25586
- * Public API *
25587
- * *
25588
- **************************************************************************/
25589
- /**
25590
- * Register a new search name in this container
25591
- */
25592
- register(searchInput) {
25593
- this.log.debug('Registering search input [' + searchInput.name + ']');
25594
- const current = this._searchInputs.getValue();
25595
- this._searchInputs.next([...current, searchInput]);
25596
- }
25597
- reset() {
25598
- this.attributesSnapshot
25599
- .filter(attr => !attr.readonly)
25600
- .forEach(a => {
25601
- a.reset();
25602
- });
25603
- }
25604
- /***************************************************************************
25605
- * *
25606
- * Private *
25607
- * *
25608
- **************************************************************************/
25609
- convertToFilters(states) {
25610
- return states
25611
- .map(s => new Filter(s.queryKey, s.queryValue));
25612
- }
25613
- applyFilters(userFilters, forcedFilters) {
25614
- const context = this.filterContext;
25615
- if (context) {
25616
- context.updateFilters(userFilters);
25617
- context.mergeFilters(forcedFilters);
25618
- this.log.trace('Search-Model filters updated:', Array.from(context.filtersSnapshot));
25619
- }
25620
- }
25621
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
25622
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, exportAs: ["elderSearchContext"], ngImport: i0 }); }
25623
- }
25624
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
25625
- type: Directive,
25626
- args: [{
25627
- selector: '[elderSearchContext]',
25628
- exportAs: 'elderSearchContext'
25629
- }]
25630
- }], propDecorators: { filterContext: [{
25631
- type: Input,
25632
- args: ['elderSearchContext']
25633
- }], forcedFilters: [{
25634
- type: Input
25635
- }] } });
25636
-
25637
25506
  /**
25638
25507
  * Immutable representation of the state of an search input
25639
25508
  */
@@ -25711,6 +25580,58 @@ class SearchInputState {
25711
25580
  }
25712
25581
  }
25713
25582
 
25583
+ /**
25584
+ * Search name adapter for input controls.
25585
+ */
25586
+ class ElderInitialValueDirective {
25587
+ constructor(ngModel) {
25588
+ this.ngModel = ngModel;
25589
+ this.newValue$ = new BehaviorSubject(null);
25590
+ this.unsubscribe$ = new Subject();
25591
+ this.initialDone$ = new Subject();
25592
+ this.isInitial = true;
25593
+ this.initialValue = this.ngModel.model;
25594
+ ngModel.control.valueChanges
25595
+ .pipe(takeUntil$1(this.initialDone$), takeUntil$1(this.unsubscribe$), combineLatestWith$1(this.newValue$)).subscribe(([value, ...newValues]) => {
25596
+ const newValue = newValues[0];
25597
+ if (this.initialValue === value) {
25598
+ this.initialDone$.next();
25599
+ this.initialDone$.complete();
25600
+ ngModel.control.setValue(newValue ? newValue : value);
25601
+ }
25602
+ });
25603
+ }
25604
+ get valueChanges$() {
25605
+ return this.ngModel.control.valueChanges
25606
+ .pipe(skipUntil(this.initialDone$), filter$1(value => this.filterInitialValue(value)));
25607
+ }
25608
+ setInitialValue(value) {
25609
+ this.newValue$.next(value);
25610
+ }
25611
+ ngOnDestroy() {
25612
+ this.unsubscribe$.next();
25613
+ this.unsubscribe$.complete();
25614
+ }
25615
+ filterInitialValue(value) {
25616
+ if (this.isInitial && this.initialValue === value) {
25617
+ this.isInitial = false;
25618
+ return false;
25619
+ }
25620
+ return true;
25621
+ }
25622
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderInitialValueDirective, deps: [{ token: i3.NgModel, host: true }], target: i0.ɵɵFactoryTarget.Directive }); }
25623
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ElderInitialValueDirective, selector: "[elderInitialValue]", exportAs: ["elderInitialValue"], ngImport: i0 }); }
25624
+ }
25625
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderInitialValueDirective, decorators: [{
25626
+ type: Directive,
25627
+ args: [{
25628
+ selector: '[elderInitialValue]',
25629
+ exportAs: 'elderInitialValue',
25630
+ }]
25631
+ }], ctorParameters: function () { return [{ type: i3.NgModel, decorators: [{
25632
+ type: Host
25633
+ }] }]; } });
25634
+
25714
25635
  /**
25715
25636
  * Search name adapter for input controls.
25716
25637
  */
@@ -25720,28 +25641,31 @@ class ElderSearchInputDirective {
25720
25641
  * Constructor *
25721
25642
  * *
25722
25643
  **************************************************************************/
25723
- constructor(searchContext, ngModel) {
25644
+ constructor(searchContext, changeDetection, ngModel) {
25724
25645
  this.searchContext = searchContext;
25646
+ this.changeDetection = changeDetection;
25725
25647
  this.ngModel = ngModel;
25648
+ //TODO: In Angular 16, use standalone directives and host component to inject directive to component
25649
+ this.initialValueDirective = new ElderInitialValueDirective(this.ngModel);
25726
25650
  this._state = new BehaviorSubject(null);
25727
- this.destroy$ = new Subject();
25651
+ this._unsubscribe$ = new Subject();
25728
25652
  this.log = LoggerFactory.getLogger(this.constructor.name);
25729
25653
  }
25730
25654
  /***************************************************************************
25731
25655
  * *
25732
- * Life Cycle *
25656
+ * Life Cycle *
25733
25657
  * *
25734
25658
  **************************************************************************/
25735
25659
  ngAfterViewInit() {
25736
25660
  this._extractedName = this.extractName();
25737
- this.searchContext.register(this);
25661
+ console.log(this.extractName() + "|" + this.queryKey + "|" + this.resolvePath);
25738
25662
  this.stateObservable().subscribe(state => {
25739
25663
  this.emitState(state);
25740
25664
  });
25741
25665
  }
25742
25666
  ngOnDestroy() {
25743
- this.destroy$.next();
25744
- this.destroy$.complete();
25667
+ this._unsubscribe$.next();
25668
+ this._unsubscribe$.complete();
25745
25669
  }
25746
25670
  /***************************************************************************
25747
25671
  * *
@@ -25761,8 +25685,8 @@ class ElderSearchInputDirective {
25761
25685
  if (this._extractedName) {
25762
25686
  return this._extractedName;
25763
25687
  }
25764
- throw new Error('Could not determine the search name key name.' +
25765
- ' Either specify the name property or explicitly set [elderSearchInputKey].');
25688
+ throw new Error("Could not determine the search name key name." +
25689
+ " Either specify the name property or explicitly set [elderSearchInputKey].");
25766
25690
  }
25767
25691
  get value() {
25768
25692
  return this.ngModel.value;
@@ -25778,6 +25702,13 @@ class ElderSearchInputDirective {
25778
25702
  * Public API *
25779
25703
  * *
25780
25704
  **************************************************************************/
25705
+ setInitialFilter(filters) {
25706
+ const filterValue = this.findFilterForThisInput(filters);
25707
+ if (filterValue) {
25708
+ const value = this.convertQueryStringToRawModelValue(filterValue.value);
25709
+ this.initialValueDirective.setInitialValue(value);
25710
+ }
25711
+ }
25781
25712
  reset() {
25782
25713
  this.ngModel.reset();
25783
25714
  }
@@ -25786,16 +25717,36 @@ class ElderSearchInputDirective {
25786
25717
  * Private methods *
25787
25718
  * *
25788
25719
  **************************************************************************/
25720
+ findFilterForThisInput(filters) {
25721
+ for (const filter of filters) {
25722
+ if (filter.key === this.queryKey || filter.key === this.extractName()) {
25723
+ return filter;
25724
+ }
25725
+ }
25726
+ return null;
25727
+ }
25789
25728
  stateObservable() {
25790
- return this.ngModel.valueChanges.pipe(takeUntil(this.destroy$), startWith(this.ngModel.value), map(value => {
25729
+ return this.initialValueDirective.valueChanges$.pipe(takeUntil(this._unsubscribe$), map(value => {
25730
+ console.warn(value + "|" + this.name);
25791
25731
  const queryValue = this.convertRawModelValueToQueryString(value);
25792
25732
  const pristine = !this.isAttributeValuePresent(value);
25793
25733
  return new SearchInputState(this.name, queryValue, this.queryKey || this.name, pristine);
25794
25734
  }));
25795
25735
  }
25736
+ convertQueryStringToRawModelValue(queryString) {
25737
+ if (Objects.nonNull(queryString)) {
25738
+ return queryString;
25739
+ }
25740
+ else {
25741
+ return null;
25742
+ }
25743
+ }
25796
25744
  convertRawModelValueToQueryString(model) {
25797
25745
  let queryValue = null;
25798
- if (this.isAttributeValuePresent(model)) {
25746
+ if (this.valueAsId != undefined) {
25747
+ queryValue = this.checkAndConvertFaultyValuesToNull(model);
25748
+ }
25749
+ else if (this.isAttributeValuePresent(model)) {
25799
25750
  // Attribute value is present
25800
25751
  queryValue = this.resolveValue(model);
25801
25752
  }
@@ -25809,9 +25760,27 @@ class ElderSearchInputDirective {
25809
25760
  emitState(state) {
25810
25761
  this._state.next(state);
25811
25762
  }
25763
+ checkAndConvertFaultyValuesToNull(value) {
25764
+ let fixedValue = value;
25765
+ fixedValue = this.convertEmptyArrayToNull(fixedValue);
25766
+ fixedValue = this.convertEmptyStringToNull(fixedValue);
25767
+ return fixedValue;
25768
+ }
25769
+ convertEmptyArrayToNull(value) {
25770
+ if (value instanceof Array && value.length === 0) {
25771
+ return null;
25772
+ }
25773
+ return value;
25774
+ }
25775
+ convertEmptyStringToNull(value) {
25776
+ if (typeof value === "string" && value.length === 0) {
25777
+ return null;
25778
+ }
25779
+ return value;
25780
+ }
25812
25781
  isAttributeValuePresent(value) {
25813
25782
  return SearchInputState.isValueDefined(value)
25814
- && (value + '').length !== 0; // ???
25783
+ && (value + "").length !== 0;
25815
25784
  }
25816
25785
  resolveValue(value) {
25817
25786
  if (Objects.nonNull(value)) {
@@ -25860,29 +25829,181 @@ class ElderSearchInputDirective {
25860
25829
  });
25861
25830
  return CollectionUtil.flatten(arrays);
25862
25831
  }
25863
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchInputDirective, deps: [{ token: ElderSearchContextDirective }, { token: i3.NgModel, host: true }], target: i0.ɵɵFactoryTarget.Directive }); }
25864
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchInputDirective, selector: "[elderSearchInput]", inputs: { queryKey: ["elderSearchInputKey", "queryKey"], valueTransform: ["elderSearchInputTransform", "valueTransform"], resolvePath: ["elderSearchInput", "resolvePath"], fallbackValue: ["elderSearchInputFallback", "fallbackValue"] }, exportAs: ["elderSearchInput"], ngImport: i0 }); }
25832
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchInputDirective, deps: [{ token: ElderSearchContextDirective }, { token: i0.ChangeDetectorRef }, { token: i3.NgModel, host: true }], target: i0.ɵɵFactoryTarget.Directive }); }
25833
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchInputDirective, selector: "[elderSearchInput]", inputs: { queryKey: ["elderSearchInputKey", "queryKey"], valueTransform: ["elderSearchInputTransform", "valueTransform"], resolvePath: ["elderSearchInput", "resolvePath"], dataSource: "dataSource", fallbackValue: ["elderSearchInputFallback", "fallbackValue"], valueAsId: "valueAsId" }, exportAs: ["elderSearchInput"], ngImport: i0 }); }
25865
25834
  }
25866
25835
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchInputDirective, decorators: [{
25867
25836
  type: Directive,
25868
25837
  args: [{
25869
- selector: '[elderSearchInput]',
25870
- exportAs: 'elderSearchInput'
25838
+ selector: "[elderSearchInput]",
25839
+ exportAs: "elderSearchInput"
25871
25840
  }]
25872
- }], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type: i3.NgModel, decorators: [{
25841
+ }], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type: i0.ChangeDetectorRef }, { type: i3.NgModel, decorators: [{
25873
25842
  type: Host
25874
25843
  }] }]; }, propDecorators: { queryKey: [{
25875
25844
  type: Input,
25876
- args: ['elderSearchInputKey']
25845
+ args: ["elderSearchInputKey"]
25877
25846
  }], valueTransform: [{
25878
25847
  type: Input,
25879
- args: ['elderSearchInputTransform']
25848
+ args: ["elderSearchInputTransform"]
25880
25849
  }], resolvePath: [{
25881
25850
  type: Input,
25882
- args: ['elderSearchInput']
25851
+ args: ["elderSearchInput"]
25852
+ }], dataSource: [{
25853
+ type: Input,
25854
+ args: ["dataSource"]
25883
25855
  }], fallbackValue: [{
25884
25856
  type: Input,
25885
- args: ['elderSearchInputFallback']
25857
+ args: ["elderSearchInputFallback"]
25858
+ }], valueAsId: [{
25859
+ type: Input,
25860
+ args: ["valueAsId"]
25861
+ }] } });
25862
+
25863
+ /**
25864
+ * The search container manages a group of search-inputs
25865
+ * and holds their values in a central search model.
25866
+ */
25867
+ class ElderSearchContextDirective {
25868
+ constructor() {
25869
+ /***************************************************************************
25870
+ * *
25871
+ * Fields *
25872
+ * *
25873
+ **************************************************************************/
25874
+ this.forcedFilters$ = new BehaviorSubject$1([]);
25875
+ this.log = LoggerFactory.getLogger(this.constructor.name);
25876
+ this._unsubscribe$ = new Subject$1();
25877
+ this._searchInputs = new BehaviorSubject$1([]);
25878
+ this._searchStates = new BehaviorSubject$1([]);
25879
+ this._filters$ = new BehaviorSubject$1([]);
25880
+ this._initialFilters$ = new BehaviorSubject$1([]);
25881
+ }
25882
+ /***************************************************************************
25883
+ * *
25884
+ * Life Cycle *
25885
+ * *
25886
+ **************************************************************************/
25887
+ ngAfterViewInit() {
25888
+ this._searchInputs.next(this.searchInputs.toArray());
25889
+ this.searchInputs.changes
25890
+ .pipe(startWith(this.searchInputs), takeUntil(this._unsubscribe$), map(input => input), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), combineLatestWith(this.forcedFilters$), debounceTime(5)).subscribe(([states, forcedFilters]) => {
25891
+ this._searchStates.next(states);
25892
+ const userFilters = this.convertToFilters(states);
25893
+ this._filters$.next(userFilters);
25894
+ this.applyFilters(userFilters, forcedFilters);
25895
+ });
25896
+ this.initialFilters$.pipe(takeUntil(this._unsubscribe$), skip(1)).subscribe((initialFilters) => {
25897
+ this.searchInputs.forEach(input => input.setInitialFilter(initialFilters));
25898
+ });
25899
+ }
25900
+ ngOnDestroy() {
25901
+ this._unsubscribe$.next();
25902
+ this._unsubscribe$.complete();
25903
+ }
25904
+ /***************************************************************************
25905
+ * *
25906
+ * Properties *
25907
+ * *
25908
+ **************************************************************************/
25909
+ set filterContext(value) {
25910
+ this._filterContext = value;
25911
+ }
25912
+ get filterContext() {
25913
+ return this._filterContext;
25914
+ }
25915
+ /**
25916
+ * Forced filters are always merged into the final FilterContext.
25917
+ *
25918
+ * This means they override user defined filters, but attempt
25919
+ * to also keep the users intent (by merging) them.
25920
+ */
25921
+ set forcedFilters(filters) {
25922
+ this.forcedFilters$.next(filters);
25923
+ }
25924
+ get forcedFilters() {
25925
+ return this.forcedFilters$.getValue();
25926
+ }
25927
+ get attributes() {
25928
+ return this.searchInputs.changes.pipe(map(inputs => inputs), map(inputs => inputs.toArray()));
25929
+ }
25930
+ get attributesSnapshot() {
25931
+ return this.searchInputs.toArray();
25932
+ }
25933
+ get states$() {
25934
+ return this._searchStates.asObservable();
25935
+ }
25936
+ get statesSnapshot() {
25937
+ return this._searchStates.getValue();
25938
+ }
25939
+ /**
25940
+ * Returns the current user touched attributes. (ignoring fallbacks)
25941
+ */
25942
+ get userDefinedAttributes$() {
25943
+ return this.states$.pipe(map(states => states.filter(s => !s.pristine)));
25944
+ }
25945
+ /**
25946
+ * Returns the current active filters
25947
+ */
25948
+ get filters$() {
25949
+ return this._filters$.asObservable();
25950
+ }
25951
+ get initialFilters$() {
25952
+ return this._initialFilters$.asObservable();
25953
+ }
25954
+ get filtersSnapshot() {
25955
+ return this._filters$.getValue();
25956
+ }
25957
+ /***************************************************************************
25958
+ * *
25959
+ * Public API *
25960
+ * *
25961
+ **************************************************************************/
25962
+ registerInitialFilters(filters) {
25963
+ this._initialFilters$.next(filters);
25964
+ }
25965
+ reset() {
25966
+ this.attributesSnapshot
25967
+ .filter(attr => !attr.readonly)
25968
+ .forEach(a => {
25969
+ console.log(a.name);
25970
+ a.reset();
25971
+ });
25972
+ }
25973
+ /***************************************************************************
25974
+ * *
25975
+ * Private *
25976
+ * *
25977
+ **************************************************************************/
25978
+ convertToFilters(states) {
25979
+ return states
25980
+ .map(s => new Filter(s.queryKey, s.queryValue));
25981
+ }
25982
+ applyFilters(userFilters, forcedFilters) {
25983
+ const context = this.filterContext;
25984
+ if (context) {
25985
+ context.updateFilters(userFilters);
25986
+ context.mergeFilters(forcedFilters);
25987
+ this.log.trace("Search-Model filters updated:", Array.from(context.filtersSnapshot));
25988
+ }
25989
+ }
25990
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
25991
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, queries: [{ propertyName: "searchInputs", predicate: ElderSearchInputDirective, descendants: true }], exportAs: ["elderSearchContext"], ngImport: i0 }); }
25992
+ }
25993
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
25994
+ type: Directive,
25995
+ args: [{
25996
+ selector: "[elderSearchContext]",
25997
+ exportAs: "elderSearchContext"
25998
+ }]
25999
+ }], propDecorators: { searchInputs: [{
26000
+ type: ContentChildren,
26001
+ args: [ElderSearchInputDirective, { descendants: true }]
26002
+ }], filterContext: [{
26003
+ type: Input,
26004
+ args: ["elderSearchContext"]
26005
+ }], forcedFilters: [{
26006
+ type: Input
25886
26007
  }] } });
25887
26008
 
25888
26009
  class ElderSearchPanelComponent {
@@ -26278,7 +26399,7 @@ class ElderSearchBoxComponent {
26278
26399
  this.searchModel.reset();
26279
26400
  }
26280
26401
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchBoxComponent, deps: [{ token: ElderSearchContextDirective }], target: i0.ɵɵFactoryTarget.Component }); }
26281
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchBoxComponent, selector: "elder-search-box", inputs: { autoPanel: "autoPanel", name: "name", queryKey: "queryKey", placeholder: "placeholder", label: "label", hint: "hint", autocomplete: "autocomplete", appearance: "appearance", dense: "dense" }, host: { classAttribute: "elder-form-field-host" }, queries: [{ propertyName: "advancedSearch", first: true, predicate: ElderSearchPanelComponent, descendants: true }], viewQueries: [{ propertyName: "search", first: true, predicate: ["search"], descendants: true }], exportAs: ["elderSearchBox"], ngImport: i0, template: "<div class=\"layout-row place-stretch-center full flex\" style=\"overflow: hidden\">\n <mat-form-field\n *ngIf=\"overlayState$ | async as overlayState\"\n [appearance]=\"appearance\"\n class=\"elder-search-box-field flex-auto\" subscriptSizing=\"dynamic\"\n [elderDense]=\"dense\">\n\n <button matPrefix mat-icon-button type=\"button\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\"\n >\n <mat-icon>search</mat-icon>\n </button>\n\n <input matInput type=\"text\" [name]=\"name\" [placeholder]=\"placeholder\" #search cdkFocusInitial\n ngModel\n elderSearchInput [elderSearchInputKey]=\"queryKey\" #searchInput=\"elderSearchInput\"\n [autocomplete]=\"(autoPanel && overlayState.hasOverlay) ? 'off' : autocomplete\"\n [elderOverlayOrigin]=\"searchPanel\"\n [elderOverlayTrigger]=\"searchPanel\"\n [elderOverlayTriggerType]=\"'focus'\"\n [elderOverlayTriggerEnabled]=\"autoPanel && overlayState.hasOverlay && (searchInput?.state$ | async)?.pristine\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n\n <div class=\"layout-row\" matSuffix *ngIf=\"searchModel.userDefinedAttributes$ | async as userDefinedFilters\">\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"userDefinedFilters.length > 0\"\n (click)=\"clearSearch($event)\"\n name=\"clear\" aria-label=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"overlayState.hasOverlay\" name=\"openPanel\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\">\n <mat-icon\n [matBadge]=\"userDefinedFilters.length\"\n matBadgeSize=\"small\"\n [matBadgeOverlap]=\"true\"\n [matBadgeHidden]=\"userDefinedFilters.length == 0\"\n matBadgeColor=\"accent\"\n [color]=\"userDefinedFilters.length > 0 ? 'accent' : undefined\"\n >\n filter_list\n </mat-icon>\n </button>\n </div>\n </mat-form-field>\n</div>\n\n\n<!-- Overlay Panel for advanced search -->\n<elder-overlay #searchPanel=\"elderOverlay\">\n <elder-dialog-panel class=\"elder-search-panel-container\">\n\n <!-- Project the users search inputs here -->\n <ng-content select=\"elder-search-panel\"></ng-content>\n\n <div class=\"layout-row place-between-center\">\n <button mat-raised-button type=\"button\" name=\"clear\"\n (click)=\"clearSearch($event)\">{{'context.reset' | translate}}\n </button>\n\n <button mat-raised-button type=\"button\" name=\"ok\" color=\"primary\"\n (click)=\"searchPanel.closeOverlay()\">Ok\n </button>\n </div>\n </elder-dialog-panel>\n</elder-overlay>\n", styles: [".elder-search-box-field{margin-top:4px;margin-bottom:4px}.elder-search-panel-container{min-width:250px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.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: i4$3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "directive", type: ElderFormFieldDenseDirective, selector: "mat-form-field[elderDense]", inputs: ["elderDense", "subscriptSizing", "floatLabel"] }, { kind: "directive", type: ElderSearchInputDirective, selector: "[elderSearchInput]", inputs: ["elderSearchInputKey", "elderSearchInputTransform", "elderSearchInput", "elderSearchInputFallback"], exportAs: ["elderSearchInput"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26402
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchBoxComponent, selector: "elder-search-box", inputs: { autoPanel: "autoPanel", name: "name", queryKey: "queryKey", placeholder: "placeholder", label: "label", hint: "hint", autocomplete: "autocomplete", appearance: "appearance", dense: "dense" }, host: { classAttribute: "elder-form-field-host" }, queries: [{ propertyName: "advancedSearch", first: true, predicate: ElderSearchPanelComponent, descendants: true }], viewQueries: [{ propertyName: "search", first: true, predicate: ["search"], descendants: true }], exportAs: ["elderSearchBox"], ngImport: i0, template: "<div class=\"layout-row place-stretch-center full flex\" style=\"overflow: hidden\">\n <mat-form-field\n *ngIf=\"overlayState$ | async as overlayState\"\n [appearance]=\"appearance\"\n class=\"elder-search-box-field flex-auto\" subscriptSizing=\"dynamic\"\n [elderDense]=\"dense\">\n\n <button matPrefix mat-icon-button type=\"button\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\"\n >\n <mat-icon>search</mat-icon>\n </button>\n\n <input matInput type=\"text\" [name]=\"name\" [placeholder]=\"placeholder\" #search cdkFocusInitial\n ngModel\n elderSearchInput [elderSearchInputKey]=\"queryKey\" #searchInput=\"elderSearchInput\"\n [autocomplete]=\"(autoPanel && overlayState.hasOverlay) ? 'off' : autocomplete\"\n [elderOverlayOrigin]=\"searchPanel\"\n [elderOverlayTrigger]=\"searchPanel\"\n [elderOverlayTriggerType]=\"'focus'\"\n [elderOverlayTriggerEnabled]=\"autoPanel && overlayState.hasOverlay && (searchInput?.state$ | async)?.pristine\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n\n <div class=\"layout-row\" matSuffix *ngIf=\"searchModel.userDefinedAttributes$ | async as userDefinedFilters\">\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"userDefinedFilters.length > 0\"\n (click)=\"clearSearch($event)\"\n name=\"clear\" aria-label=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"overlayState.hasOverlay\" name=\"openPanel\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\">\n <mat-icon\n [matBadge]=\"userDefinedFilters.length\"\n matBadgeSize=\"small\"\n [matBadgeOverlap]=\"true\"\n [matBadgeHidden]=\"userDefinedFilters.length == 0\"\n matBadgeColor=\"accent\"\n [color]=\"userDefinedFilters.length > 0 ? 'accent' : undefined\"\n >\n filter_list\n </mat-icon>\n </button>\n </div>\n </mat-form-field>\n</div>\n\n\n<!-- Overlay Panel for advanced search -->\n<elder-overlay #searchPanel=\"elderOverlay\">\n <elder-dialog-panel class=\"elder-search-panel-container\">\n\n <!-- Project the users search inputs here -->\n <ng-content select=\"elder-search-panel\"></ng-content>\n\n <div class=\"layout-row place-between-center\">\n <button mat-raised-button type=\"button\" name=\"clear\"\n (click)=\"clearSearch($event)\">{{'context.reset' | translate}}\n </button>\n\n <button mat-raised-button type=\"button\" name=\"ok\" color=\"primary\"\n (click)=\"searchPanel.closeOverlay()\">Ok\n </button>\n </div>\n </elder-dialog-panel>\n</elder-overlay>\n", styles: [".elder-search-box-field{margin-top:4px;margin-bottom:4px}.elder-search-panel-container{min-width:250px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.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: i4$3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "directive", type: ElderFormFieldDenseDirective, selector: "mat-form-field[elderDense]", inputs: ["elderDense", "subscriptSizing", "floatLabel"] }, { kind: "directive", type: ElderSearchInputDirective, selector: "[elderSearchInput]", inputs: ["elderSearchInputKey", "elderSearchInputTransform", "elderSearchInput", "dataSource", "elderSearchInputFallback", "valueAsId"], exportAs: ["elderSearchInput"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26282
26403
  }
26283
26404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchBoxComponent, decorators: [{
26284
26405
  type: Component,
@@ -26340,18 +26461,224 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
26340
26461
  }]
26341
26462
  }] });
26342
26463
 
26464
+ class ElderSearchContextFilters {
26465
+ static empty(searchContextId) {
26466
+ return new ElderSearchContextFilters(searchContextId, new Map());
26467
+ }
26468
+ constructor(searchContextId, filters) {
26469
+ this.searchContextId = searchContextId;
26470
+ this.filters = filters;
26471
+ }
26472
+ }
26473
+
26474
+ class ElderSearchUrlBindingService {
26475
+ constructor(router, route) {
26476
+ this.router = router;
26477
+ this.route = route;
26478
+ //A search param has following structure: search-[searchContextId]-[filterId]=[value]
26479
+ //Example: search-browser1-hasStarted=true
26480
+ this._searchMap$ = new BehaviorSubject$1(new Map());
26481
+ this._initialSearchMap$ = new BehaviorSubject$1(new Map());
26482
+ this.searchParamPrefix = "q";
26483
+ this.unsubscribe$ = new Subject();
26484
+ this.router.events.pipe(first()).subscribe(() => {
26485
+ this.handleSearchParameters(this.route.snapshot.queryParams);
26486
+ });
26487
+ this._searchMap$.pipe(takeUntil(this.unsubscribe$)).subscribe(searchMap => {
26488
+ const resetParams = this.resetSearchParams();
26489
+ const queryParams = { ...resetParams, ...this.buildQueryParams(searchMap) };
26490
+ this.router.navigate([], {
26491
+ relativeTo: this.route,
26492
+ queryParams: queryParams,
26493
+ replaceUrl: true,
26494
+ queryParamsHandling: "merge"
26495
+ });
26496
+ });
26497
+ }
26498
+ resetSearchParams() {
26499
+ let params = { ...this.route.snapshot.queryParams };
26500
+ const searchParams = this.extractSearchParameters(params);
26501
+ for (const searchParam of searchParams) {
26502
+ params[searchParam] = null;
26503
+ }
26504
+ return params;
26505
+ }
26506
+ buildQueryParams(searchMap) {
26507
+ const params = {};
26508
+ for (const searchContextId of searchMap.keys()) {
26509
+ const filters = searchMap.get(searchContextId).filters;
26510
+ for (const filter of filters.values()) {
26511
+ params[`${this.searchParamPrefix}-${searchContextId}-${filter.key}`] = this.convertValueToArrayOrSingleValue(filter.value);
26512
+ }
26513
+ }
26514
+ return params;
26515
+ }
26516
+ convertValueToArrayOrSingleValue(value) {
26517
+ return Array.isArray(value) ? `(${value.toString()})` : value;
26518
+ }
26519
+ get initialSearchMap$() {
26520
+ return this._initialSearchMap$;
26521
+ }
26522
+ updateFiltersForContext(searchContextId, filters) {
26523
+ const searchMap = this._searchMap$.getValue();
26524
+ const filtersMap = new Map(filters
26525
+ .filter(filter => filter.value != null)
26526
+ .map(filter => {
26527
+ return [filter.key, filter];
26528
+ }));
26529
+ searchMap.set(searchContextId, new ElderSearchContextFilters(searchContextId, filtersMap));
26530
+ this._searchMap$.next(searchMap);
26531
+ }
26532
+ handleSearchParameters(params) {
26533
+ const searchParamKeys = this.extractSearchParameters(params);
26534
+ const searchMap = this.buildSearchContextMap(params, searchParamKeys);
26535
+ this._searchMap$.next(searchMap);
26536
+ this._initialSearchMap$.next(searchMap);
26537
+ }
26538
+ extractSearchParameters(params) {
26539
+ return Object.getOwnPropertyNames(params).filter(param => param.startsWith(this.searchParamPrefix));
26540
+ }
26541
+ buildSearchContextMap(params, searchParamKeys) {
26542
+ const searchMap = new Map();
26543
+ for (const key of searchParamKeys) {
26544
+ const filterValue = params[key];
26545
+ const filterParamData = this.extractFilterParam(key, filterValue);
26546
+ const filter = this.convertFilterStringToFilter(filterValue, filterParamData);
26547
+ this.checkAndSetFilter(searchMap, filterParamData, filter);
26548
+ }
26549
+ return searchMap;
26550
+ }
26551
+ checkAndSetFilter(searchMap, filterParamData, filter) {
26552
+ if (searchMap.has(filterParamData.searchContextId)) {
26553
+ this.setFilter(searchMap, filterParamData, filter);
26554
+ }
26555
+ else {
26556
+ searchMap.set(filterParamData.searchContextId, ElderSearchContextFilters.empty(filterParamData.searchContextId));
26557
+ this.setFilter(searchMap, filterParamData, filter);
26558
+ }
26559
+ }
26560
+ setFilter(searchMap, filterParamData, filter) {
26561
+ const searchContext = searchMap.get(filterParamData.searchContextId);
26562
+ searchContext.filters.set(filterParamData.filterId, filter);
26563
+ }
26564
+ extractFilterParam(key, filterValue) {
26565
+ const splitParams = key.split("-");
26566
+ return {
26567
+ searchContextId: splitParams[1],
26568
+ filterId: splitParams[2],
26569
+ isArray: this.checkIfParamIsArray(filterValue)
26570
+ };
26571
+ }
26572
+ checkIfParamIsArray(filterValue) {
26573
+ return filterValue.startsWith("(") && filterValue.endsWith(")");
26574
+ }
26575
+ convertFilterStringToFilter(paramValue, filterParamData) {
26576
+ let value = paramValue;
26577
+ if (this.isSingularArrayValue(value, filterParamData)) {
26578
+ value = this.convertValueToArray(value);
26579
+ }
26580
+ return new Filter(filterParamData.filterId, value);
26581
+ }
26582
+ isSingularArrayValue(value, filterParamData) {
26583
+ return !Array.isArray(value) && filterParamData.isArray;
26584
+ }
26585
+ convertValueToArray(value) {
26586
+ return value.slice(1).slice(0, -1).split(",");
26587
+ }
26588
+ ngOnDestroy() {
26589
+ this.unsubscribe$.next();
26590
+ this.unsubscribe$.complete();
26591
+ }
26592
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchUrlBindingService, deps: [{ token: i1$3.Router }, { token: i1$3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable }); }
26593
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchUrlBindingService, providedIn: "root" }); }
26594
+ }
26595
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchUrlBindingService, decorators: [{
26596
+ type: Injectable,
26597
+ args: [{
26598
+ providedIn: "root"
26599
+ }]
26600
+ }], ctorParameters: function () { return [{ type: i1$3.Router }, { type: i1$3.ActivatedRoute }]; } });
26601
+
26602
+ /**
26603
+ * The search container manages a group of search-inputs
26604
+ * and holds their values in a central search model.
26605
+ */
26606
+ class ElderSearchContextUrlBindingDirective {
26607
+ /***************************************************************************
26608
+ * *
26609
+ * Constructor *
26610
+ * *
26611
+ **************************************************************************/
26612
+ constructor(searchContext, urlBindingService) {
26613
+ this.searchContext = searchContext;
26614
+ this.urlBindingService = urlBindingService;
26615
+ /***************************************************************************
26616
+ * *
26617
+ * Fields *
26618
+ * *
26619
+ **************************************************************************/
26620
+ this.log = LoggerFactory.getLogger(this.constructor.name);
26621
+ this._unsubscribe$ = new Subject$1();
26622
+ }
26623
+ /***************************************************************************
26624
+ * *
26625
+ * Life Cycle *
26626
+ * *
26627
+ **************************************************************************/
26628
+ ngAfterViewInit() {
26629
+ this.urlBindingService.initialSearchMap$.pipe(first(), takeUntil(this._unsubscribe$), filter(searchMap => searchMap.has(this._urlBinding)), map(searchMap => searchMap.get(this._urlBinding)), map(filterMap => Array.from(filterMap.filters.values()))).subscribe(filters => {
26630
+ this.searchContext.registerInitialFilters(filters);
26631
+ });
26632
+ this.searchContext.filters$.pipe(takeUntil(this._unsubscribe$), skip(2) //Skip empty and skip initial filter
26633
+ ).subscribe(filters => this.urlBindingService.updateFiltersForContext(this._urlBinding, filters));
26634
+ }
26635
+ ngOnDestroy() {
26636
+ this._unsubscribe$.next();
26637
+ this._unsubscribe$.complete();
26638
+ }
26639
+ /***************************************************************************
26640
+ * *
26641
+ * Properties *
26642
+ * *
26643
+ **************************************************************************/
26644
+ set elderSearchContextUrlBinding(value) {
26645
+ this._urlBinding = value;
26646
+ }
26647
+ get elderSearchContextUrlBinding() {
26648
+ return this._urlBinding;
26649
+ }
26650
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchContextUrlBindingDirective, deps: [{ token: ElderSearchContextDirective }, { token: ElderSearchUrlBindingService }], target: i0.ɵɵFactoryTarget.Directive }); }
26651
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ElderSearchContextUrlBindingDirective, selector: "[elderSearchContextUrlBinding]", inputs: { elderSearchContextUrlBinding: "elderSearchContextUrlBinding" }, exportAs: ["elderSearchContextUrlBinding"], ngImport: i0 }); }
26652
+ }
26653
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchContextUrlBindingDirective, decorators: [{
26654
+ type: Directive,
26655
+ args: [{
26656
+ selector: "[elderSearchContextUrlBinding]",
26657
+ exportAs: "elderSearchContextUrlBinding"
26658
+ }]
26659
+ }], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type: ElderSearchUrlBindingService }]; }, propDecorators: { elderSearchContextUrlBinding: [{
26660
+ type: Input
26661
+ }] } });
26662
+
26343
26663
  class ElderSearchModule {
26344
26664
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26345
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchModule, declarations: [ElderSearchContextDirective, ElderSearchInputDirective,
26346
- ElderSearchBoxComponent, ElderSearchPanelComponent], imports: [CommonModule, FormsModule,
26665
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchModule, declarations: [ElderSearchContextDirective,
26666
+ ElderSearchContextUrlBindingDirective,
26667
+ ElderSearchInputDirective,
26668
+ ElderInitialValueDirective,
26669
+ ElderSearchBoxComponent,
26670
+ ElderSearchPanelComponent], imports: [CommonModule, FormsModule,
26347
26671
  MatInputModule, MatButtonModule, MatIconModule,
26348
26672
  MatBadgeModule,
26349
26673
  A11yModule,
26350
26674
  ElderOverlayModule,
26351
26675
  ElderPanelModule,
26352
26676
  ElderFormsDirectivesModule,
26353
- TranslateModule], exports: [ElderSearchContextDirective, ElderSearchInputDirective,
26354
- ElderSearchBoxComponent, ElderSearchPanelComponent] }); }
26677
+ TranslateModule], exports: [ElderSearchContextDirective,
26678
+ ElderSearchContextUrlBindingDirective,
26679
+ ElderSearchInputDirective,
26680
+ ElderSearchBoxComponent,
26681
+ ElderSearchPanelComponent] }); }
26355
26682
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ElderSearchModule, imports: [CommonModule, FormsModule,
26356
26683
  MatInputModule, MatButtonModule, MatIconModule,
26357
26684
  MatBadgeModule,
@@ -26375,13 +26702,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
26375
26702
  TranslateModule
26376
26703
  ],
26377
26704
  declarations: [
26378
- ElderSearchContextDirective, ElderSearchInputDirective,
26379
- ElderSearchBoxComponent, ElderSearchPanelComponent
26705
+ ElderSearchContextDirective,
26706
+ ElderSearchContextUrlBindingDirective,
26707
+ ElderSearchInputDirective,
26708
+ ElderInitialValueDirective,
26709
+ ElderSearchBoxComponent,
26710
+ ElderSearchPanelComponent
26380
26711
  ],
26381
26712
  exports: [
26382
- ElderSearchContextDirective, ElderSearchInputDirective,
26383
- ElderSearchBoxComponent, ElderSearchPanelComponent
26384
- ],
26713
+ ElderSearchContextDirective,
26714
+ ElderSearchContextUrlBindingDirective,
26715
+ ElderSearchInputDirective,
26716
+ ElderSearchBoxComponent,
26717
+ ElderSearchPanelComponent
26718
+ ]
26385
26719
  }]
26386
26720
  }] });
26387
26721
 
@@ -30337,5 +30671,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
30337
30671
  * Generated bundle index. Do not edit.
30338
30672
  */
30339
30673
 
30340
- export { ActivationEventSource, Arrays, AuditedEntity, AutoStartSpec, BlobUrl, BytesFormat, BytesPerSecondFormat, BytesPipe, CardDropEvent, CardOrganizerData, CardStack, CollectionUtil, ComparatorBuilder, ConfirmDialogConfig, ContinuableListing, CsvColumnSpec, CsvSerializer, CsvSpec, CsvStreamExporter, CsvStreamExporterBuilder, CsvStreamExporterBuilderService, Currency, CurrencyCode, CurrencyUnit, CurrencyUnitRegistry, CustomDateAdapter, DataContextActivePage, DataContextAutoStarter, DataContextBase, DataContextBuilder, DataContextContinuableBase, DataContextContinuablePaged, DataContextContinuableToken, DataContextLifeCycleBinding, DataContextSelectionDirective, DataContextSimple, DataContextSnapshot, DataContextSourceEventBinding, DataContextStateIndicatorComponent, DataContextStatus, DataSourceAdapter, DataSourceBase, DataSourceChangeEvent, DataSourceChangeType, DataSourceProcessor, DataTransferFactory, DataTransferProgress, DataTransferProgressAggregate, DataTransferState, DataTransferStatus, DataViewIframeAdapterDirective, DataViewIframeComponent, DataViewMessage, DataViewMessageTypeValues, DataViewOptionsProviderBinding, DataViewSelection, DataViewSelectionInit, DateUtil, DelegateContinuableDataSource, DelegateDataSource, DelegateListDataSource, DelegatePagedDataSource, Dimensions, DrawerOutletBinding, DurationBucket, DurationFormat, ELDER_DATA_VIEW, ELDER_SELECT_BASE, ElderAccessDeniedComponent, ElderAccessDeniedModule, ElderAppHeaderComponent, ElderAuditModule, ElderAuditedEntityComponent, ElderAutoSelectFirstDirective, ElderAutocompleteComponent, ElderAutocompleteDirective, ElderAutocompleteManyDirective, ElderAutocompleteModule, ElderBadgeComponent, ElderBadgeDirective, ElderBadgeModule, ElderBlobViewerComponent, ElderBreadCrumbsComponent, ElderBreadCrumbsModule, ElderButtonGroupComponent, ElderButtonGroupModule, ElderCardComponent, ElderCardContentDirective, ElderCardHeaderActionsDirective, ElderCardHeaderComponent, ElderCardModule, ElderCardOrganizerComponent, ElderCardOrganizerModule, ElderCardPanelComponent, ElderCardStackComponent, ElderCardSubtitleDirective, ElderCardTitleDirective, ElderCheckboxState, ElderChipLabelDirective, ElderChipListSelectComponent, ElderChipListSelectModule, ElderChipsModule, ElderClearSelectDirective, ElderClipboardPutDirective, ElderClipboardService, ElderConfirmDialogComponent, ElderConnectivityModule, ElderConnectivityService, ElderContainersModule, ElderCsvExportBtnComponent, ElderCsvModule, ElderCurrencyModule, ElderCurrencyPipe, ElderDataCommonModule, ElderDataToolbarComponent, ElderDataTransferModule, ElderDataTransferService, ElderDataViewBaseComponent, ElderDataViewOptions, ElderDataViewOptionsProvider, ElderDateSwitcherComponent, ElderDateTimeInputComponent, ElderDelayedFocusDirective, ElderDeleteActiveDirective, ElderDetailDialogComponent, ElderDetailDirective, ElderDialogConfig, ElderDialogModule, ElderDialogPanelComponent, ElderDialogService, ElderDimensionsInputComponent, ElderDropZoneComponent, ElderDurationInputComponent, ElderEntityValueAccessorUtil, ElderEnumTranslationService, ElderErrorModule, ElderEventSourceService, ElderExceptionDetailComponent, ElderExpandToggleButtonComponent, ElderExpandToggleButtonModule, ElderFileDropZoneDirective, ElderFileModule, ElderFileSelectComponent, ElderFileSelectDirective, ElderFileUploadComponent, ElderFormFieldControlBase, ElderFormFieldDenseDirective, ElderFormFieldLabelDirective, ElderFormFieldNoHintDirective, ElderFormFieldNoSpinnerDirective, ElderFormsDirectivesModule, ElderFormsModule, ElderFromFieldBase, ElderFromFieldEntityBase, ElderFromFieldMultiEntityBase, ElderGlobalSearchComponent, ElderGlobalSearchModule, ElderGlobalSearchService, ElderGridComponent, ElderGridModule, ElderGridTileDirective, ElderGridToolbarDirective, ElderHeaderComponent, ElderHeaderModule, ElderHttpClient, ElderI18nEntitiesModule, ElderIFrameModule, ElderInfiniteAutocompleteDirective, ElderInfiniteScrollDirective, ElderInfiniteScrollModule, ElderInputPatternDirective, ElderIntervalInputComponent, ElderKeyEventDirective, ElderLabelInputComponent, ElderLabelsModule, ElderLanguageConfig, ElderLanguageInterceptor, ElderLanguageModule, ElderLanguageService, ElderLanguageSwitcherComponent, ElderLocalDateInputComponent, ElderLocalTimeInputComponent, ElderLocalesDeChModule, ElderLocalizedInputComponent, ElderLocalizedInputDialogComponent, ElderLocalizedInputDialogService, ElderLocalizedInputTableComponent, ElderLocalizedTextColumnDirective, ElderLocalizedTextsDirective, ElderMasterActivationDirective, ElderMasterDetailComponent, ElderMasterDetailModule, ElderMasterDetailService, ElderMasterDirective, ElderMaxValidator, ElderMeasuresModule, ElderMinValidator, ElderMultiEntityValueAccessorUtil, ElderMultiSelectBase, ElderMultiSelectChipsComponent, ElderMultiSelectFormField, ElderMultipleOfUtil, ElderMultipleOfValidator, ElderNavGroupComponent, ElderNavLinkComponent, ElderNavListComponent, ElderNavModule, ElderNextFocusableDirective, ElderNumberCellDirective, ElderOfflineIndicatorComponent, ElderOverlayComponent, ElderOverlayModule, ElderOverlayOriginDirective, ElderOverlayTriggerDirective, ElderPaddingDirective, ElderPanelComponent, ElderPanelModule, ElderPeriodInputComponent, ElderPipesModule, ElderPlugParentFormDirective, ElderProgressBarComponent, ElderProgressBarModule, ElderQuantityFormFieldComponent, ElderQuantityInputControlComponent, ElderQuantityModule, ElderQuantityPipe, ElderQuantityRangeValidator, ElderQuantityService, ElderQuantityTransformPipe, ElderQuestionDialogComponent, ElderRepeatPipe, ElderRepeatPipeLegacy, ElderRequiredDimensionsValidator, ElderRequiredIgnoreZeroValidator, ElderRequiredQuantityValidator, ElderRoundPipe, ElderRouteOutletDrawerService, ElderRouterOutletService, ElderRouterService, ElderSafeUrlPipe, ElderScrollContainerComponent, ElderScrollbarDirective, ElderScrollbarModule, ElderSearchBoxComponent, ElderSearchContextDirective, ElderSearchInputDirective, ElderSearchModule, ElderSearchPanelComponent, ElderSelectBase, ElderSelectChipAvatarDirective, ElderSelectChipDirective, ElderSelectComponent, ElderSelectComponentState, ElderSelectCustomInputDirective, ElderSelectFormField, ElderSelectModule, ElderSelectOnTabDirective, ElderSelectValueDirective, ElderSelectionDialogComponent, ElderSelectionDialogDirective, ElderSelectionMasterCheckboxComponent, ElderSelectionPopupTriggerAdapterDirective, ElderShellCenterDirective, ElderShellComponent, ElderShellModule, ElderShellNavigationToggleComponent, ElderShellService, ElderShellSideLeftDirective, ElderShellSideRightDirective, ElderShellSlotDirective, ElderSimpleSelectionViewComponent, ElderSimpleSelectionViewModule, ElderSingleSortComponent, ElderStackCardDirective, ElderStopEventPropagationDirective, ElderSvgViewerComponent, ElderTabDirective, ElderTabFocusTrapDirective, ElderTabGroupRoutingDirective, ElderTabModule, ElderTableActivationDirective, ElderTableComponent, ElderTableExtensionDirective, ElderTableGroup, ElderTableModel, ElderTableModelCdkTableBinding, ElderTableModelQueryGroup, ElderTableModule, ElderTableProviders, ElderTableRootDirective, ElderTableSortDirective, ElderTableToolbarDirective, ElderThemeApplierDirective, ElderThemeDirective, ElderThemeModule, ElderThemePreferenceService, ElderThemeService, ElderThemeToggleComponent, ElderTimeModule, ElderToastModule, ElderToastService, ElderTogglePanelComponent, ElderTogglePanelPrimaryDirective, ElderTogglePanelSecondaryDirective, ElderTogglePanelTriggerDirective, ElderToolbarColumnDirective, ElderToolbarComponent, ElderToolbarContentDirective, ElderToolbarModule, ElderToolbarService, ElderToolbarTitleComponent, ElderToolbarTitleService, ElderTouchedDirective, ElderTrimPipe, ElderTripleStateCheckboxDirective, ElderTruncatePipe, ElderUnitSelectDirective, ElderUnitService, ElderUrlFragment, ElderUrlFragmentModule, ElderUrlFragmentParamsService, ElderUrlFragmentSwitcherComponent, ElderValidationErrorDirective, ElderViewersModule, EntitySetPatch, ErrorUtil, ExceptionDetailCtx, FileEntry, FileListingRx, FileUploadClient, Filter, FilterContext, FilterUtil, FocusUtil, FormFieldBaseComponent, GlobalDragDropService, HttpClientBuilder, HttpClientPristine, HttpDataTransfer, HttpDataTransferAggregateComponent, HttpDataTransferComponent, HttpDataTransferIndicatorComponent, HttpDataTransferOverviewComponent, HttpParamsBuilder, I18nBase, I18nPickAsyncPipe, I18nPickPipe, I18nText, IFrameState, IframeCloseDirective, IframeDialogComponent, IframeHostComponent, IframeService, IframeSideContentComponent, IndexedEntities, InternalRestClientConfig, Interval, IsoDurationPipe, IsoIntervalParsePipe, IsoIntervalPipe, ItemActivationEvent, ItemActivationOptions, JsonMapUtil, KafentConfig, KafentEvent, KafentEventService, KafentEventStream, KafentEventStreamDisabled, KafentEventStreamSse, KafentEventTransport, KafentModule, KafentSseEventChannel, KafentTokenProvider, KafentTokenProviderSessionStorage, KafentTopicSse, KnownElderThemes, KnownLocaleTags, LocalListDataSource, LocalPagedDataSource, LocalisationPickerService, MasterDetailActivationEvent, MasterSelectionState, MatTableDataContextBinding, MatTableDataContextBindingBuilder, MultiModelBaseComponent, NextNumberUtil, Objects, OnlineStatus, Page, PageRequest, Pageable, ParseUtil, Path, PathNode, PeriodBucket, PeriodDuration, PeriodFormat, ProcessIterationContext, ProcessState, PropertyPathUtil, Quantity, QueryListBinding, QuestionDialogConfig, ReactiveEventSource, ReactiveMap, RefreshingEntity, RestClient, RestClientConfig, RestClientContinuable, RestClientList, RestClientPaged, SearchQuery, SelectionModel, SelectionModelPopupDirective, Sets, SimpleLocalisationPicker, Sort, SortOption, SortUtil, StandardToastComponent, SubBar, SuggestionProvider, TemplateCompositeControl, TemplatedSelectionDialogComponent, ThemeSpec, TimeAgoPipe, TimeDurationPipe, TimeUtil, ToIsoDateStringPipe, ToastType, TokenChunkRequest, ToolbarHeader, Translated, TranslatedConverter, TranslatedEnumValue, TranslatedText, TypedEventMessage, Unit, UnitDimension, UnitDimensionInfo, UnitInfo, UnitRegistry, UrlBuilder, UrlQueryParams, UuidUtil, ValueAccessorBase, ValueWrapper, ViewProviders, WeightPipe, alphaNumStringComparator, buildFormIntegrationProviders, createDataOptionsProvider, createSelectionModel, existingOrNewElderTableModel, isActivePagedDataContext, isContinuableDataContext, isContinuableDataSource, isDataContext, isDataSource, isDataViewMessageType, isElderEntityValueAccessor, isElderMultiEntityValueAccessor, isListDataSource, isPagedDataSource, lazySample, lazySampleTime, naturalValueComparator, newElderTableModel, proxyControlContainer, registerLocale, runInZone, themeInit };
30674
+ export { ActivationEventSource, Arrays, AuditedEntity, AutoStartSpec, BlobUrl, BytesFormat, BytesPerSecondFormat, BytesPipe, CardDropEvent, CardOrganizerData, CardStack, CollectionUtil, ComparatorBuilder, ConfirmDialogConfig, ContinuableListing, CsvColumnSpec, CsvSerializer, CsvSpec, CsvStreamExporter, CsvStreamExporterBuilder, CsvStreamExporterBuilderService, Currency, CurrencyCode, CurrencyUnit, CurrencyUnitRegistry, CustomDateAdapter, DataContextActivePage, DataContextAutoStarter, DataContextBase, DataContextBuilder, DataContextContinuableBase, DataContextContinuablePaged, DataContextContinuableToken, DataContextLifeCycleBinding, DataContextSelectionDirective, DataContextSimple, DataContextSnapshot, DataContextSourceEventBinding, DataContextStateIndicatorComponent, DataContextStatus, DataSourceAdapter, DataSourceBase, DataSourceChangeEvent, DataSourceChangeType, DataSourceProcessor, DataTransferFactory, DataTransferProgress, DataTransferProgressAggregate, DataTransferState, DataTransferStatus, DataViewIframeAdapterDirective, DataViewIframeComponent, DataViewMessage, DataViewMessageTypeValues, DataViewOptionsProviderBinding, DataViewSelection, DataViewSelectionInit, DateUtil, DelegateContinuableDataSource, DelegateDataSource, DelegateListDataSource, DelegatePagedDataSource, Dimensions, DrawerOutletBinding, DurationBucket, DurationFormat, ELDER_DATA_VIEW, ELDER_SELECT_BASE, ElderAccessDeniedComponent, ElderAccessDeniedModule, ElderAppHeaderComponent, ElderAuditModule, ElderAuditedEntityComponent, ElderAutoSelectFirstDirective, ElderAutocompleteComponent, ElderAutocompleteDirective, ElderAutocompleteManyDirective, ElderAutocompleteModule, ElderBadgeComponent, ElderBadgeDirective, ElderBadgeModule, ElderBlobViewerComponent, ElderBreadCrumbsComponent, ElderBreadCrumbsModule, ElderButtonGroupComponent, ElderButtonGroupModule, ElderCardComponent, ElderCardContentDirective, ElderCardHeaderActionsDirective, ElderCardHeaderComponent, ElderCardModule, ElderCardOrganizerComponent, ElderCardOrganizerModule, ElderCardPanelComponent, ElderCardStackComponent, ElderCardSubtitleDirective, ElderCardTitleDirective, ElderCheckboxState, ElderChipLabelDirective, ElderChipListSelectComponent, ElderChipListSelectModule, ElderChipsModule, ElderClearSelectDirective, ElderClipboardPutDirective, ElderClipboardService, ElderConfirmDialogComponent, ElderConnectivityModule, ElderConnectivityService, ElderContainersModule, ElderCsvExportBtnComponent, ElderCsvModule, ElderCurrencyModule, ElderCurrencyPipe, ElderDataCommonModule, ElderDataToolbarComponent, ElderDataTransferModule, ElderDataTransferService, ElderDataViewBaseComponent, ElderDataViewOptions, ElderDataViewOptionsProvider, ElderDateSwitcherComponent, ElderDateTimeInputComponent, ElderDelayedFocusDirective, ElderDeleteActiveDirective, ElderDetailDialogComponent, ElderDetailDirective, ElderDialogConfig, ElderDialogModule, ElderDialogPanelComponent, ElderDialogService, ElderDimensionsInputComponent, ElderDropZoneComponent, ElderDurationInputComponent, ElderEntityValueAccessorUtil, ElderEnumTranslationService, ElderErrorModule, ElderEventSourceService, ElderExceptionDetailComponent, ElderExpandToggleButtonComponent, ElderExpandToggleButtonModule, ElderFileDropZoneDirective, ElderFileModule, ElderFileSelectComponent, ElderFileSelectDirective, ElderFileUploadComponent, ElderFormFieldControlBase, ElderFormFieldDenseDirective, ElderFormFieldLabelDirective, ElderFormFieldNoHintDirective, ElderFormFieldNoSpinnerDirective, ElderFormsDirectivesModule, ElderFormsModule, ElderFromFieldBase, ElderFromFieldEntityBase, ElderFromFieldMultiEntityBase, ElderGlobalSearchComponent, ElderGlobalSearchModule, ElderGlobalSearchService, ElderGridComponent, ElderGridModule, ElderGridTileDirective, ElderGridToolbarDirective, ElderHeaderComponent, ElderHeaderModule, ElderHttpClient, ElderI18nEntitiesModule, ElderIFrameModule, ElderInfiniteAutocompleteDirective, ElderInfiniteScrollDirective, ElderInfiniteScrollModule, ElderInputPatternDirective, ElderIntervalInputComponent, ElderKeyEventDirective, ElderLabelInputComponent, ElderLabelsModule, ElderLanguageConfig, ElderLanguageInterceptor, ElderLanguageModule, ElderLanguageService, ElderLanguageSwitcherComponent, ElderLocalDateInputComponent, ElderLocalTimeInputComponent, ElderLocalesDeChModule, ElderLocalizedInputComponent, ElderLocalizedInputDialogComponent, ElderLocalizedInputDialogService, ElderLocalizedInputTableComponent, ElderLocalizedTextColumnDirective, ElderLocalizedTextsDirective, ElderMasterActivationDirective, ElderMasterDetailComponent, ElderMasterDetailModule, ElderMasterDetailService, ElderMasterDirective, ElderMaxValidator, ElderMeasuresModule, ElderMinValidator, ElderMultiEntityValueAccessorUtil, ElderMultiSelectBase, ElderMultiSelectChipsComponent, ElderMultiSelectFormField, ElderMultipleOfUtil, ElderMultipleOfValidator, ElderNavGroupComponent, ElderNavLinkComponent, ElderNavListComponent, ElderNavModule, ElderNextFocusableDirective, ElderNumberCellDirective, ElderOfflineIndicatorComponent, ElderOverlayComponent, ElderOverlayModule, ElderOverlayOriginDirective, ElderOverlayTriggerDirective, ElderPaddingDirective, ElderPanelComponent, ElderPanelModule, ElderPeriodInputComponent, ElderPipesModule, ElderPlugParentFormDirective, ElderProgressBarComponent, ElderProgressBarModule, ElderQuantityFormFieldComponent, ElderQuantityInputControlComponent, ElderQuantityModule, ElderQuantityPipe, ElderQuantityRangeValidator, ElderQuantityService, ElderQuantityTransformPipe, ElderQuestionDialogComponent, ElderRepeatPipe, ElderRepeatPipeLegacy, ElderRequiredDimensionsValidator, ElderRequiredIgnoreZeroValidator, ElderRequiredQuantityValidator, ElderRoundPipe, ElderRouteOutletDrawerService, ElderRouterOutletService, ElderRouterService, ElderSafeUrlPipe, ElderScrollContainerComponent, ElderScrollbarDirective, ElderScrollbarModule, ElderSearchBoxComponent, ElderSearchContextDirective, ElderSearchContextUrlBindingDirective, ElderSearchInputDirective, ElderSearchModule, ElderSearchPanelComponent, ElderSelectBase, ElderSelectChipAvatarDirective, ElderSelectChipDirective, ElderSelectComponent, ElderSelectComponentState, ElderSelectCustomInputDirective, ElderSelectFormField, ElderSelectModule, ElderSelectOnTabDirective, ElderSelectValueDirective, ElderSelectionDialogComponent, ElderSelectionDialogDirective, ElderSelectionMasterCheckboxComponent, ElderSelectionPopupTriggerAdapterDirective, ElderShellCenterDirective, ElderShellComponent, ElderShellModule, ElderShellNavigationToggleComponent, ElderShellService, ElderShellSideLeftDirective, ElderShellSideRightDirective, ElderShellSlotDirective, ElderSimpleSelectionViewComponent, ElderSimpleSelectionViewModule, ElderSingleSortComponent, ElderStackCardDirective, ElderStopEventPropagationDirective, ElderSvgViewerComponent, ElderTabDirective, ElderTabFocusTrapDirective, ElderTabGroupRoutingDirective, ElderTabModule, ElderTableActivationDirective, ElderTableComponent, ElderTableExtensionDirective, ElderTableGroup, ElderTableModel, ElderTableModelCdkTableBinding, ElderTableModelQueryGroup, ElderTableModule, ElderTableProviders, ElderTableRootDirective, ElderTableSortDirective, ElderTableToolbarDirective, ElderThemeApplierDirective, ElderThemeDirective, ElderThemeModule, ElderThemePreferenceService, ElderThemeService, ElderThemeToggleComponent, ElderTimeModule, ElderToastModule, ElderToastService, ElderTogglePanelComponent, ElderTogglePanelPrimaryDirective, ElderTogglePanelSecondaryDirective, ElderTogglePanelTriggerDirective, ElderToolbarColumnDirective, ElderToolbarComponent, ElderToolbarContentDirective, ElderToolbarModule, ElderToolbarService, ElderToolbarTitleComponent, ElderToolbarTitleService, ElderTouchedDirective, ElderTrimPipe, ElderTripleStateCheckboxDirective, ElderTruncatePipe, ElderUnitSelectDirective, ElderUnitService, ElderUrlFragment, ElderUrlFragmentModule, ElderUrlFragmentParamsService, ElderUrlFragmentSwitcherComponent, ElderValidationErrorDirective, ElderViewersModule, EntitySetPatch, ErrorUtil, ExceptionDetailCtx, FileEntry, FileListingRx, FileUploadClient, Filter, FilterContext, FilterUtil, FocusUtil, FormFieldBaseComponent, GlobalDragDropService, HttpClientBuilder, HttpClientPristine, HttpDataTransfer, HttpDataTransferAggregateComponent, HttpDataTransferComponent, HttpDataTransferIndicatorComponent, HttpDataTransferOverviewComponent, HttpParamsBuilder, I18nBase, I18nPickAsyncPipe, I18nPickPipe, I18nText, IFrameState, IframeCloseDirective, IframeDialogComponent, IframeHostComponent, IframeService, IframeSideContentComponent, IndexedEntities, InternalRestClientConfig, Interval, IsoDurationPipe, IsoIntervalParsePipe, IsoIntervalPipe, ItemActivationEvent, ItemActivationOptions, JsonMapUtil, KafentConfig, KafentEvent, KafentEventService, KafentEventStream, KafentEventStreamDisabled, KafentEventStreamSse, KafentEventTransport, KafentModule, KafentSseEventChannel, KafentTokenProvider, KafentTokenProviderSessionStorage, KafentTopicSse, KnownElderThemes, KnownLocaleTags, LocalListDataSource, LocalPagedDataSource, LocalisationPickerService, MasterDetailActivationEvent, MasterSelectionState, MatTableDataContextBinding, MatTableDataContextBindingBuilder, MultiModelBaseComponent, NextNumberUtil, Objects, OnlineStatus, Page, PageRequest, Pageable, ParseUtil, Path, PathNode, PeriodBucket, PeriodDuration, PeriodFormat, ProcessIterationContext, ProcessState, PropertyPathUtil, Quantity, QueryListBinding, QuestionDialogConfig, ReactiveEventSource, ReactiveMap, RefreshingEntity, RestClient, RestClientConfig, RestClientContinuable, RestClientList, RestClientPaged, SearchQuery, SelectionModel, SelectionModelPopupDirective, Sets, SimpleLocalisationPicker, Sort, SortOption, SortUtil, StandardToastComponent, SubBar, SuggestionProvider, TemplateCompositeControl, TemplatedSelectionDialogComponent, ThemeSpec, TimeAgoPipe, TimeDurationPipe, TimeUtil, ToIsoDateStringPipe, ToastType, TokenChunkRequest, ToolbarHeader, Translated, TranslatedConverter, TranslatedEnumValue, TranslatedText, TypedEventMessage, Unit, UnitDimension, UnitDimensionInfo, UnitInfo, UnitRegistry, UrlBuilder, UrlQueryParams, UuidUtil, ValueAccessorBase, ValueWrapper, ViewProviders, WeightPipe, alphaNumStringComparator, buildFormIntegrationProviders, createDataOptionsProvider, createSelectionModel, existingOrNewElderTableModel, isActivePagedDataContext, isContinuableDataContext, isContinuableDataSource, isDataContext, isDataSource, isDataViewMessageType, isElderEntityValueAccessor, isElderMultiEntityValueAccessor, isListDataSource, isPagedDataSource, lazySample, lazySampleTime, naturalValueComparator, newElderTableModel, proxyControlContainer, registerLocale, runInZone, themeInit };
30341
30675
  //# sourceMappingURL=elderbyte-ngx-starter.mjs.map