@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';
@@ -2309,13 +2309,34 @@ class Filter {
2309
2309
  }
2310
2310
  /***************************************************************************
2311
2311
  * *
2312
- * Properties *
2312
+ * Public API *
2313
2313
  * *
2314
2314
  **************************************************************************/
2315
+ static merge(current, forcedFilter) {
2316
+ let newFilterValue;
2317
+ if (Filter.isMulti(current) || Filter.isMulti(forcedFilter)) {
2318
+ // We have a list of values. We just have to ensure our forced values are in there
2319
+ const valueSet = new Set();
2320
+ Filter.addValuesToSet(valueSet, current);
2321
+ Filter.addValuesToSet(valueSet, forcedFilter);
2322
+ newFilterValue = Array.from(valueSet);
2323
+ }
2324
+ else {
2325
+ newFilterValue = forcedFilter.value;
2326
+ }
2327
+ return new Filter(current.key, newFilterValue);
2328
+ }
2329
+ /**
2330
+ * Checks if this filter supports multiple values.
2331
+ * @param filter
2332
+ */
2333
+ static isMulti(filter) {
2334
+ return Array.isArray(filter.value);
2335
+ }
2315
2336
  /**
2316
2337
  * Checks if this filter has a value.
2317
- * This is the case when the value is non null and
2318
- * in case its an array, also non empty.
2338
+ * This is the case when the value is non-null and
2339
+ * in case it's an array, also non-empty.
2319
2340
  */
