@elderbyte/ngx-starter 16.3.4 → 16.4.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 (47) hide show
  1. package/esm2022/lib/common/data/data-context/data-context-active-page.mjs +5 -5
  2. package/esm2022/lib/common/data/data-context/data-context-auto-starter.mjs +2 -2
  3. package/esm2022/lib/common/data/data-context/data-context-base.mjs +58 -28
  4. package/esm2022/lib/common/data/data-context/data-context-continuable-base.mjs +7 -7
  5. package/esm2022/lib/common/data/data-context/data-context-continuable-paged.mjs +10 -10
  6. package/esm2022/lib/common/data/data-context/data-context-continuable-token.mjs +8 -8
  7. package/esm2022/lib/common/data/data-context/data-context-simple.mjs +6 -5
  8. package/esm2022/lib/common/data/data-context/data-context-source-event-binding.mjs +2 -2
  9. package/esm2022/lib/common/data/data-context/data-context.mjs +1 -1
  10. package/esm2022/lib/common/data/filters/filter-context.mjs +12 -26
  11. package/esm2022/lib/common/data/sort-context.mjs +2 -2
  12. package/esm2022/lib/common/utils/filter-util.mjs +19 -1
  13. package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +2 -2
  14. package/esm2022/lib/components/forms/search/domain/context/search-context.mjs +52 -0
  15. package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +42 -0
  16. package/esm2022/lib/components/forms/search/domain/input/search-input-state.mjs +81 -0
  17. package/esm2022/lib/components/forms/search/domain/input/search-input.mjs +2 -0
  18. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +74 -0
  19. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +162 -0
  20. package/esm2022/lib/components/forms/search/domain/url/search-query-params-parser.mjs +81 -0
  21. package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +87 -51
  22. package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +6 -5
  23. package/esm2022/lib/components/forms/search/elder-search.module.mjs +30 -9
  24. package/fesm2022/elderbyte-ngx-starter.mjs +657 -430
  25. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  26. package/lib/common/data/data-context/data-context-base.d.ts +10 -3
  27. package/lib/common/data/data-context/data-context.d.ts +6 -1
  28. package/lib/common/data/filters/filter-context.d.ts +1 -6
  29. package/lib/common/utils/filter-util.d.ts +1 -0
  30. package/lib/components/forms/search/domain/context/search-context.d.ts +37 -0
  31. package/lib/components/forms/search/domain/context/search-context.service.d.ts +25 -0
  32. package/lib/components/forms/search/{elder-search-context-url-binding.directive.d.ts → domain/url/elder-search-url.directive.d.ts} +12 -13
  33. package/lib/components/forms/search/domain/url/elder-search-url.service.d.ts +60 -0
  34. package/lib/components/forms/search/domain/url/search-query-params-parser.d.ts +36 -0
  35. package/lib/components/forms/search/elder-search-context.directive.d.ts +29 -16
  36. package/lib/components/forms/search/elder-search-input.directive.d.ts +2 -2
  37. package/lib/components/forms/search/elder-search.module.d.ts +5 -3
  38. package/package.json +1 -1
  39. package/esm2022/lib/components/forms/search/elder-search-context-url-binding.directive.mjs +0 -71
  40. package/esm2022/lib/components/forms/search/model/search-input-state.mjs +0 -81
  41. package/esm2022/lib/components/forms/search/model/search-input.mjs +0 -2
  42. package/esm2022/lib/components/forms/search/search-box/elder-search-context-filters.mjs +0 -10
  43. package/esm2022/lib/components/forms/search/search-box/elder-search-url-binding.service.mjs +0 -184
  44. package/lib/components/forms/search/search-box/elder-search-context-filters.d.ts +0 -7
  45. package/lib/components/forms/search/search-box/elder-search-url-binding.service.d.ts +0 -74
  46. /package/lib/components/forms/search/{model → domain/input}/search-input-state.d.ts +0 -0
  47. /package/lib/components/forms/search/{model → domain/input}/search-input.d.ts +0 -0
@@ -5,8 +5,8 @@ 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, lastValueFrom, Subject, EMPTY, combineLatest, merge, of, forkJoin, throwError, mergeWith, switchMap as switchMap$1, Observable, zip, mergeMap as mergeMap$1, fromEvent, combineLatestWith as combineLatestWith$1, NEVER } from 'rxjs';
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';
8
+ import { timer, defer, ReplaySubject, concat, finalize, exhaustMap, BehaviorSubject, lastValueFrom, Subject, switchMap, of, combineLatest, EMPTY, merge, forkJoin, throwError, mergeWith, Observable, zip, mergeMap as mergeMap$1, fromEvent, combineLatestWith as combineLatestWith$1, skipUntil, NEVER } from 'rxjs';
9
+ import { tap, takeUntil, takeWhile, map, filter, distinctUntilChanged, debounceTime, catchError, first, take, switchMap as switchMap$1, 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';
12
12
  import { DataSource } from '@angular/cdk/collections';
@@ -20,7 +20,7 @@ import { TranslateModule, TranslateService } from '@ngx-translate/core';
20
20
  import * as i5 from '@angular/material/form-field';
21
21
  import { MatFormFieldControl, MatFormField, MatFormFieldModule } from '@angular/material/form-field';
22
22
  import * as i1$3 from '@angular/router';
23
- import { RouterModule, NavigationEnd, RouterLinkActive } from '@angular/router';
23
+ import { RouterModule, NavigationEnd, RouterLinkActive, convertToParamMap } from '@angular/router';
24
24
  import * as i2$1 from '@elderbyte/ngx-simple-webstorage';
25
25
  import { SimpleWebStorageModule } from '@elderbyte/ngx-simple-webstorage';
26
26
  import * as i4 from '@angular/material/slide-toggle';
@@ -84,7 +84,6 @@ import { MatSidenavModule } from '@angular/material/sidenav';
84
84
  import * as i6 from '@angular/material/datepicker';
85
85
  import { MatDatepicker, MatDatepickerModule } from '@angular/material/datepicker';
86
86
  import localeDECH from '@angular/common/locales/de-CH';
87
- import { BehaviorSubject as BehaviorSubject$1 } from 'rxjs/internal/BehaviorSubject';
88
87
  import { TemplatePortal } from '@angular/cdk/portal';
89
88
  import * as i1$a from '@angular/cdk/overlay';
90
89
  import { OverlayModule } from '@angular/cdk/overlay';
@@ -2530,6 +2529,134 @@ class Filter {
2530
2529
  }
2531
2530
  }
2532
2531
 
