@elderbyte/ngx-starter 16.3.3 → 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.
- package/esm2022/lib/common/data/data-context/data-context-active-page.mjs +5 -5
- package/esm2022/lib/common/data/data-context/data-context-auto-starter.mjs +2 -2
- package/esm2022/lib/common/data/data-context/data-context-base.mjs +58 -28
- package/esm2022/lib/common/data/data-context/data-context-continuable-base.mjs +7 -7
- package/esm2022/lib/common/data/data-context/data-context-continuable-paged.mjs +10 -10
- package/esm2022/lib/common/data/data-context/data-context-continuable-token.mjs +8 -8
- package/esm2022/lib/common/data/data-context/data-context-simple.mjs +6 -5
- package/esm2022/lib/common/data/data-context/data-context-source-event-binding.mjs +2 -2
- package/esm2022/lib/common/data/data-context/data-context.mjs +1 -1
- package/esm2022/lib/common/data/filters/filter-context.mjs +12 -26
- package/esm2022/lib/common/data/sort-context.mjs +2 -2
- package/esm2022/lib/common/utils/filter-util.mjs +55 -1
- package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +2 -2
- package/esm2022/lib/components/forms/search/domain/context/search-context.mjs +52 -0
- package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +42 -0
- package/esm2022/lib/components/forms/search/domain/input/search-input-state.mjs +81 -0
- package/esm2022/lib/components/forms/search/domain/input/search-input.mjs +2 -0
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +74 -0
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +162 -0
- package/esm2022/lib/components/forms/search/domain/url/search-query-params-parser.mjs +81 -0
- package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +92 -47
- package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +6 -5
- package/esm2022/lib/components/forms/search/elder-search.module.mjs +30 -9
- package/fesm2022/elderbyte-ngx-starter.mjs +664 -395
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/data/data-context/data-context-base.d.ts +10 -3
- package/lib/common/data/data-context/data-context.d.ts +6 -1
- package/lib/common/data/filters/filter-context.d.ts +1 -6
- package/lib/common/utils/filter-util.d.ts +3 -0
- package/lib/components/forms/search/domain/context/search-context.d.ts +37 -0
- package/lib/components/forms/search/domain/context/search-context.service.d.ts +25 -0
- package/lib/components/forms/search/{elder-search-context-url-binding.directive.d.ts → domain/url/elder-search-url.directive.d.ts} +13 -14
- package/lib/components/forms/search/domain/url/elder-search-url.service.d.ts +60 -0
- package/lib/components/forms/search/domain/url/search-query-params-parser.d.ts +36 -0
- package/lib/components/forms/search/elder-search-context.directive.d.ts +34 -14
- package/lib/components/forms/search/elder-search-input.directive.d.ts +2 -2
- package/lib/components/forms/search/elder-search.module.d.ts +5 -3
- package/package.json +1 -1
- package/esm2022/lib/components/forms/search/elder-search-context-url-binding.directive.mjs +0 -72
- package/esm2022/lib/components/forms/search/model/search-input-state.mjs +0 -81
- package/esm2022/lib/components/forms/search/model/search-input.mjs +0 -2
- package/esm2022/lib/components/forms/search/search-box/elder-search-context-filters.mjs +0 -10
- package/esm2022/lib/components/forms/search/search-box/elder-search-url-binding.service.mjs +0 -184
- package/lib/components/forms/search/search-box/elder-search-context-filters.d.ts +0 -7
- package/lib/components/forms/search/search-box/elder-search-url-binding.service.d.ts +0 -74
- /package/lib/components/forms/search/{model → domain/input}/search-input-state.d.ts +0 -0
- /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,
|
|
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) =>
|
|
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.
|
|
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.
|
|
3464
|
-
this._sort.sorts.pipe(filter(() => this.started), takeUntil(this.
|
|
3465
|
-
this._reloadQueue.pipe(
|
|
3466
|
-
this.baselog.error('Reload queue detected error, bad!', err);
|
|
3467
|
-
return
|
|
3468
|
-
})).subscribe(
|
|
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.
|
|
3689
|
+
return this.reload('START');
|
|
3556
3690
|
}
|
|
3557
|
-
reload() {
|
|
3558
|
-
|
|
3559
|
-
this.
|
|
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.
|
|
3576
|
-
this.
|
|
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('
|
|
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('
|
|
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('
|
|
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.
|
|
3776
|
-
|
|
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.
|
|
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(
|
|
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
|
|
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,81 +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 filterData(data, filters) {
|
|
5077
|
-
FilterUtil.logger.debug('Filtering data with ' + data.length + ' items.', filters);
|
|
5078
|
-
if (filters && filters.length > 0) {
|
|
5079
|
-
for (const filter of filters) {
|
|
5080
|
-
data = data.filter(e => FilterUtil.matches(e, filter));
|
|
5081
|
-
}
|
|
5082
|
-
}
|
|
5083
|
-
return data;
|
|
5084
|
-
}
|
|
5085
|
-
static matches(entity, filter) {
|
|
5086
|
-
if (filter.value === null || filter.value === undefined) {
|
|
5087
|
-
return true;
|
|
5088
|
-
}
|
|
5089
|
-
let value;
|
|
5090
|
-
if (entity === null || entity === undefined) {
|
|
5091
|
-
value = null;
|
|
5092
|
-
}
|
|
5093
|
-
else if (typeof entity === 'object') {
|
|
5094
|
-
value = entity[filter.key];
|
|
5095
|
-
}
|
|
5096
|
-
else {
|
|
5097
|
-
value = String(entity); // Support filtering primitive values
|
|
5098
|
-
}
|
|
5099
|
-
if (Array.isArray(filter.value)) {
|
|
5100
|
-
for (const val of filter.value) {
|
|
5101
|
-
if (FilterUtil.matchesValue(value, val)) {
|
|
5102
|
-
return true;
|
|
5103
|
-
}
|
|
5104
|
-
}
|
|
5105
|
-
return false;
|
|
5106
|
-
}
|
|
5107
|
-
else {
|
|
5108
|
-
return FilterUtil.matchesValue(value, filter.value);
|
|
5109
|
-
}
|
|
5110
|
-
}
|
|
5111
|
-
static matchesValue(haystack, needle) {
|
|
5112
|
-
if (haystack === needle) {
|
|
5113
|
-
return true;
|
|
5114
|
-
}
|
|
5115
|
-
if (haystack === null || haystack === undefined) {
|
|
5116
|
-
return false;
|
|
5117
|
-
}
|
|
5118
|
-
const str = String(haystack);
|
|
5119
|
-
const match = str.toLowerCase().startsWith(needle.toLowerCase());
|
|
5120
|
-
// FilterUtil.logger.debug('Haystack: ' + str + ' starts with needle: ' + needle + ' --> ' + match);
|
|
5121
|
-
return match;
|
|
5122
|
-
}
|
|
5123
|
-
}
|
|
5124
|
-
|
|
5125
5193
|
/**
|
|
5126
5194
|
* Provides the ability to build a IDataContext<T>.
|
|
5127
5195
|
*/
|
|
@@ -5502,7 +5570,7 @@ class DataSourceProcessor {
|
|
|
5502
5570
|
* @param sorts to sort the data source
|
|
5503
5571
|
*/
|
|
5504
5572
|
process$(processFn, filters, sorts) {
|
|
5505
|
-
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 => {
|
|
5506
5574
|
processFn(updatedCtx.items);
|
|
5507
5575
|
this._process$.next(updatedCtx);
|
|
5508
5576
|
}));
|
|
@@ -6578,7 +6646,7 @@ class ElderFromFieldBase {
|
|
|
6578
6646
|
this._logger = LoggerFactory.getLogger(this.constructor.name);
|
|
6579
6647
|
this.formFieldControl$ = new BehaviorSubject(null);
|
|
6580
6648
|
this._controlActionQueue = [];
|
|
6581
|
-
this._value$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), switchMap
|
|
6649
|
+
this._value$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), switchMap(ctrl => this.controlValue$(ctrl)));
|
|
6582
6650
|
}
|
|
6583
6651
|
/***************************************************************************
|
|
6584
6652
|
* *
|
|
@@ -6660,8 +6728,8 @@ class ElderFromFieldEntityBase extends ElderFromFieldBase {
|
|
|
6660
6728
|
constructor() {
|
|
6661
6729
|
super();
|
|
6662
6730
|
this._entityAccessor$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), filter(ctrl => isElderEntityValueAccessor(ctrl)), map(ctrl => ctrl));
|
|
6663
|
-
this._entityId$ = this._entityAccessor$.pipe(switchMap
|
|
6664
|
-
this._entity$ = this._entityAccessor$.pipe(switchMap
|
|
6731
|
+
this._entityId$ = this._entityAccessor$.pipe(switchMap(evac => ElderEntityValueAccessorUtil.entityId$(evac)));
|
|
6732
|
+
this._entity$ = this._entityAccessor$.pipe(switchMap(evac => ElderEntityValueAccessorUtil.entity$(evac)));
|
|
6665
6733
|
}
|
|
6666
6734
|
/***************************************************************************
|
|
6667
6735
|
* *
|
|
@@ -6693,10 +6761,10 @@ class ElderFromFieldMultiEntityBase extends ElderFromFieldBase {
|
|
|
6693
6761
|
constructor() {
|
|
6694
6762
|
super();
|
|
6695
6763
|
this._entitiesAccessor$ = this.formFieldControl$.pipe(filter(ctrl => !!ctrl), filter(ctrl => isElderMultiEntityValueAccessor(ctrl)), map(ctrl => ctrl));
|
|
6696
|
-
this._entityIds$ = this._entitiesAccessor$.pipe(switchMap
|
|
6697
|
-
this._entities$ = this._entitiesAccessor$.pipe(switchMap
|
|
6698
|
-
this._entitiesUpdated$ = this._entitiesAccessor$.pipe(switchMap
|
|
6699
|
-
this._entityIdsUpdated$ = this._entitiesAccessor$.pipe(switchMap
|
|
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));
|
|
6700
6768
|
}
|
|
6701
6769
|
/***************************************************************************
|
|
6702
6770
|
* *
|
|
@@ -8522,7 +8590,7 @@ class RefreshingEntity {
|
|
|
8522
8590
|
if (this.dataSource) {
|
|
8523
8591
|
this.entityId = this.dataSource.getId(entity);
|
|
8524
8592
|
}
|
|
8525
|
-
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
|
|
8526
8594
|
);
|
|
8527
8595
|
}
|
|
8528
8596
|
/***************************************************************************
|
|
@@ -9385,7 +9453,7 @@ class ElderLabelInputComponent extends FormFieldBaseComponent {
|
|
|
9385
9453
|
}
|
|
9386
9454
|
set suggestionLoader(provider) {
|
|
9387
9455
|
if (provider) {
|
|
9388
|
-
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)));
|
|
9389
9457
|
}
|
|
9390
9458
|
else {
|
|
9391
9459
|
this.logger.debug('Cant provide suggestions since no suggestion provider was registered!');
|
|
@@ -12596,7 +12664,7 @@ class ElderDialogService {
|
|
|
12596
12664
|
const rawMessages = new Map();
|
|
12597
12665
|
rawMessages.set('title', config.title);
|
|
12598
12666
|
rawMessages.set('message', config.message);
|
|
12599
|
-
return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap(messages => {
|
|
12667
|
+
return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap$1(messages => {
|
|
12600
12668
|
const title = messages.get('title');
|
|
12601
12669
|
const message = messages.get('message');
|
|
12602
12670
|
let dialogRef;
|
|
@@ -12619,7 +12687,7 @@ class ElderDialogService {
|
|
|
12619
12687
|
const rawMessages = new Map();
|
|
12620
12688
|
rawMessages.set('title', config.title);
|
|
12621
12689
|
rawMessages.set('question', config.question);
|
|
12622
|
-
return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap(messages => {
|
|
12690
|
+
return this.resolveTranslatedMap(rawMessages, config.interpolateParams).pipe(switchMap$1(messages => {
|
|
12623
12691
|
const title = messages.get('title');
|
|
12624
12692
|
const question = messages.get('question');
|
|
12625
12693
|
const dlgConf = this.matDialogConfig(config);
|
|
@@ -12674,7 +12742,7 @@ class ElderDialogService {
|
|
|
12674
12742
|
**************************************************************************/
|
|
12675
12743
|
resolveTranslatedMap(messages, interpolateParams) {
|
|
12676
12744
|
const rawMessages = Array.from(messages.values());
|
|
12677
|
-
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 => {
|
|
12678
12746
|
const translated = new Map();
|
|
12679
12747
|
messages.forEach((rawValue, key) => {
|
|
12680
12748
|
translated.set(key, translatedValues[rawValue] || rawValue);
|
|
@@ -13042,7 +13110,7 @@ class DataContextSelectionDirective {
|
|
|
13042
13110
|
* *
|
|
13043
13111
|
**************************************************************************/
|
|
13044
13112
|
buildSelectionState$(selectionModel$, dataContext$) {
|
|
13045
|
-
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)));
|
|
13046
13114
|
}
|
|
13047
13115
|
buildSelectionStateInner$(model, dc) {
|
|
13048
13116
|
return combineLatest([model.selection, dc.data]).pipe(map(([selection, currentData]) => {
|
|
@@ -13546,7 +13614,7 @@ class ElderTableRowDirective {
|
|
|
13546
13614
|
this._activated = false;
|
|
13547
13615
|
this._activationDir$ = new BehaviorSubject(null);
|
|
13548
13616
|
this.focused$ = new BehaviorSubject(false);
|
|
13549
|
-
this._activationDir$.pipe(filter(x => x !== null), switchMap
|
|
13617
|
+
this._activationDir$.pipe(filter(x => x !== null), switchMap(provider => provider.activeItemEventChange), filter(e => e.item == this.model), filter(e => e.focus)).subscribe({
|
|
13550
13618
|
next: focusMe => {
|
|
13551
13619
|
this.focus();
|
|
13552
13620
|
}
|
|
@@ -14586,7 +14654,7 @@ class ElderTableComponent extends ElderDataViewBaseComponent {
|
|
|
14586
14654
|
return (index, entity) => this.getId(entity);
|
|
14587
14655
|
}
|
|
14588
14656
|
isDataValid(data) {
|
|
14589
|
-
return data
|
|
14657
|
+
return data?.length > 0;
|
|
14590
14658
|
}
|
|
14591
14659
|
/***************************************************************************
|
|
14592
14660
|
* *
|
|
@@ -16446,7 +16514,7 @@ class ElderTableActivationDirective {
|
|
|
16446
16514
|
**************************************************************************/
|
|
16447
16515
|
ngAfterViewInit() {
|
|
16448
16516
|
const rows$ = this.elderTable.rows$;
|
|
16449
|
-
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));
|
|
16450
16518
|
+combineLatest([rows$, data$]).pipe(takeUntil(this.destroy$)).subscribe(([rows, data]) => {
|
|
16451
16519
|
this.rows$.next(this.rowDataUpdated(rows, data));
|
|
16452
16520
|
this.handleAutoActivations();
|
|
@@ -16454,7 +16522,7 @@ class ElderTableActivationDirective {
|
|
|
16454
16522
|
combineLatest([this.rows$, this.activeItem$]).pipe(takeUntil(this.destroy$)).subscribe(([rows, activeItem]) => {
|
|
16455
16523
|
this.updateRowsActivation(rows, activeItem);
|
|
16456
16524
|
});
|
|
16457
|
-
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({
|
|
16458
16526
|
next: deleteEvent => {
|
|
16459
16527
|
deleteEvent.deletedIds.forEach(id => this.deactivateById(id));
|
|
16460
16528
|
}
|
|
@@ -17091,7 +17159,7 @@ class ElderGridComponent extends ElderDataViewBaseComponent {
|
|
|
17091
17159
|
? this.responsiveColumn()
|
|
17092
17160
|
: this._columnCount);
|
|
17093
17161
|
this.dataRows$ = combineLatest([
|
|
17094
|
-
this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.data)),
|
|
17162
|
+
this.dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.data)),
|
|
17095
17163
|
columnCount$
|
|
17096
17164
|
]).pipe(debounceTime(50), map(([data, columns]) => this.groupForColumns(data, columns)));
|
|
17097
17165
|
}
|
|
@@ -18871,7 +18939,7 @@ class SelectionModelPopupDirective {
|
|
|
18871
18939
|
// view container is outside the invoking control, which
|
|
18872
18940
|
// happens when using ng-content projection.
|
|
18873
18941
|
this.changeDetectorRef.markForCheck();
|
|
18874
|
-
return dialogRef.afterClosed().pipe(switchMap((chosenEntities) => {
|
|
18942
|
+
return dialogRef.afterClosed().pipe(switchMap$1((chosenEntities) => {
|
|
18875
18943
|
if (chosenEntities) {
|
|
18876
18944
|
return this._transformerFn
|
|
18877
18945
|
? of(chosenEntities.map(value => this._transformerFn(value)))
|
|
@@ -19018,7 +19086,7 @@ class ElderSelectBase extends ElderFormFieldControlBase {
|
|
|
19018
19086
|
this.currentClicked = new EventEmitter();
|
|
19019
19087
|
this.state$ = new BehaviorSubject(ElderSelectComponentState.idle());
|
|
19020
19088
|
this.mergedState$ = combineLatest([
|
|
19021
|
-
this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.status)),
|
|
19089
|
+
this.dataContext$.pipe(filter(dc => !!dc), switchMap$1(dc => dc.status)),
|
|
19022
19090
|
this.state$
|
|
19023
19091
|
]).pipe(map(([dcState, state]) => {
|
|
19024
19092
|
if (dcState.idle) {
|
|
@@ -19241,7 +19309,7 @@ class ElderSelectFirstUtil {
|
|
|
19241
19309
|
const dataContextFirstItem = suggestionsDc?.isStarted
|
|
19242
19310
|
? this.firstItemInDataContextSoon(suggestionsDc)
|
|
19243
19311
|
: of(null);
|
|
19244
|
-
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 => {
|
|
19245
19313
|
if (firstItem && !elderSelect.entityId) {
|
|
19246
19314
|
elderSelect.updateValueByEntity(firstItem);
|
|
19247
19315
|
}
|
|
@@ -19322,8 +19390,8 @@ class ElderAutocompleteComponent {
|
|
|
19322
19390
|
this.triggerReload$ = new Subject();
|
|
19323
19391
|
this.displayPropertyResolver$ = new BehaviorSubject((value) => this.propertyStringValue(value, null));
|
|
19324
19392
|
this.optionSelected = new Subject();
|
|
19325
|
-
this.dataState$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.status), runInZone(this.zone));
|
|
19326
|
-
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));
|
|
19327
19395
|
}
|
|
19328
19396
|
/***************************************************************************
|
|
19329
19397
|
* *
|
|
@@ -19732,7 +19800,7 @@ class ElderSelectComponent extends ElderSelectBase {
|
|
|
19732
19800
|
this.entityChange = this._entity$.pipe(skip(1) // Skip the initial or current value
|
|
19733
19801
|
);
|
|
19734
19802
|
this.entityIdUpdated = this.valueUpdated.pipe(map(value => this.entityIdFromValue(value)));
|
|
19735
|
-
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 => {
|
|
19736
19804
|
this.logger.warn(`awaitEntityWithId -> timed out after: ${this.timeoutAfterMs}`, err);
|
|
19737
19805
|
return EMPTY;
|
|
19738
19806
|
}));
|
|
@@ -21271,7 +21339,7 @@ class ElderMultiSelectBase extends ElderSelectBase {
|
|
|
21271
21339
|
this.entitiesChange = this._entities$.pipe(skip(1) // Skip the initial or current value
|
|
21272
21340
|
);
|
|
21273
21341
|
this.entityIdsUpdated = this.valueUpdated.pipe(map(values => this.entityIdsFromValues(values)));
|
|
21274
|
-
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 => {
|
|
21275
21343
|
this.logger.warn(`awaitEntitiesWithId -> timed out after: ${this.timeoutAfterMs}`, err);
|
|
21276
21344
|
return EMPTY;
|
|
21277
21345
|
}));
|
|
@@ -22143,7 +22211,7 @@ class ElderMultiSelectChipOptionsComponent extends ElderMultiSelectBase {
|
|
|
22143
22211
|
disabled: disabled
|
|
22144
22212
|
};
|
|
22145
22213
|
}));
|
|
22146
|
-
const available$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap
|
|
22214
|
+
const available$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.data));
|
|
22147
22215
|
this.selectChips$ = combineLatest([
|
|
22148
22216
|
this.entities$,
|
|
22149
22217
|
this.entityIds$,
|
|
@@ -22826,7 +22894,7 @@ class ElderNavLinkComponent {
|
|
|
22826
22894
|
* *
|
|
22827
22895
|
**************************************************************************/
|
|
22828
22896
|
ngOnInit() {
|
|
22829
|
-
this._routerLinkActive$.pipe(takeUntil(this.destroy$), filter(rla => !!rla), switchMap
|
|
22897
|
+
this._routerLinkActive$.pipe(takeUntil(this.destroy$), filter(rla => !!rla), switchMap(rla => {
|
|
22830
22898
|
return rla.isActiveChange.pipe(startWith(rla.isActive));
|
|
22831
22899
|
})).subscribe(active => this._active$.next(active));
|
|
22832
22900
|
this.navList.valueChange.pipe(takeUntil(this.destroy$), map(value => this.isCurrentValueActive)).subscribe(active => this._active$.next(active));
|
|
@@ -25683,7 +25751,7 @@ class LocalisationPickerService {
|
|
|
25683
25751
|
return this.languageService.currentLanguage$.pipe(map(current => this.pick(choices, current)));
|
|
25684
25752
|
}
|
|
25685
25753
|
pickCurrentRx(choices$) {
|
|
25686
|
-
return choices$.pipe(switchMap(choices => this.pickCurrent(choices)));
|
|
25754
|
+
return choices$.pipe(switchMap$1(choices => this.pickCurrent(choices)));
|
|
25687
25755
|
}
|
|
25688
25756
|
/***************************************************************************
|
|
25689
25757
|
* *
|
|
@@ -25748,7 +25816,7 @@ class ElderLocalizedInputComponent extends FormFieldBaseComponent {
|
|
|
25748
25816
|
this.inputText$ = combineLatest([
|
|
25749
25817
|
this.value$,
|
|
25750
25818
|
this.textColumns$
|
|
25751
|
-
]).pipe(switchMap(([values, columns]) => this.toInputText(values, columns)));
|
|
25819
|
+
]).pipe(switchMap$1(([values, columns]) => this.toInputText(values, columns)));
|
|
25752
25820
|
this.hintText$ = this.value$.pipe(map(values => this.toHintText(values)));
|
|
25753
25821
|
this.translatedValueChange = this.valueChange.pipe(map(localized => TranslatedConverter.toTranslatedText(localized)));
|
|
25754
25822
|
}
|
|
@@ -25849,52 +25917,134 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
25849
25917
|
type: Input
|
|
25850
25918
|
}] } });
|
|
25851
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
|
+
|
|
25852
26006
|
/**
|
|
25853
|
-
* The
|
|
25854
|
-
*
|
|
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??
|
|
25855
26012
|
*/
|
|
25856
26013
|
class ElderSearchContextDirective {
|
|
25857
|
-
|
|
26014
|
+
/***************************************************************************
|
|
26015
|
+
* *
|
|
26016
|
+
* Constructor *
|
|
26017
|
+
* *
|
|
26018
|
+
**************************************************************************/
|
|
26019
|
+
constructor(searchContextService) {
|
|
25858
26020
|
/***************************************************************************
|
|
25859
26021
|
* *
|
|
25860
26022
|
* Fields *
|
|
25861
26023
|
* *
|
|
25862
26024
|
**************************************************************************/
|
|
25863
|
-
this._forcedFilters$ = new BehaviorSubject$1([]);
|
|
25864
26025
|
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
25865
|
-
this.destroy$ = new Subject
|
|
25866
|
-
this._searchInputs$ = new BehaviorSubject
|
|
25867
|
-
this._searchStates$ = new BehaviorSubject
|
|
25868
|
-
this._filterContext$ = new BehaviorSubject
|
|
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));
|
|
25869
26033
|
}
|
|
25870
26034
|
/***************************************************************************
|
|
25871
26035
|
* *
|
|
25872
26036
|
* Life Cycle *
|
|
25873
26037
|
* *
|
|
25874
26038
|
**************************************************************************/
|
|
25875
|
-
|
|
25876
|
-
this.
|
|
25877
|
-
|
|
25878
|
-
const userFilters = this.convertToFilters(states);
|
|
25879
|
-
this.applyFilters(userFilters, forcedFilters);
|
|
25880
|
-
});
|
|
26039
|
+
ngOnInit() {
|
|
26040
|
+
this.applyDefaultFiltersToSearchContext();
|
|
26041
|
+
this.syncSearchContextToBoundFilterContext();
|
|
25881
26042
|
}
|
|
25882
|
-
|
|
25883
|
-
|
|
25884
|
-
if (context) {
|
|
25885
|
-
context.updateFilters(userFilters);
|
|
25886
|
-
context.mergeFilters(forcedFilters);
|
|
25887
|
-
this.log.trace("Search-Model filters updated:", Array.from(context.filtersSnapshot));
|
|
25888
|
-
}
|
|
25889
|
-
else {
|
|
25890
|
-
this.log.warn("Failed to apply filters since no FilterContext is available!", {
|
|
25891
|
-
userFilters: userFilters,
|
|
25892
|
-
forcedFilters: forcedFilters
|
|
25893
|
-
});
|
|
25894
|
-
}
|
|
26043
|
+
ngAfterContentInit() {
|
|
26044
|
+
this.syncSearchInputsToSearchContext();
|
|
25895
26045
|
}
|
|
25896
26046
|
ngAfterViewInit() {
|
|
25897
|
-
this.
|
|
26047
|
+
this.applySearchContextToInputs();
|
|
25898
26048
|
}
|
|
25899
26049
|
ngOnDestroy() {
|
|
25900
26050
|
this.destroy$.next();
|
|
@@ -25905,15 +26055,27 @@ class ElderSearchContextDirective {
|
|
|
25905
26055
|
* Properties *
|
|
25906
26056
|
* *
|
|
25907
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
|
+
}
|
|
25908
26070
|
set filterContext(value) {
|
|
25909
26071
|
let context;
|
|
25910
26072
|
if (value) {
|
|
25911
|
-
if (typeof value !==
|
|
26073
|
+
if (typeof value !== 'string') {
|
|
25912
26074
|
context = value;
|
|
25913
26075
|
}
|
|
25914
26076
|
else {
|
|
25915
|
-
this.log.warn(
|
|
25916
|
-
throw new Error(
|
|
26077
|
+
this.log.warn('Illegal value provided for property filterContext: ', JSON.stringify(value));
|
|
26078
|
+
throw new Error('Illegal value provided for property filterContext! ' + value);
|
|
25917
26079
|
}
|
|
25918
26080
|
}
|
|
25919
26081
|
else {
|
|
@@ -25931,10 +26093,10 @@ class ElderSearchContextDirective {
|
|
|
25931
26093
|
* to also keep the users intent (by merging) them.
|
|
25932
26094
|
*/
|
|
25933
26095
|
set forcedFilters(filters) {
|
|
25934
|
-
this.
|
|
26096
|
+
this.searchContext.forcedFilters.replaceFilters(filters);
|
|
25935
26097
|
}
|
|
25936
26098
|
get forcedFilters() {
|
|
25937
|
-
return this.
|
|
26099
|
+
return this.searchContext.forcedFilters.filtersSnapshot;
|
|
25938
26100
|
}
|
|
25939
26101
|
get attributes() {
|
|
25940
26102
|
return this._searchInputs$.asObservable();
|
|
@@ -25963,7 +26125,7 @@ class ElderSearchContextDirective {
|
|
|
25963
26125
|
* Register a new search name in this container
|
|
25964
26126
|
*/
|
|
25965
26127
|
register(searchInput) {
|
|
25966
|
-
this.log.debug(
|
|
26128
|
+
this.log.debug('Registering search input [' + searchInput.name + ']');
|
|
25967
26129
|
const current = this._searchInputs$.getValue();
|
|
25968
26130
|
this._searchInputs$.next([...current, searchInput]);
|
|
25969
26131
|
}
|
|
@@ -25979,8 +26141,43 @@ class ElderSearchContextDirective {
|
|
|
25979
26141
|
* Private *
|
|
25980
26142
|
* *
|
|
25981
26143
|
**************************************************************************/
|
|
25982
|
-
|
|
25983
|
-
this.
|
|
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
|
+
);
|
|
25984
26181
|
}
|
|
25985
26182
|
applyFiltersToInputs(filters) {
|
|
25986
26183
|
this.log.warn('applyFiltersToInputs', filters);
|
|
@@ -26004,18 +26201,20 @@ class ElderSearchContextDirective {
|
|
|
26004
26201
|
.filter(s => !!s.queryKey)
|
|
26005
26202
|
.map(s => new Filter(s.queryKey, s.queryValue));
|
|
26006
26203
|
}
|
|
26007
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
26008
|
-
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 }); }
|
|
26009
26206
|
}
|
|
26010
26207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
|
|
26011
26208
|
type: Directive,
|
|
26012
26209
|
args: [{
|
|
26013
|
-
selector:
|
|
26014
|
-
exportAs:
|
|
26210
|
+
selector: '[elderSearchContext]',
|
|
26211
|
+
exportAs: 'elderSearchContext'
|
|
26015
26212
|
}]
|
|
26016
|
-
}], propDecorators: {
|
|
26213
|
+
}], ctorParameters: function () { return [{ type: SearchContextService }]; }, propDecorators: { searchContextId: [{
|
|
26214
|
+
type: Input
|
|
26215
|
+
}], filterContext: [{
|
|
26017
26216
|
type: Input,
|
|
26018
|
-
args: [
|
|
26217
|
+
args: ['elderSearchContext']
|
|
26019
26218
|
}], forcedFilters: [{
|
|
26020
26219
|
type: Input
|
|
26021
26220
|
}] } });
|
|
@@ -26219,7 +26418,8 @@ class ElderSearchInputDirective {
|
|
|
26219
26418
|
ngAfterViewInit() {
|
|
26220
26419
|
this._extractedName = this.extractName();
|
|
26221
26420
|
this.log.debug(this._extractedName + "|" + this.queryKey + "|" + this.resolvePath);
|
|
26222
|
-
|
|
26421
|
+
const viewStabilized$ = of('stabilized$').pipe(delay(20), first());
|
|
26422
|
+
this.stateObservable().pipe(skipUntil(viewStabilized$)).subscribe(state => {
|
|
26223
26423
|
this.emitState(state);
|
|
26224
26424
|
});
|
|
26225
26425
|
}
|
|
@@ -26863,147 +27063,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
26863
27063
|
}]
|
|
26864
27064
|
}] });
|
|
26865
27065
|
|
|
26866
|
-
class
|
|
26867
|
-
static empty(searchContextId) {
|
|
26868
|
-
return new ElderSearchContextFilters(searchContextId, new Map());
|
|
26869
|
-
}
|
|
26870
|
-
constructor(searchContextId, filters) {
|
|
26871
|
-
this.searchContextId = searchContextId;
|
|
26872
|
-
this.filters = filters;
|
|
26873
|
-
}
|
|
26874
|
-
}
|
|
26875
|
-
|
|
26876
|
-
class ElderSearchUrlBindingService {
|
|
27066
|
+
class SearchQueryParamsParser {
|
|
26877
27067
|
/***************************************************************************
|
|
26878
27068
|
* *
|
|
26879
27069
|
* Constructor *
|
|
26880
27070
|
* *
|
|
26881
27071
|
**************************************************************************/
|
|
26882
|
-
constructor(
|
|
26883
|
-
this.router = router;
|
|
26884
|
-
this.route = route;
|
|
26885
|
-
//A search param has following structure: q-[searchContextId]-[filterId]=[value]
|
|
26886
|
-
//Example: search-browser1-hasStarted=true
|
|
27072
|
+
constructor(queryPrefix) {
|
|
26887
27073
|
/***************************************************************************
|
|
26888
27074
|
* *
|
|
26889
27075
|
* Fields *
|
|
26890
27076
|
* *
|
|
26891
27077
|
**************************************************************************/
|
|
26892
27078
|
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
26893
|
-
this.
|
|
26894
|
-
value: new Map(),
|
|
26895
|
-
emit: true
|
|
26896
|
-
});
|
|
26897
|
-
this._initialSearchMap$ = new BehaviorSubject$1(new Map());
|
|
26898
|
-
this.searchParamPrefix = "q";
|
|
26899
|
-
this.unsubscribe$ = new Subject();
|
|
26900
|
-
this.router.events.pipe(first()).subscribe(() => {
|
|
26901
|
-
this.handleSearchParameters(this.route.snapshot.queryParams);
|
|
26902
|
-
});
|
|
26903
|
-
this._searchMap$.pipe(filter(searchMapUpdate => searchMapUpdate.emit), takeUntil(this.unsubscribe$)).subscribe(searchMapUpdate => {
|
|
26904
|
-
this.log.warn("SET URL");
|
|
26905
|
-
const searchMap = searchMapUpdate.value;
|
|
26906
|
-
const resetParams = this.resetSearchParams();
|
|
26907
|
-
const queryParams = { ...resetParams, ...this.buildQueryParams(searchMap) };
|
|
26908
|
-
this.log.warn("searchMap :", searchMap);
|
|
26909
|
-
this.log.warn("queryParams :", queryParams);
|
|
26910
|
-
this.router.navigate([], {
|
|
26911
|
-
queryParams: queryParams,
|
|
26912
|
-
replaceUrl: true,
|
|
26913
|
-
queryParamsHandling: "merge"
|
|
26914
|
-
});
|
|
26915
|
-
});
|
|
26916
|
-
this.router.events.subscribe((event) => this.log.warn("Type: " + event.constructor?.name, event));
|
|
26917
|
-
}
|
|
26918
|
-
/***************************************************************************
|
|
26919
|
-
* *
|
|
26920
|
-
* Life Cycle *
|
|
26921
|
-
* *
|
|
26922
|
-
**************************************************************************/
|
|
26923
|
-
ngOnDestroy() {
|
|
26924
|
-
this.unsubscribe$.next();
|
|
26925
|
-
this.unsubscribe$.complete();
|
|
26926
|
-
}
|
|
26927
|
-
/***************************************************************************
|
|
26928
|
-
* *
|
|
26929
|
-
* Properties *
|
|
26930
|
-
* *
|
|
26931
|
-
**************************************************************************/
|
|
26932
|
-
get initialSearchMap$() {
|
|
26933
|
-
return this._initialSearchMap$;
|
|
27079
|
+
this.queryPrefix = queryPrefix;
|
|
26934
27080
|
}
|
|
26935
27081
|
/***************************************************************************
|
|
26936
27082
|
* *
|
|
26937
27083
|
* Public API *
|
|
26938
27084
|
* *
|
|
26939
27085
|
**************************************************************************/
|
|
26940
|
-
|
|
26941
|
-
const
|
|
26942
|
-
const
|
|
26943
|
-
|
|
26944
|
-
.filter(filter => filter.value != null)
|
|
26945
|
-
.map(filter => {
|
|
26946
|
-
return [filter.key, filter];
|
|
26947
|
-
}));
|
|
26948
|
-
searchMap.set(searchContextId, new ElderSearchContextFilters(searchContextId, filtersMap));
|
|
26949
|
-
this._searchMap$.next({ value: searchMap, emit: true });
|
|
26950
|
-
}
|
|
26951
|
-
resetFilterForContext(contextId) {
|
|
26952
|
-
const searchMapUpdate = this._searchMap$.getValue();
|
|
26953
|
-
const searchMap = searchMapUpdate.value;
|
|
26954
|
-
if (searchMap.has(contextId)) {
|
|
26955
|
-
searchMap.delete(contextId);
|
|
26956
|
-
this._searchMap$.next({ value: searchMap, emit: false });
|
|
26957
|
-
}
|
|
27086
|
+
parse(params) {
|
|
27087
|
+
const paramMap = convertToParamMap(params);
|
|
27088
|
+
const searchParamKeys = this.extractSearchParameters(paramMap);
|
|
27089
|
+
return this.buildSearchContextMap(paramMap, searchParamKeys);
|
|
26958
27090
|
}
|
|
26959
27091
|
/***************************************************************************
|
|
26960
27092
|
* *
|
|
26961
27093
|
* Private methods *
|
|
26962
27094
|
* *
|
|
26963
27095
|
**************************************************************************/
|
|
26964
|
-
|
|
26965
|
-
|
|
26966
|
-
const searchMap = this.buildSearchContextMap(params, searchParamKeys);
|
|
26967
|
-
this._searchMap$.next({ value: searchMap, emit: true });
|
|
26968
|
-
this._initialSearchMap$.next(searchMap);
|
|
26969
|
-
}
|
|
26970
|
-
extractSearchParameters(params) {
|
|
26971
|
-
return Object.getOwnPropertyNames(params).filter(param => param.startsWith(this.searchParamPrefix + "-"));
|
|
27096
|
+
extractSearchParameters(paramMap) {
|
|
27097
|
+
return paramMap.keys.filter(param => param.startsWith(this.queryPrefix + '-'));
|
|
26972
27098
|
}
|
|
26973
|
-
buildSearchContextMap(
|
|
26974
|
-
const
|
|
27099
|
+
buildSearchContextMap(paramMap, searchParamKeys) {
|
|
27100
|
+
const filtersByContextId = new Map();
|
|
26975
27101
|
for (const key of searchParamKeys) {
|
|
26976
|
-
const
|
|
27102
|
+
const filterValues = paramMap.getAll(key);
|
|
27103
|
+
const filterValue = filterValues[0]; // TODO Support multiple values
|
|
26977
27104
|
const filterParamData = this.extractFilterParam(key, filterValue);
|
|
26978
27105
|
const filter = this.convertFilterStringToFilter(filterValue, filterParamData);
|
|
26979
|
-
this.checkAndSetFilter(
|
|
27106
|
+
this.checkAndSetFilter(filtersByContextId, filterParamData.searchContextId, filter);
|
|
26980
27107
|
}
|
|
26981
|
-
return
|
|
27108
|
+
return filtersByContextId;
|
|
26982
27109
|
}
|
|
26983
|
-
checkAndSetFilter(
|
|
26984
|
-
|
|
26985
|
-
|
|
26986
|
-
|
|
26987
|
-
|
|
26988
|
-
searchMap.set(filterParamData.searchContextId, ElderSearchContextFilters.empty(filterParamData.searchContextId));
|
|
26989
|
-
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);
|
|
26990
27115
|
}
|
|
26991
|
-
|
|
26992
|
-
setFilter(searchMap, filterParamData, filter) {
|
|
26993
|
-
const searchContext = searchMap.get(filterParamData.searchContextId);
|
|
26994
|
-
searchContext.filters.set(filterParamData.filterId, filter);
|
|
27116
|
+
filtersInContext.push(filter);
|
|
26995
27117
|
}
|
|
26996
27118
|
extractFilterParam(key, filterValue) {
|
|
26997
|
-
const splitParams = key.split(
|
|
27119
|
+
const splitParams = key.split('-');
|
|
26998
27120
|
return {
|
|
26999
27121
|
searchContextId: splitParams[1],
|
|
27000
27122
|
filterId: splitParams[2],
|
|
27001
27123
|
isArray: this.checkIfParamIsArray(filterValue)
|
|
27002
27124
|
};
|
|
27003
27125
|
}
|
|
27004
|
-
checkIfParamIsArray(filterValue) {
|
|
27005
|
-
return filterValue.startsWith("(") && filterValue.endsWith(")");
|
|
27006
|
-
}
|
|
27007
27126
|
convertFilterStringToFilter(paramValue, filterParamData) {
|
|
27008
27127
|
let value = paramValue;
|
|
27009
27128
|
if (this.isSingularArrayValue(value, filterParamData)) {
|
|
@@ -27015,59 +27134,189 @@ class ElderSearchUrlBindingService {
|
|
|
27015
27134
|
return !Array.isArray(value) && filterParamData.isArray;
|
|
27016
27135
|
}
|
|
27017
27136
|
convertValueToArray(value) {
|
|
27018
|
-
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];
|
|
27165
|
+
}
|
|
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
|
+
}
|
|
27019
27228
|
}
|
|
27020
|
-
|
|
27021
|
-
|
|
27022
|
-
|
|
27023
|
-
|
|
27024
|
-
|
|
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);
|
|
27025
27258
|
}
|
|
27026
27259
|
return params;
|
|
27027
27260
|
}
|
|
27028
|
-
|
|
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) {
|
|
27029
27276
|
const params = {};
|
|
27030
|
-
for (const
|
|
27031
|
-
|
|
27032
|
-
for (const filter of filters.values()) {
|
|
27033
|
-
params[`${this.searchParamPrefix}-${searchContextId}-${filter.key}`] = this.convertValueToArrayOrSingleValue(filter.value);
|
|
27034
|
-
}
|
|
27277
|
+
for (const filter of filters) {
|
|
27278
|
+
params[this.queryParamKey(searchContextId, filter)] = this.convertValueToArrayOrSingleValue(filter.value);
|
|
27035
27279
|
}
|
|
27036
27280
|
return params;
|
|
27037
27281
|
}
|
|
27282
|
+
queryParamKey(searchContextId, filter) {
|
|
27283
|
+
return `${this.SEARCH_QUERY_KEY}-${searchContextId}-${filter.key}`;
|
|
27284
|
+
}
|
|
27038
27285
|
convertValueToArrayOrSingleValue(value) {
|
|
27039
27286
|
return Array.isArray(value) ? `(${value.toString()})` : value;
|
|
27040
27287
|
}
|
|
27041
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
27042
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
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' }); }
|
|
27043
27290
|
}
|
|
27044
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
27291
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, decorators: [{
|
|
27045
27292
|
type: Injectable,
|
|
27046
27293
|
args: [{
|
|
27047
|
-
providedIn:
|
|
27294
|
+
providedIn: 'root'
|
|
27048
27295
|
}]
|
|
27049
|
-
}], ctorParameters: function () { return [{ type: i1$3.Router }
|
|
27296
|
+
}], ctorParameters: function () { return [{ type: i1$3.Router }]; } });
|
|
27050
27297
|
|
|
27051
27298
|
/**
|
|
27052
27299
|
* The search container manages a group of search-inputs
|
|
27053
27300
|
* and holds their values in a central search model.
|
|
27054
27301
|
*/
|
|
27055
|
-
class
|
|
27302
|
+
class ElderSearchUrlDirective {
|
|
27056
27303
|
/***************************************************************************
|
|
27057
27304
|
* *
|
|
27058
27305
|
* Constructor *
|
|
27059
27306
|
* *
|
|
27060
27307
|
**************************************************************************/
|
|
27061
|
-
constructor(
|
|
27062
|
-
this.
|
|
27063
|
-
this.urlBindingService = urlBindingService;
|
|
27308
|
+
constructor(searchContextDirective, searchUrlService) {
|
|
27309
|
+
this.searchUrlService = searchUrlService;
|
|
27064
27310
|
/***************************************************************************
|
|
27065
27311
|
* *
|
|
27066
27312
|
* Fields *
|
|
27067
27313
|
* *
|
|
27068
27314
|
**************************************************************************/
|
|
27069
27315
|
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
27070
|
-
this.
|
|
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));
|
|
27071
27320
|
}
|
|
27072
27321
|
/***************************************************************************
|
|
27073
27322
|
* *
|
|
@@ -27075,48 +27324,53 @@ class ElderSearchContextUrlBindingDirective {
|
|
|
27075
27324
|
* *
|
|
27076
27325
|
**************************************************************************/
|
|
27077
27326
|
ngAfterViewInit() {
|
|
27078
|
-
if (this.
|
|
27079
|
-
this.
|
|
27080
|
-
|
|
27081
|
-
|
|
27082
|
-
// this.searchContext.searchFilterContext.addInitialFilters(filters)
|
|
27083
|
-
});
|
|
27084
|
-
this.searchContext.filterContext.filters.pipe(takeUntil(this._unsubscribe$)).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));
|
|
27085
27331
|
}
|
|
27086
27332
|
}
|
|
27087
27333
|
ngOnDestroy() {
|
|
27088
|
-
this.
|
|
27089
|
-
this.
|
|
27090
|
-
this._unsubscribe$.complete();
|
|
27334
|
+
this.destroy$.next();
|
|
27335
|
+
this.destroy$.complete();
|
|
27091
27336
|
}
|
|
27092
27337
|
/***************************************************************************
|
|
27093
27338
|
* *
|
|
27094
|
-
*
|
|
27339
|
+
* Private methods *
|
|
27095
27340
|
* *
|
|
27096
27341
|
**************************************************************************/
|
|
27097
|
-
|
|
27098
|
-
|
|
27099
|
-
|
|
27100
|
-
|
|
27101
|
-
|
|
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
|
+
}
|
|
27102
27353
|
}
|
|
27103
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
27104
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type:
|
|
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 }); }
|
|
27105
27356
|
}
|
|
27106
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
27357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlDirective, decorators: [{
|
|
27107
27358
|
type: Directive,
|
|
27108
27359
|
args: [{
|
|
27109
|
-
selector:
|
|
27110
|
-
exportAs:
|
|
27360
|
+
selector: '[elderSearchUrl]',
|
|
27361
|
+
exportAs: 'elderSearchUrl'
|
|
27111
27362
|
}]
|
|
27112
|
-
}], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type:
|
|
27113
|
-
type: Input
|
|
27114
|
-
}] } });
|
|
27363
|
+
}], ctorParameters: function () { return [{ type: ElderSearchContextDirective }, { type: ElderSearchUrlService }]; } });
|
|
27115
27364
|
|
|
27365
|
+
// Because of AOT Compiler
|
|
27366
|
+
function initSearchUrlService(searchUrlService) {
|
|
27367
|
+
// Hack to use Lambda here!
|
|
27368
|
+
return () => { searchUrlService.init(); };
|
|
27369
|
+
}
|
|
27116
27370
|
class ElderSearchModule {
|
|
27117
27371
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
27118
27372
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, declarations: [ElderSearchContextDirective,
|
|
27119
|
-
|
|
27373
|
+
ElderSearchUrlDirective,
|
|
27120
27374
|
ElderSearchInputDirective,
|
|
27121
27375
|
ElderInitialValueDirective,
|
|
27122
27376
|
ElderSearchBoxComponent,
|
|
@@ -27128,11 +27382,18 @@ class ElderSearchModule {
|
|
|
27128
27382
|
ElderPanelModule,
|
|
27129
27383
|
ElderFormsDirectivesModule,
|
|
27130
27384
|
TranslateModule], exports: [ElderSearchContextDirective,
|
|
27131
|
-
|
|
27385
|
+
ElderSearchUrlDirective,
|
|
27132
27386
|
ElderSearchInputDirective,
|
|
27133
27387
|
ElderSearchBoxComponent,
|
|
27134
27388
|
ElderSearchPanelComponent] }); }
|
|
27135
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule,
|
|
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,
|
|
27136
27397
|
MatInputModule, MatButtonModule, MatIconModule,
|
|
27137
27398
|
MatBadgeModule,
|
|
27138
27399
|
A11yModule,
|
|
@@ -27144,6 +27405,14 @@ class ElderSearchModule {
|
|
|
27144
27405
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchModule, decorators: [{
|
|
27145
27406
|
type: NgModule,
|
|
27146
27407
|
args: [{
|
|
27408
|
+
providers: [
|
|
27409
|
+
{
|
|
27410
|
+
provide: APP_INITIALIZER,
|
|
27411
|
+
useFactory: initSearchUrlService,
|
|
27412
|
+
deps: [ElderSearchUrlService],
|
|
27413
|
+
multi: true
|
|
27414
|
+
},
|
|
27415
|
+
],
|
|
27147
27416
|
imports: [
|
|
27148
27417
|
CommonModule, FormsModule,
|
|
27149
27418
|
MatInputModule, MatButtonModule, MatIconModule,
|
|
@@ -27156,7 +27425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
27156
27425
|
],
|
|
27157
27426
|
declarations: [
|
|
27158
27427
|
ElderSearchContextDirective,
|
|
27159
|
-
|
|
27428
|
+
ElderSearchUrlDirective,
|
|
27160
27429
|
ElderSearchInputDirective,
|
|
27161
27430
|
ElderInitialValueDirective,
|
|
27162
27431
|
ElderSearchBoxComponent,
|
|
@@ -27164,7 +27433,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
27164
27433
|
],
|
|
27165
27434
|
exports: [
|
|
27166
27435
|
ElderSearchContextDirective,
|
|
27167
|
-
|
|
27436
|
+
ElderSearchUrlDirective,
|
|
27168
27437
|
ElderSearchInputDirective,
|
|
27169
27438
|
ElderSearchBoxComponent,
|
|
27170
27439
|
ElderSearchPanelComponent
|
|
@@ -27579,7 +27848,7 @@ class HttpDataTransferComponent {
|
|
|
27579
27848
|
**************************************************************************/
|
|
27580
27849
|
this.logger = LoggerFactory.getLogger(this.constructor.name);
|
|
27581
27850
|
this._transfer$ = new BehaviorSubject(null);
|
|
27582
|
-
this.$state = this._transfer$.pipe(filter(transfer => !!transfer), switchMap
|
|
27851
|
+
this.$state = this._transfer$.pipe(filter(transfer => !!transfer), switchMap(transfer => transfer.state$));
|
|
27583
27852
|
this.$detail = this.$state.pipe(map(state => this.renderTransferProgress(state)));
|
|
27584
27853
|
}
|
|
27585
27854
|
/***************************************************************************
|
|
@@ -27680,7 +27949,7 @@ class ElderDataTransferService {
|
|
|
27680
27949
|
return this._completed.asObservable();
|
|
27681
27950
|
}
|
|
27682
27951
|
get transferAggregate() {
|
|
27683
|
-
return this.transfers.pipe(switchMap
|
|
27952
|
+
return this.transfers.pipe(switchMap(transfers => this.aggregateProgress(transfers)), startWith(DataTransferProgressAggregate.Empty));
|
|
27684
27953
|
}
|
|
27685
27954
|
/***************************************************************************
|
|
27686
27955
|
* *
|
|
@@ -31125,5 +31394,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
31125
31394
|
* Generated bundle index. Do not edit.
|
|
31126
31395
|
*/
|
|
31127
31396
|
|
|
31128
|
-
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 };
|
|
31129
31398
|
//# sourceMappingURL=elderbyte-ngx-starter.mjs.map
|