2320
2341
  static hasValue(self) {
2321
2342
  if (!self) {
@@ -2353,15 +2374,31 @@ class Filter {
2353
2374
  return true;
2354
2375
  } // Same key and same value reference
2355
2376
  // In case the filter has a multi value array, we need to compare those by value
2356
- if (self.value instanceof Array || other.value instanceof Array) {
2357
- const valueArr = self.value instanceof Array ? self.value : [self.value];
2358
- const otherArr = other instanceof Array ? other : [other];
2377
+ if (Array.isArray(self.value) || Array.isArray(other.value)) {
2378
+ const valueArr = Array.isArray(self.value) ? self.value : [self.value];
2379
+ const otherArr = Array.isArray(other.value) ? other.value : [other.value];
2359
2380
  return CollectionUtil.equalSetDeep(new Set(valueArr), new Set(otherArr));
2360
2381
  }
2361
2382
  else {
2362
2383
  return false; // Otherwise, they are not equal
2363
2384
  }
2364
2385
  }
2386
+ /***************************************************************************
2387
+ * *
2388
+ * Private methods *
2389
+ * *
2390
+ **************************************************************************/
2391
+ static addValuesToSet(valueSet, filter) {
2392
+ const filterValue = filter.value;
2393
+ if (Array.isArray(filterValue)) {
2394
+ const values = filterValue;
2395
+ values.forEach(v => valueSet.add(v));
2396
+ }
2397
+ else {
2398
+ const value = filterValue;
2399
+ valueSet.add(value);
2400
+ }
2401
+ }
2365
2402
  }
2366
2403
 
2367
2404
  class FilterContext {
@@ -2371,7 +2408,7 @@ class FilterContext {
2371
2408
  * Fields *
2372
2409
  * *
2373
2410
  **************************************************************************/
2374
- this._filters = new BehaviorSubject([]);
2411
+ this._filters$ = new BehaviorSubject([]);
2375
2412
  }
2376
2413
  /***************************************************************************
2377
2414
  * *
@@ -2409,10 +2446,10 @@ class FilterContext {
2409
2446
  * *
2410
2447
  **************************************************************************/
2411
2448
  get filters() {
2412
- return this._filters.asObservable().pipe(distinctUntilChanged((a, b) => this.equals(a, b)));
2449
+ return this._filters$.asObservable().pipe(distinctUntilChanged((a, b) => this.equals(a, b)));
2413
2450
  }
2414
2451
  get filtersSnapshot() {
2415
- return this._filters.getValue();
2452
+ return this._filters$.getValue();
2416
2453
  }
2417
2454
  findFilterValue(key) {
2418
2455
  const f = this.findFilter(key);
@@ -2460,11 +2497,23 @@ class FilterContext {
2460
2497
  * @param newFilters
2461
2498
  */
2462
2499
  replaceFilters(newFilters) {
2463
- this._filters.next(newFilters || []);
2500
+ this._filters$.next(newFilters || []);
2464
2501
  }
2465
2502
  clear() {
2466
2503
  this.replaceFilters([]);
2467
2504
  }
2505
+ mergeFilters(filters) {
2506
+ filters.forEach(filter => this.mergeFilter(filter));
2507
+ }
2508
+ mergeFilter(filter) {
2509
+ const existing = this.findFilter(filter.key);
2510
+ if (!existing) {
2511
+ this.updateFilter(filter);
2512
+ }
2513
+ else {
2514
+ this.updateFilter(Filter.merge(existing, filter));
2515
+ }
2516
+ }
2468
2517
  /***************************************************************************
2469
2518
  * *
2470
2519
  * Private methods *
@@ -18965,18 +19014,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
18965
19014
  * and holds their values in a central search model.
18966
19015
  */
18967
19016
  class ElderSearchContextDirective {
18968
- /***************************************************************************
18969
- * *
18970
- * Constructor *
18971
- * *
18972
- **************************************************************************/
18973
19017
  constructor() {
18974
19018
  /***************************************************************************
18975
19019
  * *
18976
19020
  * Fields *
18977
19021
  * *
18978
19022
  **************************************************************************/
18979
- this.log = LoggerFactory.getLogger('ElderSearchContextDirective');
19023
+ this.forcedFilters$ = new BehaviorSubject$1([]);
19024
+ this.log = LoggerFactory.getLogger(this.constructor.name);
18980
19025
  this.unsubscribe$ = new Subject$1();
18981
19026
  this._searchInputs = new BehaviorSubject$1([]);
18982
19027
  this._searchStates = new BehaviorSubject$1([]);
@@ -18987,16 +19032,12 @@ class ElderSearchContextDirective {
18987
19032
  * Life Cycle *
18988
19033
  * *
18989
19034
  **************************************************************************/
18990
- ngOnInit() { }
18991
19035
  ngAfterViewInit() {
18992
- this._searchInputs.pipe(takeUntil(this.unsubscribe$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), debounceTime(5)).subscribe(states => {
19036
+ this._searchInputs.pipe(takeUntil(this.unsubscribe$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), combineLatestWith(this.forcedFilters$), debounceTime(5)).subscribe(([states, forcedFilters]) => {
18993
19037
  this._searchStates.next(states);
18994
- const filters = this.convertToFilters(states);
18995
- this._filters.next(filters);
18996
- this.log.trace('Search-Model filters updated:', filters);
18997
- if (this.filterContext) {
18998
- this.filterContext.updateFilters(filters);
18999
- }
19038
+ const userFilters = this.convertToFilters(states);
19039
+ this._filters.next(userFilters);
19040
+ this.applyFilters(userFilters, forcedFilters);
19000
19041
  });
19001
19042
  }
19002
19043
  ngOnDestroy() {
@@ -19014,6 +19055,18 @@ class ElderSearchContextDirective {
19014
19055
  get filterContext() {
19015
19056
  return this._filterContext;
19016
19057
  }
19058
+ /**
19059
+ * Forced filters are always merged into the final FilterContext.
19060
+ *
19061
+ * This means they override user defined filters, but attempt
19062
+ * to also keep the users intent (by merging) them.
19063
+ */
19064
+ set forcedFilters(filters) {
19065
+ this.forcedFilters$.next(filters);
19066
+ }
19067
+ get forcedFilters() {
19068
+ return this.forcedFilters$.getValue();
19069
+ }
19017
19070
  get attributes() {
19018
19071
  return this._searchInputs.asObservable();
19019
19072
  }
@@ -19070,18 +19123,28 @@ class ElderSearchContextDirective {
19070
19123
  return states
19071
19124
  .map(s => new Filter(s.queryKey, s.queryValue));
19072
19125
  }
19126
+ applyFilters(userFilters, forcedFilters) {
19127
+ const context = this.filterContext;
19128
+ if (context) {
19129
+ context.updateFilters(userFilters);
19130
+ context.mergeFilters(forcedFilters);
19131
+ this.log.trace('Search-Model filters updated:', Array.from(context.filtersSnapshot));
19132
+ }
19133
+ }
19073
19134
  }
19074
19135
  ElderSearchContextDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
19075
- ElderSearchContextDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"] }, exportAs: ["elderSearchContext"], ngImport: i0 });
19136
+ 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 });
19076
19137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
19077
19138
  type: Directive,
19078
19139
  args: [{
19079
19140
  selector: '[elderSearchContext]',
19080
19141
  exportAs: 'elderSearchContext'
19081
19142
  }]
19082
- }], ctorParameters: function () { return []; }, propDecorators: { filterContext: [{
19143
+ }], propDecorators: { filterContext: [{
19083
19144
  type: Input,
19084
19145
  args: ['elderSearchContext']
19146
+ }], forcedFilters: [{
19147
+ type: Input
19085
19148
  }] } });
19086
19149
 
19087
19150
  /**