2532
+ class FilterUtil {
2533
+ static { this.logger = LoggerFactory.getLogger(FilterUtil.constructor.name); }
2534
+ static equals(aFilters, bFilters) {
2535
+ if (aFilters.length !== bFilters.length) {
2536
+ return false;
2537
+ }
2538
+ if (aFilters.length === 0 && bFilters.length === 0) {
2539
+ return true;
2540
+ }
2541
+ // The both filter arrays have the same length, so we must compare them by value
2542
+ const bIndex = new Map();
2543
+ bFilters.forEach(f => bIndex.set(f.key, f));
2544
+ for (const fa of aFilters) {
2545
+ const bFilter = bIndex.get(fa.key);
2546
+ if (!Filter.equals(bFilter, fa)) {
2547
+ return false;
2548
+ }
2549
+ }
2550
+ return true;
2551
+ }
2552
+ /**
2553
+ * Merge the provided filter sets. The second parameter will
2554
+ * replace filters which exist in the first.
2555
+ * @param filtersA
2556
+ * @param filtersB
2557
+ */
2558
+ static mergeFlat(filtersA, filtersB) {
2559
+ const mergeContext = new FilterContext();
2560
+ mergeContext.updateFilters(filtersA);
2561
+ mergeContext.updateFilters(filtersB);
2562
+ return mergeContext.filtersSnapshot;
2563
+ }
2564
+ /**
2565
+ * Performs a combining merge of the provided filters.
2566
+ * Array based filter values will be combined.
2567
+ * @param filtersA
2568
+ * @param filtersB
2569
+ */
2570
+ static mergeCombine(filtersA, filtersB) {
2571
+ const mergeContext = new FilterContext();
2572
+ mergeContext.updateFilters(filtersA);
2573
+ mergeContext.mergeFilters(filtersB);
2574
+ return mergeContext.filtersSnapshot;
2575
+ }
2576
+ static strip(base, toRemove) {
2577
+ const removeMap = new Map();
2578
+ toRemove.forEach(r => removeMap.set(r.key, r));
2579
+ return base.map(filter => {
2580
+ if (removeMap.has(filter.key)) {
2581
+ const stripped = FilterUtil.stripValue(filter.value, removeMap.get(filter.key).value);
2582
+ if (stripped !== null) {
2583
+ return new Filter(filter.key, stripped);
2584
+ }
2585
+ else {
2586
+ return null;
2587
+ }
2588
+ }
2589
+ else {
2590
+ return filter;
2591
+ }
2592
+ }).filter(f => !!f);
2593
+ }
2594
+ static stripValue(baseValue, removeValue) {
2595
+ if (Array.isArray(baseValue)) {
2596
+ if (Array.isArray(removeValue)) {
2597
+ const filtered = baseValue.filter(b => removeValue.indexOf(b) === -1);
2598
+ if (filtered.length > 0) {
2599
+ return filtered;
2600
+ }
2601
+ }
2602
+ else {
2603
+ const filtered = baseValue.filter(b => b != removeValue);
2604
+ if (filtered.length > 0) {
2605
+ return filtered;
2606
+ }
2607
+ }
2608
+ }
2609
+ return null;
2610
+ }
2611
+ static filterData(data, filters) {
2612
+ FilterUtil.logger.debug('Filtering data with ' + data.length + ' items.', filters);
2613
+ if (filters && filters.length > 0) {
2614
+ for (const filter of filters) {
2615
+ data = data.filter(e => FilterUtil.matches(e, filter));
2616
+ }
2617
+ }
2618
+ return data;
2619
+ }
2620
+ static matches(entity, filter) {
2621
+ if (filter.value === null || filter.value === undefined) {
2622
+ return true;
2623
+ }
2624
+ let value;
2625
+ if (entity === null || entity === undefined) {
2626
+ value = null;
2627
+ }
2628
+ else if (typeof entity === 'object') {
2629
+ value = entity[filter.key];
2630
+ }
2631
+ else {
2632
+ value = String(entity); // Support filtering primitive values
2633
+ }
2634
+ if (Array.isArray(filter.value)) {
2635
+ for (const val of filter.value) {
2636
+ if (FilterUtil.matchesValue(value, val)) {
2637
+ return true;
2638
+ }
2639
+ }
2640
+ return false;
2641
+ }
2642
+ else {
2643
+ return FilterUtil.matchesValue(value, filter.value);
2644
+ }
2645
+ }
2646
+ static matchesValue(haystack, needle) {
2647
+ if (haystack === needle) {
2648
+ return true;
2649
+ }
2650
+ if (haystack === null || haystack === undefined) {
2651
+ return false;
2652
+ }
2653
+ const str = String(haystack);
2654
+ const match = str.toLowerCase().startsWith(needle.toLowerCase());
2655
+ // FilterUtil.logger.debug('Haystack: ' + str + ' starts with needle: ' + needle + ' --> ' + match);
2656
+ return match;
2657
+ }
2658
+ }
2659
+
2533
2660
  class FilterContext {
2534
2661
  constructor() {
2535
2662
  /***************************************************************************
@@ -2538,6 +2665,11 @@ class FilterContext {
2538
2665
  * *
2539
2666
  **************************************************************************/
2540
2667
  this._filters$ = new BehaviorSubject([]);
2668
+ /***************************************************************************
2669
+ * *
2670
+ * Private methods *
2671
+ * *
2672
+ **************************************************************************/
2541
2673
  }
2542
2674
  static empty() {
2543
2675
  return new FilterContext();
@@ -2583,11 +2715,14 @@ class FilterContext {
2583
2715
  * Read API *
2584
2716
  * *
2585
2717
  **************************************************************************/
2718
+ get isEmpty() {
2719
+ return this.filtersSnapshot.length == 0;
2720
+ }
2586
2721
  get filters() {
2587
- return this._filters$.asObservable().pipe(distinctUntilChanged((a, b) => this.equals(a, b)));
2722
+ return this._filters$.asObservable().pipe(distinctUntilChanged((a, b) => FilterUtil.equals(a, b)));
2588
2723
  }
2589
2724
  get filtersSnapshot() {
2590
- return this._filters$.getValue();
2725
+ return [...this._filters$.getValue()];
2591
2726
  }
2592
2727
  findFilterValue(key) {
2593
2728
  const f = this.findFilter(key);
@@ -2652,29 +2787,6 @@ class FilterContext {
2652
2787
  this.updateFilter(Filter.merge(existing, filter));
2653
2788
  }
2654
2789
  }
2655
- /***************************************************************************
2656
- * *
2657
- * Private methods *
2658
- * *
2659
- **************************************************************************/
2660
- equals(aFilters, bFilters) {
2661
- if (aFilters.length !== bFilters.length) {
2662
- return false;
2663
- }
2664
- if (aFilters.length === 0 && bFilters.length === 0) {
2665
- return true;
2666
- }
2667
- // The both filter arrays have the same length, so we must compare them by value
2668
- const bIndex = new Map();
2669
- bFilters.forEach(f => bIndex.set(f.key, f));
2670
- for (const fa of aFilters) {
2671
- const bFilter = bIndex.get(fa.key);
2672
- if (!Filter.equals(bFilter, fa)) {
2673
- return false;
2674
- }
2675
- }
2676
- return true;
2677
- }
2678
2790
  }
2679
2791
 
2680
2792
  class Sort {
@@ -3380,7 +3492,7 @@ class SortContext {
3380
3492
  return this._sorts.asObservable();
3381
3493
  }
3382
3494
  get sortsSnapshot() {
3383
- return this._sorts.getValue();
3495
+ return [...this._sorts.getValue()];
3384
3496
  }
3385
3497
  findSortDirection(prop) {
3386
3498
  const f = this.findSort(prop);
@@ -3431,7 +3543,28 @@ class SortContext {
3431
3543
  }
3432
3544
  }
3433
3545
 
3546
+ class ReloadRequest {
3547
+ constructor(number, reason) {
3548
+ this.number = number;
3549
+ this.reason = reason;
3550
+ }
3551
+ }
3552
+ class AfterReload {
3553
+ constructor(request, result) {
3554
+ this.request = request;
3555
+ this.result = result;
3556
+ }
3557
+ fulfills(minRequest) {
3558
+ return this.request.number >= minRequest.number;
3559
+ }
3560
+ }
3434
3561
  class DataContextBase extends DataSource {
3562
+ /***************************************************************************
3563
+ * *
3564
+ * Fields *
3565
+ * *
3566
+ **************************************************************************/
3567
+ static { this.DC_ID_COUNTER = 0; }
3435
3568
  /***************************************************************************
3436
3569
  * *
3437
3570
  * Constructor *
@@ -3442,11 +3575,6 @@ class DataContextBase extends DataSource {
3442
3575
  this._indexFn = _indexFn;
3443
3576
  this._localApply = _localApply;
3444
3577
  this._localSort = _localSort;
3445
- /***************************************************************************
3446
- * *
3447
- * Fields *
3448
- * *
3449
- **************************************************************************/
3450
3578
  this.baselog = LoggerFactory.getLogger('DataContextBase');
3451
3579
  this._filter = new FilterContext();
3452
3580
  this._sort = new SortContext();
@@ -3455,18 +3583,20 @@ class DataContextBase extends DataSource {
3455
3583
  this._started = new BehaviorSubject(false);
3456
3584
  this._closed = new BehaviorSubject(false);
3457
3585
  this._customIndex = new Map();
3586
+ this._reloadCounter = 0;
3458
3587
  this._reloadQueue = new Subject();
3459
- this.unsubscribe$ = new Subject();
3588
+ this._reloaded = new Subject();
3589
+ this.destroy$ = new Subject();
3590
+ this.id = 'DataContext#' + (++DataContextBase.DC_ID_COUNTER);
3460
3591
  this._dataSource = dataSource;
3461
3592
  this._data = new IndexedEntities(e => dataSource.getId(e), _localSort, this._sort);
3462
3593
  this._loading = this._status.pipe(map(status => status.loading));
3463
- this._filter.filters.pipe(filter(() => this.started), takeUntil(this.unsubscribe$)).subscribe(filters => this.onFiltersChanged(filters));
3464
- this._sort.sorts.pipe(filter(() => this.started), takeUntil(this.unsubscribe$)).subscribe(sorts => this.onSortsChanged(sorts));
3465
- this._reloadQueue.pipe(filter(() => this.started), debounceTime(50), takeUntil(this.unsubscribe$), catchError(err => {
3466
- this.baselog.error('Reload queue detected error, bad!', err);
3467
- return EMPTY;
3468
- })).subscribe(() => this.reloadNow());
3469
- // Maybe skipMap the real requests for auto abort pending (except for continuation / paged)
3594
+ this._filter.filters.pipe(filter(() => this.started), takeUntil(this.destroy$)).subscribe(filters => this.onFiltersChanged(filters));
3595
+ this._sort.sorts.pipe(filter(() => this.started), takeUntil(this.destroy$)).subscribe(sorts => this.onSortsChanged(sorts));
3596
+ this._reloadQueue.pipe(takeUntil(this.destroy$), filter(request => this.started), debounceTime(50), switchMap(request => this.reloadNow(request).pipe(map(result => new AfterReload(request, result)), catchError(err => {
3597
+ this.baselog.error(this.id + ': Reload queue detected error, bad!', err);
3598
+ return of(new AfterReload(request, err));
3599
+ })))).subscribe(afterReload => this._reloaded.next(afterReload));
3470
3600
  }
3471
3601
  /***************************************************************************
3472
3602
  * *
@@ -3545,22 +3675,28 @@ class DataContextBase extends DataSource {
3545
3675
  **************************************************************************/
3546
3676
  start(sorts, filters) {
3547
3677
  if (this.isClosed) {
3548
- throw new Error('Restarting a closed DataContext is not possible!'); // See unsubscribe$
3678
+ throw new Error(this.id + ': Restarting a closed DataContext is not possible!'); // See unsubscribe$
3549
3679
  }
3550
- this.baselog.debug('Starting fresh dataContext ...');
3551
3680
  this.started = false;
3552
3681
  this._sort.replaceSorts(sorts || this.sort.sortsSnapshot);
3553
3682
  this._filter.replaceFilters(filters || this.filter.filtersSnapshot);
3683
+ this.baselog.debug(this.id + ': Start ...', {
3684
+ dataSource: this.dataSource,
3685
+ sort: this._sort.sortsSnapshot,
3686
+ filter: this._filter.filtersSnapshot
3687
+ });
3554
3688
  this.started = true;
3555
- return this.reloadNow();
3689
+ return this.reload('START');
3556
3690
  }
3557
- reload() {
3558
- this.baselog.debug('Requesting a reload of the DataContext from the DataSource.');
3559
- this._reloadQueue.next();
3691
+ reload(reason) {
3692
+ const request = new ReloadRequest(++this._reloadCounter, reason);
3693
+ this.baselog.debug(this.id + ': Enqueuing reload request #' + request.number + ' [' + reason + ']');
3694
+ this._reloadQueue.next(request);
3695
+ return this._reloaded.pipe(filter(reload => reload.fulfills(request)), map(reload => reload.result));
3560
3696
  }
3561
3697
  findByIndex(key) {
3562
3698
  if (!this._indexFn) {
3563
- throw new Error('findByIndex requires you to pass a index function!');
3699
+ throw new Error(this.id + ': findByIndex requires you to pass a index function!');
3564
3700
  }
3565
3701
  return this._customIndex.get(key);
3566
3702
  }
@@ -3572,14 +3708,14 @@ class DataContextBase extends DataSource {
3572
3708
  */
3573
3709
  close() {
3574
3710
  this.started = false;
3575
- this.unsubscribe$.next();
3576
- this.unsubscribe$.complete();
3711
+ this.destroy$.next();
3712
+ this.destroy$.complete();
3577
3713
  this._closed.next(true);
3578
3714
  this._data.destroy();
3579
3715
  this._total.complete();
3580
3716
  this._status.complete();
3581
3717
  this.clearAll();
3582
- this.baselog.debug('DataContext has been closed and resources cleaned up!');
3718
+ this.baselog.debug(this.id + ': Has been closed and resources cleaned up!');
3583
3719
  }
3584
3720
  refresh() {
3585
3721
  this._data.notify();
@@ -3592,7 +3728,13 @@ class DataContextBase extends DataSource {
3592
3728
  * Protected methods *
3593
3729
  * *
3594
3730
  **************************************************************************/
3595
- reloadNow() {
3731
+ reloadNow(request) {
3732
+ this.baselog.debug(this.id + ": reloadNow triggered. Request #" + request.number + ' ' + request.reason, {
3733
+ filter: this._filter.filtersSnapshot,
3734
+ sort: this._sort.sortsSnapshot,
3735
+ dataSource: this.dataSource,
3736
+ request: request
3737
+ });
3596
3738
  return this.reloadInternal(); // TODO This should actually return the real (http) request
3597
3739
  }
3598
3740
  /**
@@ -3690,7 +3832,7 @@ class DataContextBase extends DataSource {
3690
3832
  */
3691
3833
  onSortsChanged(sorts) {
3692
3834
  if (!this._localSort) {
3693
- this.reload();
3835
+ this.reload('Sort Changed');
3694
3836
  }
3695
3837
  else {
3696
3838
  this.setData(this.dataSnapshot, true);
@@ -3700,7 +3842,7 @@ class DataContextBase extends DataSource {
3700
3842
  * Occurs when the filter has changed.
3701
3843
  */
3702
3844
  onFiltersChanged(filters) {
3703
- this.reload();
3845
+ this.reload('Filters Changed');
3704
3846
  }
3705
3847
  onError(err) {
3706
3848
  this.onStatus(DataContextStatus.error(err));
@@ -3762,18 +3904,19 @@ class DataContextSimple extends DataContextBase {
3762
3904
  this.onIdle();
3763
3905
  this.setTotal(list.length);
3764
3906
  this.setData(list);
3765
- this.log.debug('data-context: Got list data: ' + list.length);
3907
+ this.log.debug(this.id + ': Got list data: ' + list.length);
3766
3908
  subject.next();
3767
3909
  }, err => {
3768
3910
  this.onError(err);
3769
3911
  this.clearAll();
3770
- this.log.error('data-context: Failed to query data', err);
3912
+ this.log.error(this.id + ': Failed to query data', err);
3771
3913
  subject.error(err);
3772
3914
  });
3773
3915
  }
3774
3916
  else {
3775
- this.log.warn('data-context: Skipping data context load - no list fetcher present!');
3776
- subject.error(new Error('data-context: Skipping data context load - no list fetcher present!'));
3917
+ const errorMsg = this.id + ': Skipping data context load - no list fetcher present!';
3918
+ this.log.warn(errorMsg);
3919
+ subject.error(new Error(errorMsg));
3777
3920
  }
3778
3921
  return subject.pipe(first());
3779
3922
  }
@@ -3805,16 +3948,16 @@ class DataContextContinuableBase extends DataContextBase {
3805
3948
  * *
3806
3949
  **************************************************************************/
3807
3950
  loadAll(sorts, filters) {
3808
- this.cblogger.debug('Starting to load all data ...');
3951
+ this.cblogger.debug(this.id + ': Starting to load all data ...');
3809
3952
  // load first page
3810
3953
  this.start(sorts, filters)
3811
3954
  .subscribe(() => {
3812
- this.cblogger.debug('First page has been loaded. Loading remaining data ...');
3955
+ this.cblogger.debug(this.id + ': First page has been loaded. Loading remaining data ...');
3813
3956
  // load rest in a recursive manner
3814
3957
  this.loadAllRec();
3815
3958
  }, err => {
3816
3959
  this.onError(err);
3817
- this.cblogger.error('Failed to load first page of load all procedure!', err);
3960
+ this.cblogger.error(this.id + ': Failed to load first page of load all procedure!', err);
3818
3961
  });
3819
3962
  }
3820
3963
  get chunkSize() {
@@ -3835,13 +3978,13 @@ class DataContextContinuableBase extends DataContextBase {
3835
3978
  loadAllRec() {
3836
3979
  this.loadMore()
3837
3980
  .subscribe(() => {
3838
- this.cblogger.debug('Loading data chunk finished, loading next...');
3981
+ this.cblogger.debug(this.id + ': Loading data chunk finished, loading next...');
3839
3982
  this.loadAllRec();
3840
3983
  }, err => {
3841
3984
  this.onError(err);
3842
- this.cblogger.error('Loading all failed!', err);
3985
+ this.cblogger.error(this.id + ': Loading all failed!', err);
3843
3986
  }, () => {
3844
- this.cblogger.info('All data loaded completely.');
3987
+ this.cblogger.info(this.id + ': All data loaded completely.');
3845
3988
  });
3846
3989
  }
3847
3990
  }
@@ -3866,7 +4009,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3866
4009
  this.logger = LoggerFactory.getLogger(this.constructor.name);
3867
4010
  this._pageCache = new Map();
3868
4011
  this._latestPage = 0;
3869
- this._hasMoreData = combineLatest([this.total, this.data]).pipe(map(([total, data]) => this.checkHasMoreData(total, data)), takeUntil(this.unsubscribe$));
4012
+ this._hasMoreData = combineLatest([this.total, this.data]).pipe(map(([total, data]) => this.checkHasMoreData(total, data)), takeUntil(this.destroy$));
3870
4013
  }
3871
4014
  /***************************************************************************
3872
4015
  * *
@@ -3888,7 +4031,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3888
4031
  */
3889
4032
  loadMore() {
3890
4033
  if (this.hasMoreDataSnapshot) {
3891
- this.logger.info('Loading more...' + this._latestPage);
4034
+ this.logger.info(this.id + ': Loading more...' + this._latestPage);
3892
4035
  if (this.loadingSnapshot) {
3893
4036
  return EMPTY;
3894
4037
  }
@@ -3896,7 +4039,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3896
4039
  return this.fetchPage(nextPage, this.chunkSize);
3897
4040
  }
3898
4041
  else {
3899
- this.logger.debug('Cannot load more data, since no more data available.');
4042
+ this.logger.debug(this.id + ': Cannot load more data, since no more data available.');
3900
4043
  return EMPTY;
3901
4044
  }
3902
4045
  }
@@ -3918,7 +4061,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3918
4061
  return false;
3919
4062
  }
3920
4063
  onChunkSizeChanged(newSize) {
3921
- this.reload();
4064
+ this.reload('ChunkSizeChanged');
3922
4065
  }
3923
4066
  reloadInternal() {
3924
4067
  // Since continuable data-contexts are appending data,
@@ -3936,16 +4079,16 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3936
4079
  const pageRequest = new Pageable(pageIndex, pageSize, this.sort.sortsSnapshot);
3937
4080
  if (this._pageCache.has(pageIndex)) {
3938
4081
  // Page already loaded - skipping request!
3939
- this.logger.trace('Skipping fetching page since its already in page observable cache.');
4082
+ this.logger.trace(this.id + ': Skipping fetching page since its already in page observable cache.');
3940
4083
  subject.next();
3941
4084
  }
3942
4085
  else {
3943
4086
  this.onLoading();
3944
- this.logger.debug(`Loading page ${pageIndex} using pageable:`, pageRequest);
4087
+ this.logger.debug(this.id + `: Loading page ${pageIndex} using pageable:`, pageRequest);
3945
4088
  const pageObs = this.dataSource.findAllPaged(pageRequest, this.filter.filtersSnapshot);
3946
4089
  this._pageCache.set(pageIndex, pageObs);
3947
4090
  pageObs.subscribe((page) => {
3948
- this.logger.debug('Got page data:', page);
4091
+ this.logger.debug(this.id + ': Got page data:', page);
3949
4092
  this.populatePageData(page, clear);
3950
4093
  if (this._latestPage < page.number) {
3951
4094
  this._latestPage = page.number; // TODO This might cause that pages are skipped
@@ -3956,7 +4099,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3956
4099
  this.onError(err);
3957
4100
  this.clearData();
3958
4101
  this.setTotal(0);
3959
- this.logger.error('Failed to query data', err);
4102
+ this.logger.error(this.id + ': Failed to query data', err);
3960
4103
  subject.error(err);
3961
4104
  });
3962
4105
  }
@@ -3978,7 +4121,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3978
4121
  }
3979
4122
  catch (err) {
3980
4123
  this.onError(err);
3981
- this.logger.error('Failed to populate data with page', page, err);
4124
+ this.logger.error(this.id + ': Failed to populate data with page', page, err);
3982
4125
  }
3983
4126
  }
3984
4127
  }
@@ -4022,7 +4165,7 @@ class DataContextContinuableToken extends DataContextContinuableBase {
4022
4165
  }
4023
4166
  loadMore() {
4024
4167
  if (this.loadingSnapshot) {
4025
- this.logger.debug('Skipping load-more since already loading a chunk!');
4168
+ this.logger.debug(this.id + ': Skipping load-more since already loading a chunk!');
4026
4169
  return EMPTY;
4027
4170
  }
4028
4171
  const token = this._expectedChunkToken;
@@ -4030,7 +4173,7 @@ class DataContextContinuableToken extends DataContextContinuableBase {
4030
4173
  return this.fetchNextChunk(token);
4031
4174
  }
4032
4175
  else {
4033
- this.logger.debug('Cannot load more data, since no more data available.');
4176
+ this.logger.debug(this.id + ': Cannot load more data, since no more data available.');
4034
4177
  return EMPTY;
4035
4178
  }
4036
4179
  }
@@ -4055,7 +4198,7 @@ class DataContextContinuableToken extends DataContextContinuableBase {
4055
4198
  const subject = new Subject();
4056
4199
  nextToken = nextToken ? nextToken : undefined;
4057
4200
  if (this._chunkCache.has(nextToken)) {
4058
- this.logger.debug('Skipping fetching chunk for token "' + nextToken + '" since its already in observable cache.');
4201
+ this.logger.debug(this.id + ': Skipping fetching chunk for token "' + nextToken + '" since its already in observable cache.');
4059
4202
  subject.complete();
4060
4203
  }
4061
4204
  else {
@@ -4064,7 +4207,7 @@ class DataContextContinuableToken extends DataContextContinuableBase {
4064
4207
  this.dataSource.findAllContinuable(new TokenChunkRequest(nextToken, this.filter.filtersSnapshot, this.sort.sortsSnapshot))
4065
4208
  .pipe(first())
4066
4209
  .subscribe(chunk => {
4067
- this.logger.debug('Got next chunk data:', chunk);
4210
+ this.logger.debug(this.id + ': Got next chunk data:', chunk);
4068
4211
  this._hasMoreData.next(chunk.hasMore);
4069
4212
  this.chunkSize = chunk.chunkSize;
4070
4213
  this.populateChunkData(chunk);
@@ -4072,7 +4215,7 @@ class DataContextContinuableToken extends DataContextContinuableBase {
4072
4215
  this.onIdle();
4073
4216
  }, err => {
4074
4217
  this.onError(err);
4075
- this.logger.error('Failed to query data', err);
4218
+ this.logger.error(this.id + ': Failed to query data', err);
4076
4219
  this.clearData();
4077
4220
  this.setTotal(0);
4078
4221
  subject.error(err);
@@ -4097,12 +4240,12 @@ class DataContextContinuableToken extends DataContextContinuableBase {
4097
4240
  }
4098
4241
  catch (err) {
4099
4242
  this.onError(err);
4100
- this.logger.error('Failed to populate data with chunk', chunk, err);
4243
+ this.logger.error(this.id + ': Failed to populate data with chunk', chunk, err);
4101
4244
  }
4102
4245
  this._expectedChunkToken = chunk.nextContinuationToken;
4103
4246
  }
4104
4247
  else {
4105
- this.logger.warn('Discarding continuable chunk (items: ' + chunk.content.length + ', token: ' + chunk.continuationToken + ' )' +
4248
+ this.logger.warn(this.id + ': Discarding continuable chunk (items: ' + chunk.content.length + ', token: ' + chunk.continuationToken + ' )' +
4106
4249
  ' as it does not match the expected contiunation-token: ' + this._expectedChunkToken);
4107
4250
  }
4108
4251
  }
@@ -4160,9 +4303,9 @@ class DataContextActivePage extends DataContextBase {
4160
4303
  * Sets the current page index / size and reload.
4161
4304
  */
4162
4305
  setActivePage(request) {
4163
- this.actlogger.trace('Setting page to ', request);
4306
+ // this.actlogger.trace('Setting page to ', request);
4164
4307
  if (!request) {
4165
- throw new Error('Setting page PageRequest must not be null!');
4308
+ throw new Error(this.id + ': Setting page PageRequest must not be null!');
4166
4309
  }
4167
4310
  let hasChange = false;
4168
4311
  const page = this.pageSnapshot;
@@ -4174,7 +4317,7 @@ class DataContextActivePage extends DataContextBase {
4174
4317
  }
4175
4318
  if (hasChange) {
4176
4319
  this._page.next(request);
4177
- this.reload();
4320
+ this.reload('setActivePage');
4178
4321
  }
4179
4322
  }
4180
4323
  close() {
@@ -4210,7 +4353,7 @@ class DataContextActivePage extends DataContextBase {
4210
4353
  this.onIdle();
4211
4354
  }, err => {
4212
4355
  this.clearData();
4213
- this.actlogger.error('Failed to query data', err);
4356
+ this.actlogger.error(this.id + ': Failed to query data', err);
4214
4357
  subject.error(err);
4215
4358
  this.onError(err);
4216
4359
  }, () => {
@@ -4307,7 +4450,7 @@ class MatTableDataContextBinding {
4307
4450
  }
4308
4451
  }
4309
4452
  bindDataContextToMatSortsUntil(matSorts$, destroy$) {
4310
- const dcSorts$ = this._dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.sort.sorts));
4453
+ const dcSorts$ = this._dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.sort.sorts));
4311
4454
  combineLatest([dcSorts$, matSorts$]).pipe(takeUntil(destroy$)).subscribe(([dcSorts, matSorts]) => {
4312
4455
  if (dcSorts.length >= 1) {
4313
4456
  // At least one sort active
@@ -4350,7 +4493,7 @@ class MatTableDataContextBinding {
4350
4493
  });
4351
4494
  }
4352
4495
  bindPaginatorUntil(paginator$, destroy$) {
4353
- const pageRequest$ = paginator$.pipe(filter(paginator => !!paginator), switchMap(paginator => paginator.page), map(pageEvent => new PageRequest(pageEvent.pageIndex, pageEvent.pageSize)));
4496
+ const pageRequest$ = paginator$.pipe(filter(paginator => !!paginator), switchMap$1(paginator => paginator.page), map(pageEvent => new PageRequest(pageEvent.pageIndex, pageEvent.pageSize)));
4354
4497
  combineLatest([this._dataContext$, pageRequest$]).pipe(takeUntil(destroy$)).subscribe(([dc, pageRequest]) => {
4355
4498
  if (dc) {
4356
4499
  if (isActivePagedDataContext(dc)) {
@@ -4543,7 +4686,7 @@ class DataContextAutoStarter extends DataContextLifeCycleBinding {
4543
4686
  return new RequiredFilterEvaluator(this._dataContext.filter, this._autoStartSpec.requiredFilters).context$.pipe(map(event => event.isValid));
4544
4687
  }
4545
4688
  startDataContext() {
4546
- this.logger.debug('Auto starting data context...');
4689
+ this.logger.debug(this._dataContext.id + ': Auto starting ...');
4547
4690
  this._dataContext.start(this._autoStartSpec.initialSort);
4548
4691
  }
4549
4692
  }
@@ -4580,7 +4723,7 @@ class DataContextSourceEventBinding extends DataContextLifeCycleBinding {
4580
4723
  **************************************************************************/
4581
4724
  handleDataChangeEvent(event) {
4582
4725
  if (this.reloadOnChanges && this.isReloadDesirable(event)) {
4583
- this._dataContext.reload();
4726
+ this._dataContext.reload('DataSourceChangeEvent');
4584
4727
  return;
4585
4728
  }
4586
4729
  // We might also be able to perform deletions locally, and avoid reload data
@@ -5047,116 +5190,6 @@ class DelegateContinuableDataSource extends DelegateDataSource {
5047
5190
  }
5048
5191
  }
5049
5192
 
5050
- class FilterUtil {
5051
- static { this.logger = LoggerFactory.getLogger(FilterUtil.constructor.name); }
5052
- /**
5053
- * Merge the provided filter sets. The second parameter will
5054
- * replace filters which exist in the first.
5055
- * @param filtersA
5056
- * @param filtersB
5057
- */
5058
- static mergeFlat(filtersA, filtersB) {
5059
- const mergeContext = new FilterContext();
5060
- mergeContext.updateFilters(filtersA);
5061
- mergeContext.updateFilters(filtersB);
5062
- return mergeContext.filtersSnapshot;
5063
- }
5064
- /**
5065
- * Performs a combining merge of the provided filters.
5066
- * Array based filter values will be combined.
5067
- * @param filtersA
5068
- * @param filtersB
5069
- */
5070
- static mergeCombine(filtersA, filtersB) {
5071
- const mergeContext = new FilterContext();
5072
- mergeContext.updateFilters(filtersA);
5073
- mergeContext.mergeFilters(filtersB);
5074
- return mergeContext.filtersSnapshot;
5075
- }
5076
- static strip(base, toRemove) {
5077
- const removeMap = new Map();
5078
- toRemove.forEach(r => removeMap.set(r.key, r));
5079
- return base.map(filter => {
5080
- if (removeMap.has(filter.key)) {
5081
- const stripped = FilterUtil.stripValue(filter.value, removeMap.get(filter.key).value);
5082
- if (stripped !== null) {
5083
- return new Filter(filter.key, stripped);
5084
- }
5085
- else {
5086
- return null;
5087
- }
5088
- }
5089
- else {
5090
- return filter;
5091
- }
5092
- }).filter(f => !!f);
5093
- }
5094
- static stripValue(baseValue, removeValue) {
5095
- if (Array.isArray(baseValue)) {
5096
- if (Array.isArray(removeValue)) {
5097
- const filtered = baseValue.filter(b => removeValue.indexOf(b) === -1);
5098
- if (filtered.length > 0) {
5099
- return filtered;
5100
- }
5101
- }
5102
- else {
5103
- const filtered = baseValue.filter(b => b != removeValue);
5104
- if (filtered.length > 0) {
5105
- return filtered;
5106
- }
5107
- }
5108
- }
5109
- return null;
5110
- }
5111
- static filterData(data, filters) {
5112
- FilterUtil.logger.debug('Filtering data with ' + data.length + ' items.', filters);
5113
- if (filters && filters.length > 0) {
5114
- for (const filter of filters) {
5115
- data = data.filter(e => FilterUtil.matches(e, filter));
5116
- }
5117
- }
5118
- return data;
5119
- }
5120
- static matches(entity, filter) {
5121
- if (filter.value === null || filter.value === undefined) {
5122
- return true;
5123
- }
5124
- let value;
5125
- if (entity === null || entity === undefined) {
5126
- value = null;
5127
- }
5128
- else if (typeof entity === 'object') {
5129
- value = entity[filter.key];
5130
- }
5131
- else {
5132
- value = String(entity); // Support filtering primitive values
5133
- }
5134
- if (Array.isArray(filter.value)) {
5135
- for (const val of filter.value) {
5136
- if (FilterUtil.matchesValue(value, val)) {
5137
- return true;
5138
- }
5139
- }
5140
- return false;
5141
- }
5142
- else {
5143
- return FilterUtil.matchesValue(value, filter.value);
5144
- }
5145
- }
5146
- static matchesValue(haystack, needle) {
5147
- if (haystack === needle) {
5148
- return true;
5149
- }
5150
- if (haystack === null || haystack === undefined) {
5151
- return false;
5152
- }
5153
- const str = String(haystack);
5154
- const match = str.toLowerCase().startsWith(needle.toLowerCase());
5155
- // FilterUtil.logger.debug('Haystack: ' + str + ' starts with needle: ' + needle + ' --> ' + match);
5156
- return match;
5157
- }
5158
- }
5159
-
5160
5193
  /**
5161
5194
  * Provides the ability to build a IDataContext<T>.
5162
5195
  */
@@ -5537,7 +5570,7 @@ class DataSourceProcessor {
5537
5570
  * @param sorts to sort the data source
5538
5571
  */
5539
5572
  process$(processFn, filters, sorts) {
5540
- return this._process$.pipe(takeWhile(ctx => this.notCompleted(ctx)), switchMap(ctx => this.loadNext(ctx, filters, sorts)), tap(updatedCtx => {
5573
+ return this._process$.pipe(takeWhile(ctx => this.notCompleted(ctx)), switchMap$1(ctx => this.loadNext(ctx, filters, sorts)), tap(updatedCtx => {
5541
5574
  processFn(updatedCtx.items);
5542
5575
  this._process$.next(updatedCtx);
5543
5576
  }));
@@ -6613,7 +6646,7 @@ class ElderFromFieldBase {
6613
6646
  this._logger = LoggerFactory.getLogger(this.constructor.name);
6614
6647
  this.formFieldControl$ = new BehaviorSubject(null);
6615
6648
  this._controlActionQueue = [];
6616
- this._value$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), switchMap$1(ctrl => this.controlValue$(ctrl)));
6649
+ this._value$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), switchMap(ctrl => this.controlValue$(ctrl)));
6617
6650
  }
6618
6651
  /***************************************************************************
6619
6652
  * *
@@ -6695,8 +6728,8 @@ class ElderFromFieldEntityBase extends ElderFromFieldBase {
6695
6728
  constructor() {
6696
6729
  super();
6697
6730
  this._entityAccessor$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), filter(ctrl => isElderEntityValueAccessor(ctrl)), map(ctrl => ctrl));
6698
- this._entityId$ = this._entityAccessor$.pipe(switchMap$1(evac => ElderEntityValueAccessorUtil.entityId$(evac)));
6699
- this._entity$ = this._entityAccessor$.pipe(switchMap$1(evac => ElderEntityValueAccessorUtil.entity$(evac)));
6731
+ this._entityId$ = this._entityAccessor$.pipe(switchMap(evac => ElderEntityValueAccessorUtil.entityId$(evac)));
6732
+ this._entity$ = this._entityAccessor$.pipe(switchMap(evac => ElderEntityValueAccessorUtil.entity$(evac)));
6700
6733
  }
6701
6734
  /***************************************************************************
6702
6735
  * *
@@ -6728,10 +6761,10 @@ class ElderFromFieldMultiEntityBase extends ElderFromFieldBase {
6728
6761
  constructor() {
6729
6762
  super();
6730
6763
  this._entitiesAccessor$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), filter(ctrl => isElderMultiEntityValueAccessor(ctrl)), map(ctrl => ctrl));
6731
- this._entityIds$ = this._entitiesAccessor$.pipe(switchMap$1(evac => ElderMultiEntityValueAccessorUtil.entityIds$(evac)));
6732
- this._entities$ = this._entitiesAccessor$.pipe(switchMap$1(evac => ElderMultiEntityValueAccessorUtil.entities$(evac)));
6733
- this._entitiesUpdated$ = this._entitiesAccessor$.pipe(switchMap$1(evac => evac.entitiesUpdated));
6734
- this._entityIdsUpdated$ = this._entitiesAccessor$.pipe(switchMap$1(evac => evac.entityIdsUpdated));
6764
+ this._entityIds$ = this._entitiesAccessor$.pipe(switchMap(evac => ElderMultiEntityValueAccessorUtil.entityIds$(evac)));
6765
+ this._entities$ = this._entitiesAccessor$.pipe(switchMap(evac => ElderMultiEntityValueAccessorUtil.entities$(evac)));
6766
+ this._entitiesUpdated$ = this._entitiesAccessor$.pipe(switchMap(evac => evac.entitiesUpdated));
6767
+ this._entityIdsUpdated$ = this._entitiesAccessor$.pipe(switchMap(evac => evac.entityIdsUpdated));
6735
6768
  }
6736
6769
  /***************************************************************************
6737
6770
  * *
@@ -8557,7 +8590,7 @@ class RefreshingEntity {
8557
8590
  if (this.dataSource) {
8558
8591
  this.entityId = this.dataSource.getId(entity);
8559
8592
  }
8560
- this._refreshing$ = this.current$.pipe(takeWhile(e => this.keepRefreshing(e)), delay(this.interval), switchMap(e => this.refresh(e)), tap(refreshed => this.current$.next(refreshed)), startWith(this.current$.getValue()), share() // Prevent multiple refreshes for each subscriber
8593
+ this._refreshing$ = this.current$.pipe(takeWhile(e => this.keepRefreshing(e)), delay(this.interval), switchMap$1(e => this.refresh(e)), tap(refreshed => this.current$.next(refreshed)), startWith(this.current$.getValue()), share() // Prevent multiple refreshes for each subscriber
8561
8594
  );
8562
8595
  }
8563
8596
  /***************************************************************************
@@ -9420,7 +9453,7 @@ class ElderLabelInputComponent extends FormFieldBaseComponent {
9420
9453
  }
9421
9454
  set suggestionLoader(provider) {
9422
9455
  if (provider) {
9423
- this.availableSuggestions$ = this.labelInputControl.valueChanges.pipe(startWith(null), debounceTime(150), switchMap((value) => provider.loadSuggestions(value)), map(labels => this.filterNotPresent(labels)));
9456
+ this.availableSuggestions$ = this.labelInputControl.valueChanges.pipe(startWith(null), debounceTime(150), switchMap$1((value) => provider.loadSuggestions(value)), map(labels => this.filterNotPresent(labels)));
9424
9457
  }
9425
9458
  else {
9426
9459
  this.logger.debug('Cant provide suggestions since no suggestion provider was registered!');
@@ -12631,7 +12664,7 @@ class ElderDialogService {
12631
12664
  const rawMessages = new Map();
12632
12665
  rawMessages.set('title', config.title);
12633
12666
  rawMessages.set('message', config.message);
12634
- return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap(messages => {
12667
+ return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap$1(messages => {
12635
12668
  const title = messages.get('title');
12636
12669
  const message = messages.get('message');
12637
12670
  let dialogRef;
@@ -12654,7 +12687,7 @@ class ElderDialogService {
12654
12687
  const rawMessages = new Map();
12655
12688
  rawMessages.set('title', config.title);
12656
12689
  rawMessages.set('question', config.question);
12657
- return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap(messages => {
12690
+ return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap$1(messages => {
12658
12691
  const title = messages.get('title');
12659
12692
  const question = messages.get('question');
12660
12693
  const dlgConf = this.matDialogConfig(config);
@@ -12709,7 +12742,7 @@ class ElderDialogService {
12709
12742
  **************************************************************************/
12710
12743
  resolveTranslatedMap(messages, interpolateParams) {
12711
12744
  const rawMessages = Array.from(messages.values());
12712
- return this.translateInterpolatedParams(interpolateParams).pipe(switchMap(translatedParams => this.translateService.get(rawMessages, translatedParams)), map(translatedValues => {
12745
+ return this.translateInterpolatedParams(interpolateParams).pipe(switchMap$1(translatedParams => this.translateService.get(rawMessages, translatedParams)), map(translatedValues => {
12713
12746
  const translated = new Map();
12714
12747
  messages.forEach((rawValue, key) => {
12715
12748
  translated.set(key, translatedValues[rawValue] || rawValue);
@@ -13077,7 +13110,7 @@ class DataContextSelectionDirective {
13077
13110
  * *
13078
13111
  **************************************************************************/
13079
13112
  buildSelectionState$(selectionModel$, dataContext$) {
13080
- return combineLatest([selectionModel$, dataContext$]).pipe(filter(([model, dc]) => !!model && !!dc), switchMap(([model, dc]) => this.buildSelectionStateInner$(model, dc)));
13113
+ return combineLatest([selectionModel$, dataContext$]).pipe(filter(([model, dc]) => !!model && !!dc), switchMap$1(([model, dc]) => this.buildSelectionStateInner$(model, dc)));
13081
13114
  }
13082
13115
  buildSelectionStateInner$(model, dc) {
13083
13116
  return combineLatest([model.selection, dc.data]).pipe(map(([selection, currentData]) => {
@@ -13581,7 +13614,7 @@ class ElderTableRowDirective {
13581
13614
  this._activated = false;
13582
13615
  this._activationDir$ = new BehaviorSubject(null);
13583
13616
  this.focused$ = new BehaviorSubject(false);
13584
- this._activationDir$.pipe(filter(x => x !== null), switchMap$1(provider => provider.activeItemEventChange), filter(e => e.item == this.model), filter(e => e.focus)).subscribe({
13617
+ this._activationDir$.pipe(filter(x => x !== null), switchMap(provider => provider.activeItemEventChange), filter(e => e.item == this.model), filter(e => e.focus)).subscribe({
13585
13618
  next: focusMe => {
13586
13619
  this.focus();
13587
13620
  }
@@ -14621,7 +14654,7 @@ class ElderTableComponent extends ElderDataViewBaseComponent {
14621
14654
  return (index, entity) => this.getId(entity);
14622
14655
  }
14623
14656
  isDataValid(data) {
14624
- return data.length > 0;
14657
+ return data?.length > 0;
14625
14658
  }
14626
14659
  /***************************************************************************
14627
14660
  * *
@@ -16481,7 +16514,7 @@ class ElderTableActivationDirective {
16481
16514
  **************************************************************************/
16482
16515
  ngAfterViewInit() {
16483
16516
  const rows$ = this.elderTable.rows$;
16484
- const data$ = this.elderTable.dataContext$.pipe(switchMap(dc => dc.data), tap(data => this._data = data));
16517
+ const data$ = this.elderTable.dataContext$.pipe(switchMap$1(dc => dc.data), tap(data => this._data = data));
16485
16518
  +combineLatest([rows$, data$]).pipe(takeUntil(this.destroy$)).subscribe(([rows, data]) => {
16486
16519
  this.rows$.next(this.rowDataUpdated(rows, data));
16487
16520
  this.handleAutoActivations();
@@ -16489,7 +16522,7 @@ class ElderTableActivationDirective {
16489
16522
  combineLatest([this.rows$, this.activeItem$]).pipe(takeUntil(this.destroy$)).subscribe(([rows, activeItem]) => {
16490
16523
  this.updateRowsActivation(rows, activeItem);
16491
16524
  });
16492
- this.elderTable.dataContext$.pipe(takeUntil(this.destroy$), map(dc => dc.dataSource), switchMap(ds => ds.dataChanged), filter(event => event.deletedIds?.length > 0)).subscribe({
16525
+ this.elderTable.dataContext$.pipe(takeUntil(this.destroy$), map(dc => dc.dataSource), switchMap$1(ds => ds.dataChanged), filter(event => event.deletedIds?.length > 0)).subscribe({
16493
16526
  next: deleteEvent => {
16494
16527
  deleteEvent.deletedIds.forEach(id => this.deactivateById(id));
16495
16528
  }
@@ -17126,7 +17159,7 @@ class ElderGridComponent extends ElderDataViewBaseComponent {
17126
17159
  ? this.responsiveColumn()
17127
17160
  : this._columnCount);
17128
17161
  this.dataRows$ = combineLatest([
17129
- this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.data)),
17162
+ this.dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.data)),
17130
17163
  columnCount$
17131
17164
  ]).pipe(debounceTime(50), map(([data, columns]) => this.groupForColumns(data, columns)));
17132
17165
  }
@@ -18906,7 +18939,7 @@ class SelectionModelPopupDirective {
18906
18939
  // view container is outside the invoking control, which
18907
18940
  // happens when using ng-content projection.
18908
18941
  this.changeDetectorRef.markForCheck();
18909
- return dialogRef.afterClosed().pipe(switchMap((chosenEntities) => {
18942
+ return dialogRef.afterClosed().pipe(switchMap$1((chosenEntities) => {
18910
18943
  if (chosenEntities) {
18911
18944
  return this._transformerFn
18912
18945
  ? of(chosenEntities.map(value => this._transformerFn(value)))
@@ -19053,7 +19086,7 @@ class ElderSelectBase extends ElderFormFieldControlBase {
19053
19086
  this.currentClicked = new EventEmitter();
19054
19087
  this.state$ = new BehaviorSubject(ElderSelectComponentState.idle());
19055
19088
  this.mergedState$ = combineLatest([
19056
- this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.status)),
19089
+ this.dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.status)),
19057
19090
  this.state$
19058
19091
  ]).pipe(map(([dcState, state]) => {
19059
19092
  if (dcState.idle) {
@@ -19276,7 +19309,7 @@ class ElderSelectFirstUtil {
19276
19309
  const dataContextFirstItem = suggestionsDc?.isStarted
19277
19310
  ? this.firstItemInDataContextSoon(suggestionsDc)
19278
19311
  : of(null);
19279
- dataContextFirstItem.pipe(takeUntil(elderSelect.valueChange.pipe(filter(value => !!value))), switchMap(firstItem => firstItem ? of(firstItem) : this.firstSuggestionItem(elderSelect))).subscribe(firstItem => {
19312
+ dataContextFirstItem.pipe(takeUntil(elderSelect.valueChange.pipe(filter(value => !!value))), switchMap$1(firstItem => firstItem ? of(firstItem) : this.firstSuggestionItem(elderSelect))).subscribe(firstItem => {
19280
19313
  if (firstItem && !elderSelect.entityId) {
19281
19314
  elderSelect.updateValueByEntity(firstItem);
19282
19315
  }
@@ -19357,8 +19390,8 @@ class ElderAutocompleteComponent {
19357
19390
  this.triggerReload$ = new Subject();
19358
19391
  this.displayPropertyResolver$ = new BehaviorSubject((value) => this.propertyStringValue(value, null));
19359
19392
  this.optionSelected = new Subject();
19360
- this.dataState$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.status), runInZone(this.zone));
19361
- this.availableSuggestions$ = this.dataContext$.pipe(switchMap(dc => dc ? dc.data : of([])), runInZone(this.zone));
19393
+ this.dataState$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.status), runInZone(this.zone));
19394
+ this.availableSuggestions$ = this.dataContext$.pipe(switchMap$1(dc => dc ? dc.data : of([])), runInZone(this.zone));
19362
19395
  }
19363
19396
  /***************************************************************************
19364
19397
  * *
@@ -19767,7 +19800,7 @@ class ElderSelectComponent extends ElderSelectBase {
19767
19800
  this.entityChange = this._entity$.pipe(skip(1) // Skip the initial or current value
19768
19801
  );
19769
19802
  this.entityIdUpdated = this.valueUpdated.pipe(map(value => this.entityIdFromValue(value)));
19770
- this.entityUpdated = this.entityIdUpdated.pipe(switchMap(entityId => this.awaitEntityWithId(entityId, this.timeoutAfterMs)), catchError(err => {
19803
+ this.entityUpdated = this.entityIdUpdated.pipe(switchMap$1(entityId => this.awaitEntityWithId(entityId, this.timeoutAfterMs)), catchError(err => {
19771
19804
  this.logger.warn(`awaitEntityWithId -> timed out after: ${this.timeoutAfterMs}`, err);
19772
19805
  return EMPTY;
19773
19806
  }));
@@ -21306,7 +21339,7 @@ class ElderMultiSelectBase extends ElderSelectBase {
21306
21339
  this.entitiesChange = this._entities$.pipe(skip(1) // Skip the initial or current value
21307
21340
  );
21308
21341
  this.entityIdsUpdated = this.valueUpdated.pipe(map(values => this.entityIdsFromValues(values)));
21309
- this.entitiesUpdated = this.entityIdsUpdated.pipe(tap(entityIds => this.logger.debug('Awaiting entities with ids', entityIds)), switchMap(entityIds => this.awaitEntitiesWithId(entityIds, this.timeoutAfterMs)), catchError(err => {
21342
+ this.entitiesUpdated = this.entityIdsUpdated.pipe(tap(entityIds => this.logger.debug('Awaiting entities with ids', entityIds)), switchMap$1(entityIds => this.awaitEntitiesWithId(entityIds, this.timeoutAfterMs)), catchError(err => {
21310
21343
  this.logger.warn(`awaitEntitiesWithId -> timed out after: ${this.timeoutAfterMs}`, err);
21311
21344
  return EMPTY;
21312
21345
  }));
@@ -22178,7 +22211,7 @@ class ElderMultiSelectChipOptionsComponent extends ElderMultiSelectBase {
22178
22211
  disabled: disabled
22179
22212
  };
22180
22213
  }));
22181
- const available$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.data));
22214
+ const available$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.data));
22182
22215
  this.selectChips$ = combineLatest([
22183
22216
  this.entities$,
22184
22217
  this.entityIds$,
@@ -22861,7 +22894,7 @@ class ElderNavLinkComponent {
22861
22894
  * *
22862
22895
  **************************************************************************/
22863
22896
  ngOnInit() {
22864
- this._routerLinkActive$.pipe(takeUntil(this.destroy$), filter(rla => !!rla), switchMap$1(rla => {
22897
+ this._routerLinkActive$.pipe(takeUntil(this.destroy$), filter(rla => !!rla), switchMap(rla => {
22865
22898
  return rla.isActiveChange.pipe(startWith(rla.isActive));
22866
22899
  })).subscribe(active => this._active$.next(active));
22867
22900
  this.navList.valueChange.pipe(takeUntil(this.destroy$), map(value => this.isCurrentValueActive)).subscribe(active => this._active$.next(active));
@@ -25718,7 +25751,7 @@ class LocalisationPickerService {
25718
25751
  return this.languageService.currentLanguage$.pipe(map(current => this.pick(choices, current)));
25719
25752
  }
25720
25753
  pickCurrentRx(choices$) {
25721
- return choices$.pipe(switchMap(choices => this.pickCurrent(choices)));
25754
+ return choices$.pipe(switchMap$1(choices => this.pickCurrent(choices)));
25722
25755
  }
25723
25756
  /***************************************************************************
25724
25757
  * *
@@ -25783,7 +25816,7 @@ class ElderLocalizedInputComponent extends FormFieldBaseComponent {
25783
25816
  this.inputText$ = combineLatest([
25784
25817
  this.value$,
25785
25818
  this.textColumns$
25786
- ]).pipe(switchMap(([values, columns]) => this.toInputText(values, columns)));
25819
+ ]).pipe(switchMap$1(([values, columns]) => this.toInputText(values, columns)));
25787
25820
  this.hintText$ = this.value$.pipe(map(values => this.toHintText(values)));
25788
25821
  this.translatedValueChange = this.valueChange.pipe(map(localized => TranslatedConverter.toTranslatedText(localized)));
25789
25822
  }
@@ -25884,9 +25917,98 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25884
25917
  type: Input
25885
25918
  }] } });
25886
25919
 
25920
+ class SearchContext {
25921
+ static standalone() {
25922
+ return new SearchContext(null);
25923
+ }
25924
+ /***************************************************************************
25925
+ * *
25926
+ * Constructor *
25927
+ * *
25928
+ **************************************************************************/
25929
+ constructor(id) {
25930
+ /***************************************************************************
25931
+ * *
25932
+ * Fields *
25933
+ * *
25934
+ **************************************************************************/
25935
+ this.log = LoggerFactory.getLogger(this.constructor.name);
25936
+ this.userFilterContext = new FilterContext();
25937
+ this.forcedFilterContext = new FilterContext();
25938
+ this.id = id;
25939
+ this._allFilters$ = this.userFilterContext.filters.pipe(combineLatestWith(this.forcedFilterContext.filters), skip(1), map(([userFilters, forcedFilters]) => FilterUtil.mergeCombine(userFilters, forcedFilters)), tap(x => this.log.debug('allFilters changed: ', x)));
25940
+ }
25941
+ /***************************************************************************
25942
+ * *
25943
+ * Properties *
25944
+ * *
25945
+ **************************************************************************/
25946
+ get allFiltersChanged() {
25947
+ return this._allFilters$;
25948
+ }
25949
+ get userFilters() {
25950
+ return this.userFilterContext;
25951
+ }
25952
+ get forcedFilters() {
25953
+ return this.forcedFilterContext;
25954
+ }
25955
+ /***************************************************************************
25956
+ * *
25957
+ * Public API *
25958
+ * *
25959
+ **************************************************************************/
25960
+ updateUserFilters(filters) {
25961
+ this.userFilterContext.updateFilters(filters);
25962
+ }
25963
+ replaceUserFilters(filters) {
25964
+ this.userFilterContext.replaceFilters(filters);
25965
+ }
25966
+ }
25967
+
25968
+ class SearchContextService {
25969
+ /***************************************************************************
25970
+ * *
25971
+ * Constructor *
25972
+ * *
25973
+ **************************************************************************/
25974
+ constructor() {
25975
+ /***************************************************************************
25976
+ * *
25977
+ * Fields *
25978
+ * *
25979
+ **************************************************************************/
25980
+ this.log = LoggerFactory.getLogger(this.constructor.name);
25981
+ this.searchContexts = new Map();
25982
+ }
25983
+ /***************************************************************************
25984
+ * *
25985
+ * Public API *
25986
+ * *
25987
+ **************************************************************************/
25988
+ context(contextId) {
25989
+ let ctx = this.searchContexts.get(contextId);
25990
+ if (!ctx) {
25991
+ ctx = new SearchContext(contextId);
25992
+ this.searchContexts.set(contextId, ctx);
25993
+ }
25994
+ return ctx;
25995
+ }
25996
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
25997
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchContextService, providedIn: 'root' }); }
25998
+ }
25999
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchContextService, decorators: [{
26000
+ type: Injectable,
26001
+ args: [{
26002
+ providedIn: 'root'
26003
+ }]
26004
+ }], ctorParameters: function () { return []; } });
26005
+
25887
26006
  /**
25888
- * The search container manages a group of search-inputs
25889
- * and holds their values in a central search model.
26007
+ * The SearchContextDirective binds a group of search-inputs
26008
+ * to a SearchContext with a two-way binding.
26009
+ *
26010
+ * It also binds the SearchContext to a FilterContext (DataContext).
26011
+ * TODO Maybe separate this??
25890
26012
  */
25891
26013
  class ElderSearchContextDirective {
25892
26014
  /***************************************************************************
@@ -25894,50 +26016,35 @@ class ElderSearchContextDirective {
25894
26016
  * Constructor *
25895
26017
  * *
25896
26018
  **************************************************************************/
25897
- constructor() {
26019
+ constructor(searchContextService) {
25898
26020
  /***************************************************************************
25899
26021
  * *
25900
26022
  * Fields *
25901
26023
  * *
25902
26024
  **************************************************************************/
25903
- this._forcedFilters$ = new BehaviorSubject$1([]);
25904
26025
  this.log = LoggerFactory.getLogger(this.constructor.name);
25905
- this.destroy$ = new Subject$1();
25906
- this._searchInputs$ = new BehaviorSubject$1([]);
25907
- this._searchStates$ = new BehaviorSubject$1([]);
25908
- this._filterContext$ = new BehaviorSubject$1(null);
25909
- this.userFilters$ = this._filterContext$.pipe(switchMap(ctx => ctx.filters), combineLatestWith(this._forcedFilters$), map(([allFilters, forcedFilters]) => {
25910
- return FilterUtil.strip(allFilters, forcedFilters);
25911
- }));
26026
+ this.destroy$ = new Subject();
26027
+ this._searchInputs$ = new BehaviorSubject([]);
26028
+ this._searchStates$ = new BehaviorSubject([]);
26029
+ this._filterContext$ = new BehaviorSubject(null);
26030
+ this._searchContext$ = new BehaviorSubject(SearchContext.standalone());
26031
+ this.searchContextId$ = new BehaviorSubject(null);
26032
+ this.searchContextId$.pipe(takeUntil(this.destroy$), filter(contextId => !!contextId), map(contextId => searchContextService.context(contextId))).subscribe(ctx => this._searchContext$.next(ctx));
25912
26033
  }
25913
26034
  /***************************************************************************
25914
26035
  * *
25915
26036
  * Life Cycle *
25916
26037
  * *
25917
26038
  **************************************************************************/
25918
- ngAfterContentInit() {
25919
- this._searchInputs$.pipe(takeUntil(this.destroy$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), combineLatestWith(this._forcedFilters$), debounceTime(5)).subscribe(([states, forcedFilters]) => {
25920
- this._searchStates$.next(states);
25921
- const userFilters = this.convertToFilters(states);
25922
- this.applyFilters(userFilters, forcedFilters);
25923
- });
26039
+ ngOnInit() {
26040
+ this.applyDefaultFiltersToSearchContext();
26041
+ this.syncSearchContextToBoundFilterContext();
25924
26042
  }
25925
- applyFilters(userFilters, forcedFilters) {
25926
- const context = this.filterContext;
25927
- if (context) {
25928
- context.updateFilters(userFilters);
25929
- context.mergeFilters(forcedFilters);
25930
- this.log.trace("Search-Model filters updated:", Array.from(context.filtersSnapshot));
25931
- }
25932
- else {
25933
- this.log.warn("Failed to apply filters since no FilterContext is available!", {
25934
- userFilters: userFilters,
25935
- forcedFilters: forcedFilters
25936
- });
25937
- }
26043
+ ngAfterContentInit() {
26044
+ this.syncSearchInputsToSearchContext();
25938
26045
  }
25939
26046
  ngAfterViewInit() {
25940
- this.applyModelToInputs();
26047
+ this.applySearchContextToInputs();
25941
26048
  }
25942
26049
  ngOnDestroy() {
25943
26050
  this.destroy$.next();
@@ -25948,15 +26055,27 @@ class ElderSearchContextDirective {
25948
26055
  * Properties *
25949
26056
  * *
25950
26057
  **************************************************************************/
26058
+ set searchContextId(contextId) {
26059
+ this.searchContextId$.next(contextId);
26060
+ }
26061
+ get searchContextId() {
26062
+ return this.searchContextId$.getValue();
26063
+ }
26064
+ get searchContext$() {
26065
+ return this._searchContext$.asObservable();
26066
+ }
26067
+ get searchContext() {
26068
+ return this._searchContext$.getValue();
26069
+ }
25951
26070
  set filterContext(value) {
25952
26071
  let context;
25953
26072
  if (value) {
25954
- if (typeof value !== "string") {
26073
+ if (typeof value !== 'string') {
25955
26074
  context = value;
25956
26075
  }
25957
26076
  else {
25958
- this.log.warn("Illegal value provided for property filterContext: ", JSON.stringify(value));
25959
- throw new Error("Illegal value provided for property filterContext! " + value);
26077
+ this.log.warn('Illegal value provided for property filterContext: ', JSON.stringify(value));
26078
+ throw new Error('Illegal value provided for property filterContext! ' + value);
25960
26079
  }
25961
26080
  }
25962
26081
  else {
@@ -25974,10 +26093,10 @@ class ElderSearchContextDirective {
25974
26093
  * to also keep the users intent (by merging) them.
25975
26094
  */
25976
26095
  set forcedFilters(filters) {
25977
- this._forcedFilters$.next(filters);
26096
+ this.searchContext.forcedFilters.replaceFilters(filters);
25978
26097
  }
25979
26098
  get forcedFilters() {
25980
- return this._forcedFilters$.getValue();
26099
+ return this.searchContext.forcedFilters.filtersSnapshot;
25981
26100
  }
25982
26101
  get attributes() {
25983
26102
  return this._searchInputs$.asObservable();
@@ -26006,7 +26125,7 @@ class ElderSearchContextDirective {
26006
26125
  * Register a new search name in this container
26007
26126
  */
26008
26127
  register(searchInput) {
26009
- this.log.debug("Registering search input [" + searchInput.name + "]");
26128
+ this.log.debug('Registering search input [' + searchInput.name + ']');
26010
26129
  const current = this._searchInputs$.getValue();
26011
26130
  this._searchInputs$.next([...current, searchInput]);
26012
26131
  }
@@ -26022,8 +26141,43 @@ class ElderSearchContextDirective {
26022
26141
  * Private *
26023
26142
  * *
26024
26143
  **************************************************************************/
26025
- applyModelToInputs() {
26026
- this.applyFiltersToInputs(this.filterContext.filtersSnapshot);
26144
+ applyDefaultFiltersToSearchContext() {
26145
+ const dcFilters = this.filterContext;
26146
+ const searchContext = this.searchContext;
26147
+ if (searchContext.userFilters.isEmpty) {
26148
+ if (!dcFilters.isEmpty) {
26149
+ searchContext.updateUserFilters(dcFilters.filtersSnapshot);
26150
+ }
26151
+ }
26152
+ else {
26153
+ dcFilters.replaceFilters(searchContext.userFilters.filtersSnapshot);
26154
+ }
26155
+ }
26156
+ syncSearchInputsToSearchContext() {
26157
+ const inputFilters$ = this._searchInputs$.pipe(switchMap$1(inputs => combineLatest(inputs.map(i => i.state$))), debounceTime(5), tap(states => this._searchStates$.next(states)), map(states => this.convertToFilters(states)));
26158
+ inputFilters$
26159
+ .pipe(takeUntil(this.destroy$), combineLatestWith(this._searchContext$))
26160
+ .subscribe(([inputFilters, searchContext]) => {
26161
+ searchContext.updateUserFilters(inputFilters);
26162
+ });
26163
+ }
26164
+ syncSearchContextToBoundFilterContext() {
26165
+ this._searchContext$.pipe(takeUntil(this.destroy$), switchMap$1(context => context.allFiltersChanged)).subscribe(allFilters => this.applyToBoundFilterContext(allFilters));
26166
+ }
26167
+ applyToBoundFilterContext(filters) {
26168
+ const filterCtx = this.filterContext;
26169
+ if (filterCtx) {
26170
+ filterCtx.replaceFilters(filters);
26171
+ this.log.debug('Applied Filters of SearchContext ' + this.searchContextId + ' to DataContext FilterContext.', filters);
26172
+ }
26173
+ else {
26174
+ this.log.warn('Failed to apply filters since no FilterContext is available!', filters);
26175
+ }
26176
+ }
26177
+ applySearchContextToInputs() {
26178
+ const ctx = this.searchContext;
26179
+ this.applyFiltersToInputs(ctx.userFilters.filtersSnapshot // this.filterContext.filtersSnapshot (old)
26180
+ );
26027
26181
  }
26028
26182
  applyFiltersToInputs(filters) {
26029
26183
  this.log.warn('applyFiltersToInputs', filters);
@@ -26047,18 +26201,20 @@ class ElderSearchContextDirective {
26047
26201
  .filter(s => !!s.queryKey)
26048
26202
  .map(s => new Filter(s.queryKey, s.queryValue));
26049
26203
  }
26050
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
26051
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, exportAs: ["elderSearchContext"], ngImport: i0 }); }
26204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, deps: [{ token: SearchContextService }], target: i0.ɵɵFactoryTarget.Directive }); }
26205
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { searchContextId: "searchContextId", filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, exportAs: ["elderSearchContext"], ngImport: i0 }); }
26052
26206
  }
26053
26207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
26054
26208
  type: Directive,
26055
26209
  args: [{
26056
- selector: "[elderSearchContext]",
26057
- exportAs: "elderSearchContext"
26210
+ selector: '[elderSearchContext]',
26211
+ exportAs: 'elderSearchContext'
26058
26212
  }]
26059
- }], ctorParameters: function () { return []; }, propDecorators: { filterContext: [{
26213
+ }], ctorParameters: function () { return [{ type: SearchContextService }]; }, propDecorators: { searchContextId: [{
26214
+ type: Input
26215
+ }], filterContext: [{
26060
26216
  type: Input,
26061
- args: ["elderSearchContext"]
26217
+ args: ['elderSearchContext']
26062
26218
  }], forcedFilters: [{
26063
26219
  type: Input
26064
26220
  }] } });
@@ -26262,7 +26418,8 @@ class ElderSearchInputDirective {
26262
26418
  ngAfterViewInit() {
26263
26419
  this._extractedName = this.extractName();
26264
26420
  this.log.debug(this._extractedName + "|" + this.queryKey + "|" + this.resolvePath);
26265
- this.stateObservable().subscribe(state => {
26421
+ const viewStabilized$ = of('stabilized$').pipe(delay(20), first());
26422
+ this.stateObservable().pipe(skipUntil(viewStabilized$)).subscribe(state => {
26266
26423
  this.emitState(state);
26267
26424
  });
26268
26425
  }
@@ -26906,147 +27063,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
26906
27063
  }]
26907
27064
  }] });
26908
27065
 
26909
- class ElderSearchContextFilters {
26910
- static empty(searchContextId) {
26911
- return new ElderSearchContextFilters(searchContextId, new Map());
26912
- }
26913
- constructor(searchContextId, filters) {
26914
- this.searchContextId = searchContextId;
26915
- this.filters = filters;
26916
- }
26917
- }
26918
-
26919
- class ElderSearchUrlBindingService {
27066
+ class SearchQueryParamsParser {
26920
27067
  /***************************************************************************
26921
27068
  * *
26922
27069
  * Constructor *
26923
27070
  * *
26924
27071
  **************************************************************************/
26925
- constructor(router, route) {
26926
- this.router = router;
26927
- this.route = route;
26928
- //A search param has following structure: q-[searchContextId]-[filterId]=[value]
26929
- //Example: search-browser1-hasStarted=true
27072
+ constructor(queryPrefix) {
26930
27073
  /***************************************************************************
26931
27074
  * *
26932
27075
  * Fields *
26933
27076
  * *
26934
27077
  **************************************************************************/
26935
27078
  this.log = LoggerFactory.getLogger(this.constructor.name);
26936
- this._searchMap$ = new BehaviorSubject$1({
26937
- value: new Map(),
26938
- emit: true
26939
- });
26940
- this._initialSearchMap$ = new BehaviorSubject$1(new Map());
26941
- this.searchParamPrefix = "q";
26942
- this.unsubscribe$ = new Subject();
26943
- this.router.events.pipe(first()).subscribe(() => {
26944
- this.handleSearchParameters(this.route.snapshot.queryParams);
26945
- });
26946
- this._searchMap$.pipe(filter(searchMapUpdate => searchMapUpdate.emit), takeUntil(this.unsubscribe$)).subscribe(searchMapUpdate => {
26947
- this.log.warn("SET URL");
26948
- const searchMap = searchMapUpdate.value;
26949
- const resetParams = this.resetSearchParams();
26950
- const queryParams = { ...resetParams, ...this.buildQueryParams(searchMap) };
26951
- this.log.warn("searchMap :", searchMap);
26952
- this.log.warn("queryParams :", queryParams);
26953
- this.router.navigate([], {
26954
- queryParams: queryParams,
26955
- replaceUrl: true,
26956
- queryParamsHandling: "merge"
26957
- });
26958
- });
26959
- this.router.events.subscribe((event) => this.log.warn("Type: " + event.constructor?.name, event));
26960
- }
26961
- /***************************************************************************
26962
- * *
26963
- * Life Cycle *
26964
- * *
26965
- **************************************************************************/
26966
- ngOnDestroy() {
26967
- this.unsubscribe$.next();
26968
- this.unsubscribe$.complete();
26969
- }
26970
- /***************************************************************************
26971
- * *
26972
- * Properties *
26973
- * *
26974
- **************************************************************************/
26975
- get initialSearchMap$() {
26976
- return this._initialSearchMap$;
27079
+ this.queryPrefix = queryPrefix;
26977
27080
  }
26978
27081
  /***************************************************************************
26979
27082
  * *
26980
27083
  * Public API *
26981
27084
  * *
26982
27085
  **************************************************************************/
26983
- updateFiltersForContext(searchContextId, filters) {
26984
- const searchMapUpdate = this._searchMap$.getValue();
26985
- const searchMap = searchMapUpdate.value;
26986
- const filtersMap = new Map(filters
26987
- .filter(filter => filter.value != null)
26988
- .map(filter => {
26989
- return [filter.key, filter];
26990
- }));
26991
- searchMap.set(searchContextId, new ElderSearchContextFilters(searchContextId, filtersMap));
26992
- this._searchMap$.next({ value: searchMap, emit: true });
26993
- }
26994
- resetFilterForContext(contextId) {
26995
- const searchMapUpdate = this._searchMap$.getValue();
26996
- const searchMap = searchMapUpdate.value;
26997
- if (searchMap.has(contextId)) {
26998
- searchMap.delete(contextId);
26999
- this._searchMap$.next({ value: searchMap, emit: false });
27000
- }
27086
+ parse(params) {
27087
+ const paramMap = convertToParamMap(params);
27088
+ const searchParamKeys = this.extractSearchParameters(paramMap);
27089
+ return this.buildSearchContextMap(paramMap, searchParamKeys);
27001
27090
  }
27002
27091
  /***************************************************************************
27003
27092
  * *
27004
27093
  * Private methods *
27005
27094
  * *
27006
27095
  **************************************************************************/
27007
- handleSearchParameters(params) {
27008
- const searchParamKeys = this.extractSearchParameters(params);
27009
- const searchMap = this.buildSearchContextMap(params, searchParamKeys);
27010
- this._searchMap$.next({ value: searchMap, emit: true });
27011
- this._initialSearchMap$.next(searchMap);
27012
- }
27013
- extractSearchParameters(params) {
27014
- return Object.getOwnPropertyNames(params).filter(param => param.startsWith(this.searchParamPrefix + "-"));
27096
+ extractSearchParameters(paramMap) {
27097
+ return paramMap.keys.filter(param => param.startsWith(this.queryPrefix + '-'));
27015
27098
  }
27016
- buildSearchContextMap(params, searchParamKeys) {
27017
- const searchMap = new Map();
27099
+ buildSearchContextMap(paramMap, searchParamKeys) {
27100
+ const filtersByContextId = new Map();
27018
27101
  for (const key of searchParamKeys) {
27019
- const filterValue = params[key];
27102
+ const filterValues = paramMap.getAll(key);
27103
+ const filterValue = filterValues[0]; // TODO Support multiple values
27020
27104
  const filterParamData = this.extractFilterParam(key, filterValue);
27021
27105
  const filter = this.convertFilterStringToFilter(filterValue, filterParamData);
27022
- this.checkAndSetFilter(searchMap, filterParamData, filter);
27106
+ this.checkAndSetFilter(filtersByContextId, filterParamData.searchContextId, filter);
27023
27107
  }
27024
- return searchMap;
27108
+ return filtersByContextId;
27025
27109
  }
27026
- checkAndSetFilter(searchMap, filterParamData, filter) {
27027
- if (searchMap.has(filterParamData.searchContextId)) {
27028
- this.setFilter(searchMap, filterParamData, filter);
27029
- }
27030
- else {
27031
- searchMap.set(filterParamData.searchContextId, ElderSearchContextFilters.empty(filterParamData.searchContextId));
27032
- this.setFilter(searchMap, filterParamData, filter);
27110
+ checkAndSetFilter(filtersByContextId, searchContextId, filter) {
27111
+ let filtersInContext = filtersByContextId.get(searchContextId);
27112
+ if (!filtersInContext) {
27113
+ filtersInContext = [];
27114
+ filtersByContextId.set(searchContextId, filtersInContext);
27033
27115
  }
27034
- }
27035
- setFilter(searchMap, filterParamData, filter) {
27036
- const searchContext = searchMap.get(filterParamData.searchContextId);
27037
- searchContext.filters.set(filterParamData.filterId, filter);
27116
+ filtersInContext.push(filter);
27038
27117
  }
27039
27118
  extractFilterParam(key, filterValue) {
27040
- const splitParams = key.split("-");
27119
+ const splitParams = key.split('-');
27041
27120
  return {
27042
27121
  searchContextId: splitParams[1],
27043
27122
  filterId: splitParams[2],
27044
27123
  isArray: this.checkIfParamIsArray(filterValue)
27045
27124
  };
27046
27125
  }
27047
- checkIfParamIsArray(filterValue) {
27048
- return filterValue.startsWith("(") && filterValue.endsWith(")");
27049
- }
27050
27126
  convertFilterStringToFilter(paramValue, filterParamData) {
27051
27127
  let value = paramValue;
27052
27128
  if (this.isSingularArrayValue(value, filterParamData)) {
@@ -27058,59 +27134,189 @@ class ElderSearchUrlBindingService {
27058
27134
  return !Array.isArray(value) && filterParamData.isArray;
27059
27135
  }
27060
27136
  convertValueToArray(value) {
27061
- return value.slice(1).slice(0, -1).split(",");
27137
+ return value.slice(1).slice(0, -1).split(',');
27138
+ }
27139
+ checkIfParamIsArray(filterValue) {
27140
+ return filterValue.startsWith('(') && filterValue.endsWith(')');
27141
+ }
27142
+ }
27143
+
27144
+ class UrlFilterByContext {
27145
+ constructor(urlFiltersByContext) {
27146
+ this.byContext = urlFiltersByContext ?? new Map();
27147
+ }
27148
+ filtersOf(contextId) {
27149
+ return this.byContext.get(contextId);
27150
+ }
27151
+ static empty() {
27152
+ return new UrlFilterByContext();
27153
+ }
27154
+ withUrlFilters(current) {
27155
+ const copy = new Map(this.byContext);
27156
+ current
27157
+ .forEach((v, k) => copy.set(k, new UrlFilters(v)));
27158
+ return new UrlFilterByContext(copy);
27159
+ }
27160
+ }
27161
+ class UrlFilters {
27162
+ constructor(filters) {
27163
+ this.consumed = false;
27164
+ this.filters = [...filters];
27062
27165
  }
27063
- resetSearchParams() {
27064
- let params = { ...this.route.snapshot.queryParams };
27065
- const searchParams = this.extractSearchParameters(params);
27066
- for (const searchParam of searchParams) {
27067
- params[searchParam] = null;
27166
+ consumeFilters() {
27167
+ this.consumed = true;
27168
+ return this.filters;
27169
+ }
27170
+ }
27171
+ class ElderSearchUrlService {
27172
+ /***************************************************************************
27173
+ * *
27174
+ * Constructor *
27175
+ * *
27176
+ **************************************************************************/
27177
+ constructor(router) {
27178
+ this.router = router;
27179
+ /***************************************************************************
27180
+ * *
27181
+ * Fields *
27182
+ * *
27183
+ **************************************************************************/
27184
+ this.log = LoggerFactory.getLogger(this.constructor.name);
27185
+ this.SEARCH_QUERY_KEY = 'q';
27186
+ this.paramsParser = new SearchQueryParamsParser(this.SEARCH_QUERY_KEY);
27187
+ this.urlFiltersByContext$ = new BehaviorSubject(UrlFilterByContext.empty());
27188
+ }
27189
+ /***************************************************************************
27190
+ * *
27191
+ * Public API *
27192
+ * *
27193
+ **************************************************************************/
27194
+ init() {
27195
+ // this.logRouterEvents();
27196
+ this.router.events.pipe(filter(event => event.type === 1 /* EventType.NavigationEnd */), map(event => this.extractUrlFilters(this.router.routerState.snapshot))).subscribe(currentContextFilters => this.updateSeenUrlFilters(currentContextFilters));
27197
+ }
27198
+ urlFiltersOfContext$(contextId) {
27199
+ if (!contextId) {
27200
+ throw new Error('Illegal contextId Argument: ' + contextId);
27201
+ }
27202
+ return this.urlFiltersByContext$.pipe(map(byContext => byContext.filtersOf(contextId)), filter(filters => !!filters));
27203
+ }
27204
+ updateQueryParams(contextId, filters) {
27205
+ if (!contextId)
27206
+ throw new Error('Illegal searchContextId Argument: ' + contextId);
27207
+ if (!filters)
27208
+ throw new Error('Illegal filters Argument: ' + contextId);
27209
+ filters = filters.filter(f => f.value !== null && f.value !== undefined);
27210
+ const currentUrlAll = this.extractUrlFilters(this.router.routerState.snapshot);
27211
+ const currentUrl = currentUrlAll.get(contextId) ?? [];
27212
+ if (!FilterUtil.equals(filters, currentUrl)) {
27213
+ const resetParams = this.resetSearchParams(contextId, currentUrl);
27214
+ const queryParams = { ...resetParams, ...this.buildQueryParams(contextId, filters) };
27215
+ this.log.info('writeUrlQueryParams: ' + contextId, {
27216
+ searchMap: filters,
27217
+ queryParams: queryParams
27218
+ });
27219
+ this.router.navigate([], {
27220
+ queryParams: queryParams,
27221
+ replaceUrl: true,
27222
+ queryParamsHandling: 'merge'
27223
+ });
27224
+ }
27225
+ else {
27226
+ // this.log.info('writeUrlQueryParams PREVENTED')
27227
+ }
27228
+ }
27229
+ /***************************************************************************
27230
+ * *
27231
+ * Private methods *
27232
+ * *
27233
+ **************************************************************************/
27234
+ updateSeenUrlFilters(current) {
27235
+ if (current.size > 0) {
27236
+ const filtersByContext = this.urlFiltersByContext$.getValue();
27237
+ const newUrlFilters = filtersByContext.withUrlFilters(current);
27238
+ this.log.info('updateSeenUrlFilters:', newUrlFilters);
27239
+ this.urlFiltersByContext$.next(newUrlFilters);
27240
+ }
27241
+ }
27242
+ logRouterEvents() {
27243
+ this.router.events.pipe(map(e => e)).subscribe(e => this.log.debug('ROUTER-EVENT [' + (e.constructor.name) + ']#' + e.id + ': ' + e.url));
27244
+ }
27245
+ parseUrlFilters(params) {
27246
+ return this.paramsParser.parse(params);
27247
+ }
27248
+ collectAllRouteParams(routerState) {
27249
+ return this.collectRouteQueryParams(routerState.root);
27250
+ }
27251
+ collectRouteQueryParams(root) {
27252
+ let params = {};
27253
+ let stack = [root];
27254
+ while (stack.length > 0) {
27255
+ const route = stack.pop();
27256
+ params = { ...params, ...route.queryParams };
27257
+ stack.push(...route.children);
27068
27258
  }
27069
27259
  return params;
27070
27260
  }
27071
- buildQueryParams(searchMap) {
27261
+ extractUrlFilters(routerState) {
27262
+ const params = this.collectAllRouteParams(routerState);
27263
+ return this.parseUrlFilters(params);
27264
+ }
27265
+ resetSearchParams(searchContextId, urlFiltersOf) {
27266
+ if (urlFiltersOf && urlFiltersOf.length > 0) {
27267
+ const params = {};
27268
+ urlFiltersOf.forEach(toRemove => {
27269
+ params[this.queryParamKey(searchContextId, toRemove)] = null;
27270
+ });
27271
+ return params;
27272
+ }
27273
+ return {};
27274
+ }
27275
+ buildQueryParams(searchContextId, filters) {
27072
27276
  const params = {};
27073
- for (const searchContextId of searchMap.keys()) {
27074
- const filters = searchMap.get(searchContextId).filters;
27075
- for (const filter of filters.values()) {
27076
- params[`${this.searchParamPrefix}-${searchContextId}-${filter.key}`] = this.convertValueToArrayOrSingleValue(filter.value);
27077
- }
27277
+ for (const filter of filters) {
27278
+ params[this.queryParamKey(searchContextId, filter)] = this.convertValueToArrayOrSingleValue(filter.value);
27078
27279
  }
27079
27280
  return params;
27080
27281
  }
27282
+ queryParamKey(searchContextId, filter) {
27283
+ return `${this.SEARCH_QUERY_KEY}-${searchContextId}-${filter.key}`;
27284
+ }
27081
27285
  convertValueToArrayOrSingleValue(value) {
27082
27286
  return Array.isArray(value) ? `(${value.toString()})` : value;
27083
27287
  }
27084
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlBindingService, deps: [{ token: i1$3.Router }, { token: i1$3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable }); }
27085
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlBindingService, providedIn: "root" }); }
27288
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, deps: [{ token: i1$3.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
27289
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, providedIn: 'root' }); }
27086
27290
  }
27087
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlBindingService, decorators: [{
27291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, decorators: [{
27088
27292
  type: Injectable,
27089
27293
  args: [{
27090
- providedIn: "root"
27294
+ providedIn: 'root'
27091
27295
  }]
27092
- }], ctorParameters: function () { return [{ type: i1$3.Router }, { type: i1$3.ActivatedRoute }]; } });
27296
+ }], ctorParameters: function () { return [{ type: i1$3.Router }]; } });
27093
27297
 
27094
27298
  /**
27095
27299
  * The search container manages a group of search-inputs
27096
27300
  * and holds their values in a central search model.
27097
27301
  */
27098
- class ElderSearchContextUrlBindingDirective {
27302
+ class ElderSearchUrlDirective {
27099
27303
  /***************************************************************************
27100
27304
  * *
27101
27305
  * Constructor *
27102
27306
  * *
27103
27307
  **************************************************************************/
27104
- constructor(searchContext, urlBindingService) {
27105
- this.searchContext = searchContext;
27106
- this.urlBindingService = urlBindingService;
27308
+ constructor(searchContextDirective, searchUrlService) {
27309
+ this.searchUrlService = searchUrlService;
27107
27310
  /***************************************************************************
27108
27311
  * *
27109
27312
  * Fields *
27110
27313
  * *
27111
27314
  **************************************************************************/
27112
27315
  this.log = LoggerFactory.getLogger(this.constructor.name);
27113
- this.destroy$ = new Subject$1();
27316
+ this.destroy$ = new Subject();
27317
+ this.searchContextId = searchContextDirective.searchContextId;
27318
+ this.searchContext$ = searchContextDirective.searchContext$;
27319
+ this.searchContext$.pipe(combineLatestWith(this.searchUrlService.urlFiltersOfContext$(this.searchContextId))).subscribe(([context, urlFilters]) => this.applyUrlFilters(context, urlFilters));
27114
27320
  }
27115
27321
  /***************************************************************************
27116
27322
  * *
@@ -27118,47 +27324,53 @@ class ElderSearchContextUrlBindingDirective {
27118
27324
  * *
27119
27325
  **************************************************************************/
27120
27326
  ngAfterViewInit() {
27121
- if (this._urlBinding) {
27122
- this.urlBindingService.initialSearchMap$.pipe(first(), takeUntil(this.destroy$), filter(searchMap => searchMap.has(this._urlBinding)), map(searchMap => searchMap.get(this._urlBinding)), map(filterMap => Array.from(filterMap.filters.values()))).subscribe(filters => {
27123
- this.searchContext.filterContext.updateFilters(filters);
27124
- this.searchContext.applyModelToInputs();
27125
- });
27126
- this.searchContext.userFilters$.pipe(takeUntil(this.destroy$)).subscribe(filters => this.urlBindingService.updateFiltersForContext(this._urlBinding, filters));
27327
+ if (this.searchContextId) {
27328
+ this.searchContext$.pipe(takeUntil(this.destroy$), switchMap(searchContext => searchContext.userFilters.filters)).subscribe(userFilters =>
27329
+ // this.urlBindingService.updateFiltersForContext(this.searchContextId, userFilters)
27330
+ this.searchUrlService.updateQueryParams(this.searchContextId, userFilters));
27127
27331
  }
27128
27332
  }
27129
27333
  ngOnDestroy() {
27130
- this.urlBindingService.resetFilterForContext(this._urlBinding);
27131
27334
  this.destroy$.next();
27132
27335
  this.destroy$.complete();
27133
27336
  }
27134
27337
  /***************************************************************************
27135
27338
  * *
27136
- * Properties *
27339
+ * Private methods *
27137
27340
  * *
27138
27341
  **************************************************************************/
27139
- set elderSearchContextUrlBinding(value) {
27140
- this._urlBinding = value;
27141
- }
27142
- get elderSearchContextUrlBinding() {
27143
- return this._urlBinding;
27342
+ applyUrlFilters(context, urlFilters) {
27343
+ if (!urlFilters.consumed) {
27344
+ const consumedFilters = urlFilters.consumeFilters();
27345
+ if (consumedFilters.length > 0) {
27346
+ this.log.info('URL SEARCH BINDING Replacing Filters: ', {
27347
+ context: context,
27348
+ urlFilters: consumedFilters
27349
+ });
27350
+ context.replaceUserFilters(consumedFilters);
27351
+ }
27352
+ }
27144
27353
  }
27145
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextUrlBindingDirective, deps: [{ token: ElderSearchContextDirective }, { token: ElderSearchUrlBindingService }], target: i0.ɵɵFactoryTarget.Directive }); }
27146
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchContextUrlBindingDirective, selector: "[elderSearchContextUrlBinding]", inputs: { elderSearchContextUrlBinding: "elderSearchContextUrlBinding" }, exportAs: ["elderSearchContextUrlBinding"], ngImport: i0 }); }
27354
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlDirective, deps: [{ token: ElderSearchContextDirective }, { token: ElderSearchUrlService }], target: i0.ɵɵFactoryTarget.Directive }); }
27355
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchUrlDirective, selector: "[elderSearchUrl]", exportAs: ["elderSearchUrl"], ngImport: i0 }); }
27147
27356
  }
27148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextUrlBindingDirective, decorators: [{
27357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlDirective, decorators: [{
27149
27358
  type: Directive,
27150
27359
  args: [{
27151
- selector: "[elderSearchContextUrlBinding]",
27152
- exportAs: "elderSearchContextUrlBinding"
27360
+ selector: '[elderSearchUrl]',
27361
+ exportAs: 'elderSearchUrl'
27153
27362
  }]
27154
- }], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type: ElderSearchUrlBindingService }]; }, propDecorators: { elderSearchContextUrlBinding: [{
27155
- type: Input
27156
- }] } });
27363
+ }], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type: ElderSearchUrlService }]; } });
27157
27364
 
27365
+ // Because of AOT Compiler
27366
+ function initSearchUrlService(searchUrlService) {
27367
+ // Hack to use Lambda here!
27368
+ return () => { searchUrlService.init(); };
27369
+ }
27158
27370
  class ElderSearchModule {
27159
27371
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27160
27372
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, declarations: [ElderSearchContextDirective,
27161
- ElderSearchContextUrlBindingDirective,
27373
+ ElderSearchUrlDirective,
27162
27374
  ElderSearchInputDirective,
27163
27375
  ElderInitialValueDirective,
27164
27376
  ElderSearchBoxComponent,
@@ -27170,11 +27382,18 @@ class ElderSearchModule {
27170
27382
  ElderPanelModule,
27171
27383
  ElderFormsDirectivesModule,
27172
27384
  TranslateModule], exports: [ElderSearchContextDirective,
27173
- ElderSearchContextUrlBindingDirective,
27385
+ ElderSearchUrlDirective,
27174
27386
  ElderSearchInputDirective,
27175
27387
  ElderSearchBoxComponent,
27176
27388
  ElderSearchPanelComponent] }); }
27177
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, imports: [CommonModule, FormsModule,
27389
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, providers: [
27390
+ {
27391
+ provide: APP_INITIALIZER,
27392
+ useFactory: initSearchUrlService,
27393
+ deps: [ElderSearchUrlService],
27394
+ multi: true
27395
+ },
27396
+ ], imports: [CommonModule, FormsModule,
27178
27397
  MatInputModule, MatButtonModule, MatIconModule,
27179
27398
  MatBadgeModule,
27180
27399
  A11yModule,
@@ -27186,6 +27405,14 @@ class ElderSearchModule {
27186
27405
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, decorators: [{
27187
27406
  type: NgModule,
27188
27407
  args: [{
27408
+ providers: [
27409
+ {
27410
+ provide: APP_INITIALIZER,
27411
+ useFactory: initSearchUrlService,
27412
+ deps: [ElderSearchUrlService],
27413
+ multi: true
27414
+ },
27415
+ ],
27189
27416
  imports: [
27190
27417
  CommonModule, FormsModule,
27191
27418
  MatInputModule, MatButtonModule, MatIconModule,
@@ -27198,7 +27425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27198
27425
  ],
27199
27426
  declarations: [
27200
27427
  ElderSearchContextDirective,
27201
- ElderSearchContextUrlBindingDirective,
27428
+ ElderSearchUrlDirective,
27202
27429
  ElderSearchInputDirective,
27203
27430
  ElderInitialValueDirective,
27204
27431
  ElderSearchBoxComponent,
@@ -27206,7 +27433,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27206
27433
  ],
27207
27434
  exports: [
27208
27435
  ElderSearchContextDirective,
27209
- ElderSearchContextUrlBindingDirective,
27436
+ ElderSearchUrlDirective,
27210
27437
  ElderSearchInputDirective,
27211
27438
  ElderSearchBoxComponent,
27212
27439
  ElderSearchPanelComponent
@@ -27621,7 +27848,7 @@ class HttpDataTransferComponent {
27621
27848
  **************************************************************************/
27622
27849
  this.logger = LoggerFactory.getLogger(this.constructor.name);
27623
27850
  this._transfer$ = new BehaviorSubject(null);
27624
- this.$state = this._transfer$.pipe(filter(transfer => !!transfer), switchMap$1(transfer => transfer.state$));
27851
+ this.$state = this._transfer$.pipe(filter(transfer => !!transfer), switchMap(transfer => transfer.state$));
27625
27852
  this.$detail = this.$state.pipe(map(state => this.renderTransferProgress(state)));
27626
27853
  }
27627
27854
  /***************************************************************************
@@ -27722,7 +27949,7 @@ class ElderDataTransferService {
27722
27949
  return this._completed.asObservable();
27723
27950
  }
27724
27951
  get transferAggregate() {
27725
- return this.transfers.pipe(switchMap$1(transfers => this.aggregateProgress(transfers)), startWith(DataTransferProgressAggregate.Empty));
27952
+ return this.transfers.pipe(switchMap(transfers => this.aggregateProgress(transfers)), startWith(DataTransferProgressAggregate.Empty));
27726
27953
  }
27727
27954
  /***************************************************************************
27728
27955
  * *
@@ -31167,5 +31394,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
31167
31394
  * Generated bundle index. Do not edit.
31168
31395
  */
31169
31396
 
31170
- 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, ElderMultiSelectChipOptionsComponent, 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, SelectChipSpecUtil, SelectOptionChipSpecUtil, 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 };
31397
+ 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, ElderMultiSelectChipOptionsComponent, 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, ElderSearchUrlDirective, 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, SelectChipSpecUtil, SelectOptionChipSpecUtil, 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, initSearchUrlService, isActivePagedDataContext, isContinuableDataContext, isContinuableDataSource, isDataContext, isDataSource, isDataViewMessageType, isElderEntityValueAccessor, isElderMultiEntityValueAccessor, isListDataSource, isPagedDataSource, lazySample, lazySampleTime, naturalValueComparator, newElderTableModel, proxyControlContainer, registerLocale, runInZone, themeInit };
31171
31398
  //# sourceMappingURL=elderbyte-ngx-starter.mjs.map