@elderbyte/ngx-starter 14.6.0 → 14.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/esm2020/lib/common/data/data-context/data-context-active-page.mjs +1 -1
  2. package/esm2020/lib/common/data/data-context/data-context-base.mjs +2 -2
  3. package/esm2020/lib/common/data/data-context/data-context-continuable-base.mjs +1 -1
  4. package/esm2020/lib/common/data/data-context/data-context.mjs +1 -1
  5. package/esm2020/lib/common/data/datasource/data-source-adapter.mjs +1 -1
  6. package/esm2020/lib/common/data/datasource/data-source-processor.mjs +1 -1
  7. package/esm2020/lib/common/data/datasource/data-source.mjs +1 -1
  8. package/esm2020/lib/common/data/datasource/fetcher/delegate-data-source.mjs +1 -1
  9. package/esm2020/lib/common/data/datasource/local/local-list-data-source.mjs +1 -1
  10. package/esm2020/lib/common/data/datasource/local/local-paged-data-source.mjs +1 -1
  11. package/esm2020/lib/common/data/datasource/rest/rest-client.mjs +2 -2
  12. package/esm2020/lib/common/data/filters/filter-context.mjs +141 -0
  13. package/esm2020/lib/common/data/filters/filter.mjs +109 -0
  14. package/esm2020/lib/common/data/http-params-builder.mjs +2 -2
  15. package/esm2020/lib/common/data/public_api.mjs +3 -3
  16. package/esm2020/lib/common/data/required-filter-evaluator.mjs +1 -1
  17. package/esm2020/lib/common/data/token-chunk-request.mjs +1 -1
  18. package/esm2020/lib/common/utils/filter-util.mjs +1 -1
  19. package/esm2020/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.mjs +1 -1
  20. package/esm2020/lib/components/csv/elder-csv-stream-exporter.mjs +1 -1
  21. package/esm2020/lib/components/data-view/base/elder-data-view-options.mjs +1 -1
  22. package/esm2020/lib/components/forms/search/elder-search-context.directive.mjs +33 -19
  23. package/esm2020/lib/components/http-support/elder-http-client.service.mjs +1 -1
  24. package/esm2020/lib/components/input/autocomplete/elder-autocomplete-many.directive.mjs +2 -2
  25. package/esm2020/lib/components/input/autocomplete/elder-autocomplete.directive.mjs +2 -2
  26. package/esm2020/lib/components/measures/directives/elder-unit-select.directive.mjs +2 -2
  27. package/esm2020/lib/components/select/elder-select-base.mjs +2 -2
  28. package/esm2020/lib/components/select/popup/selection-model-popup.directive.mjs +1 -1
  29. package/fesm2015/elderbyte-ngx-starter.mjs +90 -27
  30. package/fesm2015/elderbyte-ngx-starter.mjs.map +1 -1
  31. package/fesm2020/elderbyte-ngx-starter.mjs +90 -27
  32. package/fesm2020/elderbyte-ngx-starter.mjs.map +1 -1
  33. package/lib/common/data/data-context/data-context-active-page.d.ts +1 -1
  34. package/lib/common/data/data-context/data-context-base.d.ts +2 -2
  35. package/lib/common/data/data-context/data-context-continuable-base.d.ts +1 -1
  36. package/lib/common/data/data-context/data-context.d.ts +2 -2
  37. package/lib/common/data/datasource/data-source-adapter.d.ts +1 -1
  38. package/lib/common/data/datasource/data-source-processor.d.ts +1 -1
  39. package/lib/common/data/datasource/data-source.d.ts +1 -1
  40. package/lib/common/data/datasource/fetcher/delegate-data-source.d.ts +1 -1
  41. package/lib/common/data/datasource/local/local-list-data-source.d.ts +1 -1
  42. package/lib/common/data/datasource/local/local-paged-data-source.d.ts +1 -1
  43. package/lib/common/data/datasource/rest/rest-client.d.ts +1 -1
  44. package/lib/common/data/{filter-context.d.ts → filters/filter-context.d.ts} +3 -1
  45. package/lib/common/data/{filter.d.ts → filters/filter.d.ts} +15 -3
  46. package/lib/common/data/http-params-builder.d.ts +1 -1
  47. package/lib/common/data/public_api.d.ts +2 -2
  48. package/lib/common/data/required-filter-evaluator.d.ts +2 -2
  49. package/lib/common/data/token-chunk-request.d.ts +1 -1
  50. package/lib/common/utils/filter-util.d.ts +1 -1
  51. package/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.d.ts +1 -1
  52. package/lib/components/csv/elder-csv-stream-exporter.d.ts +1 -1
  53. package/lib/components/data-view/base/elder-data-view-options.d.ts +1 -1
  54. package/lib/components/forms/search/elder-search-context.directive.d.ts +15 -12
  55. package/lib/components/http-support/elder-http-client.service.d.ts +1 -1
  56. package/lib/components/input/autocomplete/elder-autocomplete-many.directive.d.ts +1 -1
  57. package/lib/components/input/autocomplete/elder-autocomplete.directive.d.ts +1 -1
  58. package/lib/components/select/elder-select-base.d.ts +1 -1
  59. package/lib/components/select/popup/selection-model-popup.directive.d.ts +1 -1
  60. package/package.json +1 -1
  61. package/esm2020/lib/common/data/filter-context.mjs +0 -129
  62. package/esm2020/lib/common/data/filter.mjs +0 -72
@@ -6,7 +6,7 @@ import * as i1 from '@angular/platform-browser';
6
6
  import { Duration, Period, TemporalQueries, LocalTime, Instant, LocalDate, nativeJs, ZoneId } from '@js-joda/core';
7
7
  import { LoggerFactory } from '@elderbyte/ts-logger';
8
8
  import { BehaviorSubject, Subject, EMPTY, combineLatest, merge, of, forkJoin, throwError, mergeWith, switchMap as switchMap$1, Observable, ReplaySubject, fromEvent, NEVER } from 'rxjs';
9
- import { distinctUntilChanged, map, filter, takeUntil, debounceTime, catchError, first, take, switchMap, mergeMap, takeWhile, tap, expand, reduce, startWith, skip, delay, share, throttleTime, flatMap, timeout, skipWhile } from 'rxjs/operators';
9
+ import { distinctUntilChanged, map, filter, takeUntil, debounceTime, catchError, first, take, switchMap, mergeMap, takeWhile, tap, expand, reduce, startWith, skip, delay, share, throttleTime, combineLatestWith, flatMap, 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';
@@ -2299,13 +2299,34 @@ class Filter {
2299
2299
  }
2300
2300
  /***************************************************************************
2301
2301
  * *
2302
- * Properties *
2302
+ * Public API *
2303
2303
  * *
2304
2304
  **************************************************************************/
2305
+ static merge(current, forcedFilter) {
2306
+ let newFilterValue;
2307
+ if (Filter.isMulti(current) || Filter.isMulti(forcedFilter)) {
2308
+ // We have a list of values. We just have to ensure our forced values are in there
2309
+ const valueSet = new Set();
2310
+ Filter.addValuesToSet(valueSet, current);
2311
+ Filter.addValuesToSet(valueSet, forcedFilter);
2312
+ newFilterValue = Array.from(valueSet);
2313
+ }
2314
+ else {
2315
+ newFilterValue = forcedFilter.value;
2316
+ }
2317
+ return new Filter(current.key, newFilterValue);
2318
+ }
2319
+ /**
2320
+ * Checks if this filter supports multiple values.
2321
+ * @param filter
2322
+ */
2323
+ static isMulti(filter) {
2324
+ return Array.isArray(filter.value);
2325
+ }
2305
2326
  /**
2306
2327
  * Checks if this filter has a value.
2307
- * This is the case when the value is non null and
2308
- * in case its an array, also non empty.
2328
+ * This is the case when the value is non-null and
2329
+ * in case it's an array, also non-empty.
2309
2330
  */
2310
2331
  static hasValue(self) {
2311
2332
  if (!self) {
@@ -2343,15 +2364,31 @@ class Filter {
2343
2364
  return true;
2344
2365
  } // Same key and same value reference
2345
2366
  // In case the filter has a multi value array, we need to compare those by value
2346
- if (self.value instanceof Array || other.value instanceof Array) {
2347
- const valueArr = self.value instanceof Array ? self.value : [self.value];
2348
- const otherArr = other instanceof Array ? other : [other];
2367
+ if (Array.isArray(self.value) || Array.isArray(other.value)) {
2368
+ const valueArr = Array.isArray(self.value) ? self.value : [self.value];
2369
+ const otherArr = Array.isArray(other.value) ? other.value : [other.value];
2349
2370
  return CollectionUtil.equalSetDeep(new Set(valueArr), new Set(otherArr));
2350
2371
  }
2351
2372
  else {
2352
2373
  return false; // Otherwise, they are not equal
2353
2374
  }
2354
2375
  }
2376
+ /***************************************************************************
2377
+ * *
2378
+ * Private methods *
2379
+ * *
2380
+ **************************************************************************/
2381
+ static addValuesToSet(valueSet, filter) {
2382
+ const filterValue = filter.value;
2383
+ if (Array.isArray(filterValue)) {
2384
+ const values = filterValue;
2385
+ values.forEach(v => valueSet.add(v));
2386
+ }
2387
+ else {
2388
+ const value = filterValue;
2389
+ valueSet.add(value);
2390
+ }
2391
+ }
2355
2392
  }
2356
2393
 
2357
2394
  class FilterContext {
@@ -2361,7 +2398,7 @@ class FilterContext {
2361
2398
  * Fields *
2362
2399
  * *
2363
2400
  **************************************************************************/
2364
- this._filters = new BehaviorSubject([]);
2401
+ this._filters$ = new BehaviorSubject([]);
2365
2402
  }
2366
2403
  /***************************************************************************
2367
2404
  * *
@@ -2399,10 +2436,10 @@ class FilterContext {
2399
2436
  * *
2400
2437
  **************************************************************************/
2401
2438
  get filters() {
2402
- return this._filters.asObservable().pipe(distinctUntilChanged((a, b) => this.equals(a, b)));
2439
+ return this._filters$.asObservable().pipe(distinctUntilChanged((a, b) => this.equals(a, b)));
2403
2440
  }
2404
2441
  get filtersSnapshot() {
2405
- return this._filters.getValue();
2442
+ return this._filters$.getValue();
2406
2443
  }
2407
2444
  findFilterValue(key) {
2408
2445
  const f = this.findFilter(key);
@@ -2450,11 +2487,23 @@ class FilterContext {
2450
2487
  * @param newFilters
2451
2488
  */
2452
2489
  replaceFilters(newFilters) {
2453
- this._filters.next(newFilters || []);
2490
+ this._filters$.next(newFilters || []);
2454
2491
  }
2455
2492
  clear() {
2456
2493
  this.replaceFilters([]);
2457
2494
  }
2495
+ mergeFilters(filters) {
2496
+ filters.forEach(filter => this.mergeFilter(filter));
2497
+ }
2498
+ mergeFilter(filter) {
2499
+ const existing = this.findFilter(filter.key);
2500
+ if (!existing) {
2501
+ this.updateFilter(filter);
2502
+ }
2503
+ else {
2504
+ this.updateFilter(Filter.merge(existing, filter));
2505
+ }
2506
+ }
2458
2507
  /***************************************************************************
2459
2508
  * *
2460
2509
  * Private methods *
@@ -18901,18 +18950,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
18901
18950
  * and holds their values in a central search model.
18902
18951
  */
18903
18952
  class ElderSearchContextDirective {
18904
- /***************************************************************************
18905
- * *
18906
- * Constructor *
18907
- * *
18908
- **************************************************************************/
18909
18953
  constructor() {
18910
18954
  /***************************************************************************
18911
18955
  * *
18912
18956
  * Fields *
18913
18957
  * *
18914
18958
  **************************************************************************/
18915
- this.log = LoggerFactory.getLogger('ElderSearchContextDirective');
18959
+ this.forcedFilters$ = new BehaviorSubject$1([]);
18960
+ this.log = LoggerFactory.getLogger(this.constructor.name);
18916
18961
  this.unsubscribe$ = new Subject$1();
18917
18962
  this._searchInputs = new BehaviorSubject$1([]);
18918
18963
  this._searchStates = new BehaviorSubject$1([]);
@@ -18923,16 +18968,12 @@ class ElderSearchContextDirective {
18923
18968
  * Life Cycle *
18924
18969
  * *
18925
18970
  **************************************************************************/
18926
- ngOnInit() { }
18927
18971
  ngAfterViewInit() {
18928
- this._searchInputs.pipe(takeUntil(this.unsubscribe$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), debounceTime(5)).subscribe(states => {
18972
+ this._searchInputs.pipe(takeUntil(this.unsubscribe$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), combineLatestWith(this.forcedFilters$), debounceTime(5)).subscribe(([states, forcedFilters]) => {
18929
18973
  this._searchStates.next(states);
18930
- const filters = this.convertToFilters(states);
18931
- this._filters.next(filters);
18932
- this.log.trace('Search-Model filters updated:', filters);
18933
- if (this.filterContext) {
18934
- this.filterContext.updateFilters(filters);
18935
- }
18974
+ const userFilters = this.convertToFilters(states);
18975
+ this._filters.next(userFilters);
18976
+ this.applyFilters(userFilters, forcedFilters);
18936
18977
  });
18937
18978
  }
18938
18979
  ngOnDestroy() {
@@ -18950,6 +18991,18 @@ class ElderSearchContextDirective {
18950
18991
  get filterContext() {
18951
18992
  return this._filterContext;
18952
18993
  }
18994
+ /**
18995
+ * Forced filters are always merged into the final FilterContext.
18996
+ *
18997
+ * This means they override user defined filters, but attempt
18998
+ * to also keep the users intent (by merging) them.
18999
+ */
19000
+ set forcedFilters(filters) {
19001
+ this.forcedFilters$.next(filters);
19002
+ }
19003
+ get forcedFilters() {
19004
+ return this.forcedFilters$.getValue();
19005
+ }
18953
19006
  get attributes() {
18954
19007
  return this._searchInputs.asObservable();
18955
19008
  }
@@ -19006,18 +19059,28 @@ class ElderSearchContextDirective {
19006
19059
  return states
19007
19060
  .map(s => new Filter(s.queryKey, s.queryValue));
19008
19061
  }
19062
+ applyFilters(userFilters, forcedFilters) {
19063
+ const context = this.filterContext;
19064
+ if (context) {
19065
+ context.updateFilters(userFilters);
19066
+ context.mergeFilters(forcedFilters);
19067
+ this.log.trace('Search-Model filters updated:', Array.from(context.filtersSnapshot));
19068
+ }
19069
+ }
19009
19070
  }
19010
19071
  ElderSearchContextDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
19011
- ElderSearchContextDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"] }, exportAs: ["elderSearchContext"], ngImport: i0 });
19072
+ ElderSearchContextDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, exportAs: ["elderSearchContext"], ngImport: i0 });
19012
19073
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
19013
19074
  type: Directive,
19014
19075
  args: [{
19015
19076
  selector: '[elderSearchContext]',
19016
19077
  exportAs: 'elderSearchContext'
19017
19078
  }]
19018
- }], ctorParameters: function () { return []; }, propDecorators: { filterContext: [{
19079
+ }], propDecorators: { filterContext: [{
19019
19080
  type: Input,
19020
19081
  args: ['elderSearchContext']
19082
+ }], forcedFilters: [{
19083
+ type: Input
19021
19084
  }] } });
19022
19085
 
19023
19086
  /**