@elderbyte/ngx-starter 16.3.4 → 16.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/esm2022/lib/common/data/data-context/data-context-active-page.mjs +5 -5
  2. package/esm2022/lib/common/data/data-context/data-context-auto-starter.mjs +2 -2
  3. package/esm2022/lib/common/data/data-context/data-context-base.mjs +58 -28
  4. package/esm2022/lib/common/data/data-context/data-context-continuable-base.mjs +7 -7
  5. package/esm2022/lib/common/data/data-context/data-context-continuable-paged.mjs +10 -10
  6. package/esm2022/lib/common/data/data-context/data-context-continuable-token.mjs +8 -8
  7. package/esm2022/lib/common/data/data-context/data-context-simple.mjs +6 -5
  8. package/esm2022/lib/common/data/data-context/data-context-source-event-binding.mjs +2 -2
  9. package/esm2022/lib/common/data/data-context/data-context.mjs +1 -1
  10. package/esm2022/lib/common/data/filters/filter-context.mjs +12 -26
  11. package/esm2022/lib/common/data/sort-context.mjs +2 -2
  12. package/esm2022/lib/common/utils/filter-util.mjs +19 -1
  13. package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +2 -2
  14. package/esm2022/lib/components/forms/search/domain/context/search-context.mjs +52 -0
  15. package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +42 -0
  16. package/esm2022/lib/components/forms/search/domain/input/search-input-state.mjs +81 -0
  17. package/esm2022/lib/components/forms/search/domain/input/search-input.mjs +2 -0
  18. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +74 -0
  19. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +162 -0
  20. package/esm2022/lib/components/forms/search/domain/url/search-query-params-parser.mjs +81 -0
  21. package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +87 -51
  22. package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +6 -5
  23. package/esm2022/lib/components/forms/search/elder-search.module.mjs +30 -9
  24. package/fesm2022/elderbyte-ngx-starter.mjs +657 -430
  25. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  26. package/lib/common/data/data-context/data-context-base.d.ts +10 -3
  27. package/lib/common/data/data-context/data-context.d.ts +6 -1
  28. package/lib/common/data/filters/filter-context.d.ts +1 -6
  29. package/lib/common/utils/filter-util.d.ts +1 -0
  30. package/lib/components/forms/search/domain/context/search-context.d.ts +37 -0
  31. package/lib/components/forms/search/domain/context/search-context.service.d.ts +25 -0
  32. package/lib/components/forms/search/{elder-search-context-url-binding.directive.d.ts → domain/url/elder-search-url.directive.d.ts} +12 -13
  33. package/lib/components/forms/search/domain/url/elder-search-url.service.d.ts +60 -0
  34. package/lib/components/forms/search/domain/url/search-query-params-parser.d.ts +36 -0
  35. package/lib/components/forms/search/elder-search-context.directive.d.ts +29 -16
  36. package/lib/components/forms/search/elder-search-input.directive.d.ts +2 -2
  37. package/lib/components/forms/search/elder-search.module.d.ts +5 -3
  38. package/package.json +1 -1
  39. package/esm2022/lib/components/forms/search/elder-search-context-url-binding.directive.mjs +0 -71
  40. package/esm2022/lib/components/forms/search/model/search-input-state.mjs +0 -81
  41. package/esm2022/lib/components/forms/search/model/search-input.mjs +0 -2
  42. package/esm2022/lib/components/forms/search/search-box/elder-search-context-filters.mjs +0 -10
  43. package/esm2022/lib/components/forms/search/search-box/elder-search-url-binding.service.mjs +0 -184
  44. package/lib/components/forms/search/search-box/elder-search-context-filters.d.ts +0 -7
  45. package/lib/components/forms/search/search-box/elder-search-url-binding.service.d.ts +0 -74
  46. /package/lib/components/forms/search/{model → domain/input}/search-input-state.d.ts +0 -0
  47. /package/lib/components/forms/search/{model → domain/input}/search-input.d.ts +0 -0
@@ -16,7 +16,12 @@ export declare abstract class DataContextBase<T, TId = any> extends DataSource<T
16
16
  * Fields *
17
17
  * *
18
18
  **************************************************************************/
19
+ private static DC_ID_COUNTER;
19
20
  private readonly baselog;
21
+ /**
22
+ * ID of this DataContext
23
+ */
24
+ readonly id: string;
20
25
  private readonly _dataSource;
21
26
  private readonly _filter;
22
27
  private readonly _sort;
@@ -27,8 +32,10 @@ export declare abstract class DataContextBase<T, TId = any> extends DataSource<T
27
32
  private readonly _started;
28
33
  private readonly _closed;
29
34
  private readonly _customIndex;
35
+ private _reloadCounter;
30
36
  private readonly _reloadQueue;
31
- protected readonly unsubscribe$: Subject<void>;
37
+ private readonly _reloaded;
38
+ protected readonly destroy$: Subject<void>;
32
39
  /***************************************************************************
33
40
  * *
34
41
  * Constructor *
@@ -71,7 +78,7 @@ export declare abstract class DataContextBase<T, TId = any> extends DataSource<T
71
78
  * *
72
79
  **************************************************************************/
73
80
  start(sorts?: Sort[], filters?: Filter[]): Observable<any>;
74
- reload(): void;
81
+ reload(reason?: string): Observable<any>;
75
82
  findByIndex(key: any): T | undefined;
76
83
  findById(id: any): T | undefined;
77
84
  /**
@@ -85,7 +92,7 @@ export declare abstract class DataContextBase<T, TId = any> extends DataSource<T
85
92
  * Protected methods *
86
93
  * *
87
94
  **************************************************************************/
88
- protected reloadNow(): Observable<any>;
95
+ private reloadNow;
89
96
  /**
90
97
  * Append the given rows to the existing ones.
91
98
  */
@@ -24,6 +24,11 @@ export interface IDataContext<T> {
24
24
  * Properties *
25
25
  * *
26
26
  **************************************************************************/
27
+ /**
28
+ * An auto generated id of this DataContext instance.
29
+ * Mostly for debugging purposes.
30
+ */
31
+ readonly id: string;
27
32
  /**
28
33
  * Gets the underlying DataSource of this DataContext.
29
34
  */
@@ -88,7 +93,7 @@ export interface IDataContext<T> {
88
93
  * Requests a reload of the current data / chunk.
89
94
  * Attempts to keep the current position.
90
95
  */
91
- reload(): void;
96
+ reload(reason?: string): Observable<any>;
92
97
  /**
93
98
  * Refresh the data view from the local data model. (Does not request new data from the server)
94
99
  * Useful if the data model has changes that need to be reflected in the UI.
@@ -26,6 +26,7 @@ export declare class FilterContext {
26
26
  * Read API *
27
27
  * *
28
28
  **************************************************************************/
29
+ get isEmpty(): boolean;
29
30
  get filters(): Observable<Filter[]>;
30
31
  get filtersSnapshot(): Filter[];
31
32
  findFilterValue(key: string): string | string[] | undefined;
@@ -56,10 +57,4 @@ export declare class FilterContext {
56
57
  clear(): void;
57
58
  mergeFilters(filters: Filter[]): void;
58
59
  mergeFilter(filter: Filter): void;
59
- /***************************************************************************
60
- * *
61
- * Private methods *
62
- * *
63
- **************************************************************************/
64
- private equals;
65
60
  }
@@ -1,6 +1,7 @@
1
1
  import { Filter } from '../data/filters/filter';
2
2
  export declare class FilterUtil {
3
3
  private static readonly logger;
4
+ static equals(aFilters: Filter[], bFilters: Filter[]): boolean;
4
5
  /**
5
6
  * Merge the provided filter sets. The second parameter will
6
7
  * replace filters which exist in the first.
@@ -0,0 +1,37 @@
1
+ import { FilterContext } from '../../../../../common/data/filters/filter-context';
2
+ import { Observable } from 'rxjs';
3
+ import { Filter } from '../../../../../common/data/filters/filter';
4
+ export declare class SearchContext {
5
+ static standalone(): SearchContext;
6
+ /***************************************************************************
7
+ * *
8
+ * Fields *
9
+ * *
10
+ **************************************************************************/
11
+ private readonly log;
12
+ readonly id: string;
13
+ private readonly userFilterContext;
14
+ private readonly forcedFilterContext;
15
+ private readonly _allFilters$;
16
+ /***************************************************************************
17
+ * *
18
+ * Constructor *
19
+ * *
20
+ **************************************************************************/
21
+ constructor(id: string);
22
+ /***************************************************************************
23
+ * *
24
+ * Properties *
25
+ * *
26
+ **************************************************************************/
27
+ get allFiltersChanged(): Observable<Filter[]>;
28
+ get userFilters(): FilterContext;
29
+ get forcedFilters(): FilterContext;
30
+ /***************************************************************************
31
+ * *
32
+ * Public API *
33
+ * *
34
+ **************************************************************************/
35
+ updateUserFilters(filters: Filter[]): void;
36
+ replaceUserFilters(filters: Filter[]): void;
37
+ }
@@ -0,0 +1,25 @@
1
+ import { SearchContext } from './search-context';
2
+ import * as i0 from "@angular/core";
3
+ export declare class SearchContextService {
4
+ /***************************************************************************
5
+ * *
6
+ * Fields *
7
+ * *
8
+ **************************************************************************/
9
+ private readonly log;
10
+ private readonly searchContexts;
11
+ /***************************************************************************
12
+ * *
13
+ * Constructor *
14
+ * *
15
+ **************************************************************************/
16
+ constructor();
17
+ /***************************************************************************
18
+ * *
19
+ * Public API *
20
+ * *
21
+ **************************************************************************/
22
+ context(contextId: string): SearchContext;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<SearchContextService, never>;
24
+ static ɵprov: i0.ɵɵInjectableDeclaration<SearchContextService>;
25
+ }
@@ -1,14 +1,13 @@
1
- import { AfterViewInit, OnDestroy } from "@angular/core";
2
- import { ElderSearchUrlBindingService } from "./search-box/elder-search-url-binding.service";
3
- import { ElderSearchContextDirective } from "./elder-search-context.directive";
1
+ import { AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { ElderSearchContextDirective } from '../../elder-search-context.directive';
3
+ import { ElderSearchUrlService } from './elder-search-url.service';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
6
  * The search container manages a group of search-inputs
7
7
  * and holds their values in a central search model.
8
8
  */
9
- export declare class ElderSearchContextUrlBindingDirective implements AfterViewInit, OnDestroy {
10
- private searchContext;
11
- private urlBindingService;
9
+ export declare class ElderSearchUrlDirective implements AfterViewInit, OnDestroy {
10
+ private readonly searchUrlService;
12
11
  /***************************************************************************
13
12
  * *
14
13
  * Fields *
@@ -16,13 +15,14 @@ export declare class ElderSearchContextUrlBindingDirective implements AfterViewI
16
15
  **************************************************************************/
17
16
  private readonly log;
18
17
  private readonly destroy$;
19
- private _urlBinding;
18
+ private readonly searchContextId;
19
+ private readonly searchContext$;
20
20
  /***************************************************************************
21
21
  * *
22
22
  * Constructor *
23
23
  * *
24
24
  **************************************************************************/
25
- constructor(searchContext: ElderSearchContextDirective, urlBindingService: ElderSearchUrlBindingService);
25
+ constructor(searchContextDirective: ElderSearchContextDirective, searchUrlService: ElderSearchUrlService);
26
26
  /***************************************************************************
27
27
  * *
28
28
  * Life Cycle *
@@ -32,11 +32,10 @@ export declare class ElderSearchContextUrlBindingDirective implements AfterViewI
32
32
  ngOnDestroy(): void;
33
33
  /***************************************************************************
34
34
  * *
35
- * Properties *
35
+ * Private methods *
36
36
  * *
37
37
  **************************************************************************/
38
- set elderSearchContextUrlBinding(value: string);
39
- get elderSearchContextUrlBinding(): string;
40
- static ɵfac: i0.ɵɵFactoryDeclaration<ElderSearchContextUrlBindingDirective, never>;
41
- static ɵdir: i0.ɵɵDirectiveDeclaration<ElderSearchContextUrlBindingDirective, "[elderSearchContextUrlBinding]", ["elderSearchContextUrlBinding"], { "elderSearchContextUrlBinding": { "alias": "elderSearchContextUrlBinding"; "required": false; }; }, {}, never, never, false, never>;
38
+ private applyUrlFilters;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElderSearchUrlDirective, never>;
40
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ElderSearchUrlDirective, "[elderSearchUrl]", ["elderSearchUrl"], {}, {}, never, never, false, never>;
42
41
  }
@@ -0,0 +1,60 @@
1
+ import { Router } from '@angular/router';
2
+ import { Filter } from '../../../../../common/data/filters/filter';
3
+ import { Observable } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export declare class UrlFilterByContext {
6
+ private readonly byContext;
7
+ constructor(urlFiltersByContext?: Map<string, UrlFilters>);
8
+ filtersOf(contextId: string): UrlFilters;
9
+ static empty(): UrlFilterByContext;
10
+ withUrlFilters(current: Map<string, Filter[]>): UrlFilterByContext;
11
+ }
12
+ export declare class UrlFilters {
13
+ private readonly filters;
14
+ consumed: boolean;
15
+ constructor(filters: Filter[]);
16
+ consumeFilters(): Filter[];
17
+ }
18
+ export declare class ElderSearchUrlService {
19
+ private router;
20
+ /***************************************************************************
21
+ * *
22
+ * Fields *
23
+ * *
24
+ **************************************************************************/
25
+ private readonly log;
26
+ private readonly SEARCH_QUERY_KEY;
27
+ private readonly paramsParser;
28
+ private readonly urlFiltersByContext$;
29
+ /***************************************************************************
30
+ * *
31
+ * Constructor *
32
+ * *
33
+ **************************************************************************/
34
+ constructor(router: Router);
35
+ /***************************************************************************
36
+ * *
37
+ * Public API *
38
+ * *
39
+ **************************************************************************/
40
+ init(): void;
41
+ urlFiltersOfContext$(contextId: string): Observable<UrlFilters>;
42
+ updateQueryParams(contextId: string, filters: Filter[]): void;
43
+ /***************************************************************************
44
+ * *
45
+ * Private methods *
46
+ * *
47
+ **************************************************************************/
48
+ private updateSeenUrlFilters;
49
+ private logRouterEvents;
50
+ private parseUrlFilters;
51
+ private collectAllRouteParams;
52
+ private collectRouteQueryParams;
53
+ private extractUrlFilters;
54
+ private resetSearchParams;
55
+ private buildQueryParams;
56
+ private queryParamKey;
57
+ private convertValueToArrayOrSingleValue;
58
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElderSearchUrlService, never>;
59
+ static ɵprov: i0.ɵɵInjectableDeclaration<ElderSearchUrlService>;
60
+ }
@@ -0,0 +1,36 @@
1
+ import { Filter } from '../../../../../common/data/filters/filter';
2
+ import { Params } from '@angular/router';
3
+ export declare class SearchQueryParamsParser {
4
+ /***************************************************************************
5
+ * *
6
+ * Fields *
7
+ * *
8
+ **************************************************************************/
9
+ private readonly log;
10
+ private readonly queryPrefix;
11
+ /***************************************************************************
12
+ * *
13
+ * Constructor *
14
+ * *
15
+ **************************************************************************/
16
+ constructor(queryPrefix: string);
17
+ /***************************************************************************
18
+ * *
19
+ * Public API *
20
+ * *
21
+ **************************************************************************/
22
+ parse(params: Params): Map<string, Filter[]>;
23
+ /***************************************************************************
24
+ * *
25
+ * Private methods *
26
+ * *
27
+ **************************************************************************/
28
+ private extractSearchParameters;
29
+ private buildSearchContextMap;
30
+ private checkAndSetFilter;
31
+ private extractFilterParam;
32
+ private convertFilterStringToFilter;
33
+ private isSingularArrayValue;
34
+ private convertValueToArray;
35
+ private checkIfParamIsArray;
36
+ }
@@ -1,40 +1,45 @@
1
- import { AfterContentInit, AfterViewInit, OnDestroy } from "@angular/core";
2
- import { Observable } from "rxjs/internal/Observable";
3
- import { SearchInput } from "./model/search-input";
4
- import { Filter } from "../../../common/data/filters/filter";
5
- import { FilterContext } from "../../../common/data/filters/filter-context";
6
- import { SearchInputState } from "./model/search-input-state";
1
+ import { AfterContentInit, AfterViewInit, OnDestroy, OnInit } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { SearchInput } from './domain/input/search-input';
4
+ import { Filter } from '../../../common/data/filters/filter';
5
+ import { FilterContext } from '../../../common/data/filters/filter-context';
6
+ import { SearchInputState } from './domain/input/search-input-state';
7
+ import { SearchContextService } from './domain/context/search-context.service';
8
+ import { SearchContext } from './domain/context/search-context';
7
9
  import * as i0 from "@angular/core";
8
10
  /**
9
- * The search container manages a group of search-inputs
10
- * and holds their values in a central search model.
11
+ * The SearchContextDirective binds a group of search-inputs
12
+ * to a SearchContext with a two-way binding.
13
+ *
14
+ * It also binds the SearchContext to a FilterContext (DataContext).
15
+ * TODO Maybe separate this??
11
16
  */
12
- export declare class ElderSearchContextDirective implements AfterViewInit, OnDestroy, AfterContentInit {
17
+ export declare class ElderSearchContextDirective implements OnInit, AfterViewInit, OnDestroy, AfterContentInit {
13
18
  /***************************************************************************
14
19
  * *
15
20
  * Fields *
16
21
  * *
17
22
  **************************************************************************/
18
- private _forcedFilters$;
19
23
  private readonly log;
20
24
  private readonly destroy$;
21
25
  private readonly _searchInputs$;
22
26
  private readonly _searchStates$;
23
27
  private readonly _filterContext$;
24
- readonly userFilters$: Observable<Filter[]>;
28
+ private readonly _searchContext$;
29
+ private readonly searchContextId$;
25
30
  /***************************************************************************
26
31
  * *
27
32
  * Constructor *
28
33
  * *
29
34
  **************************************************************************/
30
- constructor();
35
+ constructor(searchContextService: SearchContextService);
31
36
  /***************************************************************************
32
37
  * *
33
38
  * Life Cycle *
34
39
  * *
35
40
  **************************************************************************/
41
+ ngOnInit(): void;
36
42
  ngAfterContentInit(): void;
37
- private applyFilters;
38
43
  ngAfterViewInit(): void;
39
44
  ngOnDestroy(): void;
40
45
  /***************************************************************************
@@ -42,7 +47,11 @@ export declare class ElderSearchContextDirective implements AfterViewInit, OnDes
42
47
  * Properties *
43
48
  * *
44
49
  **************************************************************************/
45
- set filterContext(value: FilterContext | "");
50
+ set searchContextId(contextId: string);
51
+ get searchContextId(): string;
52
+ get searchContext$(): Observable<SearchContext>;
53
+ get searchContext(): SearchContext;
54
+ set filterContext(value: FilterContext | '');
46
55
  get filterContext(): FilterContext;
47
56
  /**
48
57
  * Forced filters are always merged into the final FilterContext.
@@ -75,10 +84,14 @@ export declare class ElderSearchContextDirective implements AfterViewInit, OnDes
75
84
  * Private *
76
85
  * *
77
86
  **************************************************************************/
78
- applyModelToInputs(): void;
87
+ private applyDefaultFiltersToSearchContext;
88
+ private syncSearchInputsToSearchContext;
89
+ private syncSearchContextToBoundFilterContext;
90
+ private applyToBoundFilterContext;
91
+ applySearchContextToInputs(): void;
79
92
  private applyFiltersToInputs;
80
93
  private findFilterForInput;
81
94
  private convertToFilters;
82
95
  static ɵfac: i0.ɵɵFactoryDeclaration<ElderSearchContextDirective, never>;
83
- static ɵdir: i0.ɵɵDirectiveDeclaration<ElderSearchContextDirective, "[elderSearchContext]", ["elderSearchContext"], { "filterContext": { "alias": "elderSearchContext"; "required": false; }; "forcedFilters": { "alias": "forcedFilters"; "required": false; }; }, {}, never, never, false, never>;
96
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ElderSearchContextDirective, "[elderSearchContext]", ["elderSearchContext"], { "searchContextId": { "alias": "searchContextId"; "required": false; }; "filterContext": { "alias": "elderSearchContext"; "required": false; }; "forcedFilters": { "alias": "forcedFilters"; "required": false; }; }, {}, never, never, false, never>;
84
97
  }
@@ -2,8 +2,8 @@ import { AfterViewInit, OnDestroy, OnInit } from "@angular/core";
2
2
  import { ElderSearchContextDirective } from "./elder-search-context.directive";
3
3
  import { Observable } from "rxjs/internal/Observable";
4
4
  import { NgModel } from "@angular/forms";
5
- import { SearchInput } from "./model/search-input";
6
- import { SearchInputState } from "./model/search-input-state";
5
+ import { SearchInput } from "./domain/input/search-input";
6
+ import { SearchInputState } from "./domain/input/search-input-state";
7
7
  import { LocalPagedDataSource } from "../../../common/data/datasource/local/local-paged-data-source";
8
8
  import { BooleanInput } from "@angular/cdk/coercion";
9
9
  import * as i0 from "@angular/core";
@@ -1,6 +1,7 @@
1
+ import { ElderSearchUrlService } from './domain/url/elder-search-url.service';
1
2
  import * as i0 from "@angular/core";
2
3
  import * as i1 from "./elder-search-context.directive";
3
- import * as i2 from "./elder-search-context-url-binding.directive";
4
+ import * as i2 from "./domain/url/elder-search-url.directive";
4
5
  import * as i3 from "./elder-search-input.directive";
5
6
  import * as i4 from "../directives/elder-initial-value.directive";
6
7
  import * as i5 from "./search-box/elder-search-box.component";
@@ -17,12 +18,13 @@ import * as i15 from "../../panels/elder-panel.module";
17
18
  import * as i16 from "../directives/elder-forms-directives.module";
18
19
  import * as i17 from "@ngx-translate/core";
19
20
  export { ElderSearchContextDirective } from "./elder-search-context.directive";
20
- export { ElderSearchContextUrlBindingDirective } from "./elder-search-context-url-binding.directive";
21
+ export { ElderSearchUrlDirective } from "./domain/url/elder-search-url.directive";
21
22
  export { ElderSearchInputDirective } from "./elder-search-input.directive";
22
23
  export { ElderSearchBoxComponent } from "./search-box/elder-search-box.component";
23
24
  export { ElderSearchPanelComponent } from "./search-box/elder-search-panel.component";
25
+ export declare function initSearchUrlService(searchUrlService: ElderSearchUrlService): () => void;
24
26
  export declare class ElderSearchModule {
25
27
  static ɵfac: i0.ɵɵFactoryDeclaration<ElderSearchModule, never>;
26
- static ɵmod: i0.ɵɵNgModuleDeclaration<ElderSearchModule, [typeof i1.ElderSearchContextDirective, typeof i2.ElderSearchContextUrlBindingDirective, typeof i3.ElderSearchInputDirective, typeof i4.ElderInitialValueDirective, typeof i5.ElderSearchBoxComponent, typeof i6.ElderSearchPanelComponent], [typeof i7.CommonModule, typeof i8.FormsModule, typeof i9.MatInputModule, typeof i10.MatButtonModule, typeof i11.MatIconModule, typeof i12.MatBadgeModule, typeof i13.A11yModule, typeof i14.ElderOverlayModule, typeof i15.ElderPanelModule, typeof i16.ElderFormsDirectivesModule, typeof i17.TranslateModule], [typeof i1.ElderSearchContextDirective, typeof i2.ElderSearchContextUrlBindingDirective, typeof i3.ElderSearchInputDirective, typeof i5.ElderSearchBoxComponent, typeof i6.ElderSearchPanelComponent]>;
28
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ElderSearchModule, [typeof i1.ElderSearchContextDirective, typeof i2.ElderSearchUrlDirective, typeof i3.ElderSearchInputDirective, typeof i4.ElderInitialValueDirective, typeof i5.ElderSearchBoxComponent, typeof i6.ElderSearchPanelComponent], [typeof i7.CommonModule, typeof i8.FormsModule, typeof i9.MatInputModule, typeof i10.MatButtonModule, typeof i11.MatIconModule, typeof i12.MatBadgeModule, typeof i13.A11yModule, typeof i14.ElderOverlayModule, typeof i15.ElderPanelModule, typeof i16.ElderFormsDirectivesModule, typeof i17.TranslateModule], [typeof i1.ElderSearchContextDirective, typeof i2.ElderSearchUrlDirective, typeof i3.ElderSearchInputDirective, typeof i5.ElderSearchBoxComponent, typeof i6.ElderSearchPanelComponent]>;
27
29
  static ɵinj: i0.ɵɵInjectorDeclaration<ElderSearchModule>;
28
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elderbyte/ngx-starter",
3
- "version": "16.3.4",
3
+ "version": "16.4.0",
4
4
  "peerDependencies": {
5
5
  "@angular/core": "^16.0.0 || ^17.0.0",
6
6
  "@angular/common": "^16.0.0 || ^17.0.0",
@@ -1,71 +0,0 @@
1
- import { Directive, Input } from "@angular/core";
2
- import { LoggerFactory } from "@elderbyte/ts-logger";
3
- import { filter, first, map, takeUntil } from "rxjs/operators";
4
- import { Subject } from "rxjs/internal/Subject";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./elder-search-context.directive";
7
- import * as i2 from "./search-box/elder-search-url-binding.service";
8
- /**
9
- * The search container manages a group of search-inputs
10
- * and holds their values in a central search model.
11
- */
12
- export class ElderSearchContextUrlBindingDirective {
13
- /***************************************************************************
14
- * *
15
- * Constructor *
16
- * *
17
- **************************************************************************/
18
- constructor(searchContext, urlBindingService) {
19
- this.searchContext = searchContext;
20
- this.urlBindingService = urlBindingService;
21
- /***************************************************************************
22
- * *
23
- * Fields *
24
- * *
25
- **************************************************************************/
26
- this.log = LoggerFactory.getLogger(this.constructor.name);
27
- this.destroy$ = new Subject();
28
- }
29
- /***************************************************************************
30
- * *
31
- * Life Cycle *
32
- * *
33
- **************************************************************************/
34
- ngAfterViewInit() {
35
- if (this._urlBinding) {
36
- this.urlBindingService.initialSearchMap$.pipe(first(), takeUntil(this.destroy$), filter(searchMap => searchMap.has(this._urlBinding)), map(searchMap => searchMap.get(this._urlBinding)), map(filterMap => Array.from(filterMap.filters.values()))).subscribe(filters => {
37
- this.searchContext.filterContext.updateFilters(filters);
38
- this.searchContext.applyModelToInputs();
39
- });
40
- this.searchContext.userFilters$.pipe(takeUntil(this.destroy$)).subscribe(filters => this.urlBindingService.updateFiltersForContext(this._urlBinding, filters));
41
- }
42
- }
43
- ngOnDestroy() {
44
- this.urlBindingService.resetFilterForContext(this._urlBinding);
45
- this.destroy$.next();
46
- this.destroy$.complete();
47
- }
48
- /***************************************************************************
49
- * *
50
- * Properties *
51
- * *
52
- **************************************************************************/
53
- set elderSearchContextUrlBinding(value) {
54
- this._urlBinding = value;
55
- }
56
- get elderSearchContextUrlBinding() {
57
- return this._urlBinding;
58
- }
59
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextUrlBindingDirective, deps: [{ token: i1.ElderSearchContextDirective }, { token: i2.ElderSearchUrlBindingService }], target: i0.ɵɵFactoryTarget.Directive }); }
60
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchContextUrlBindingDirective, selector: "[elderSearchContextUrlBinding]", inputs: { elderSearchContextUrlBinding: "elderSearchContextUrlBinding" }, exportAs: ["elderSearchContextUrlBinding"], ngImport: i0 }); }
61
- }
62
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextUrlBindingDirective, decorators: [{
63
- type: Directive,
64
- args: [{
65
- selector: "[elderSearchContextUrlBinding]",
66
- exportAs: "elderSearchContextUrlBinding"
67
- }]
68
- }], ctorParameters: function () { return [{ type: i1.ElderSearchContextDirective }, { type: i2.ElderSearchUrlBindingService }]; }, propDecorators: { elderSearchContextUrlBinding: [{
69
- type: Input
70
- }] } });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItc2VhcmNoLWNvbnRleHQtdXJsLWJpbmRpbmcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy9zZWFyY2gvZWxkZXItc2VhcmNoLWNvbnRleHQtdXJsLWJpbmRpbmcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUloRDs7O0dBR0c7QUFLSCxNQUFNLE9BQU8scUNBQXFDO0lBZWhEOzs7O2dGQUk0RTtJQUU1RSxZQUNVLGFBQTBDLEVBQzFDLGlCQUErQztRQUQvQyxrQkFBYSxHQUFiLGFBQWEsQ0FBNkI7UUFDMUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE4QjtRQXBCekQ7Ozs7b0ZBSTRFO1FBRTNELFFBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFjaEQsQ0FBQztJQUVEOzs7O2dGQUk0RTtJQUVyRSxlQUFlO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUMzQyxLQUFLLEVBQUUsRUFDUCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNwRCxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNqRCxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUN6RCxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ2xDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQ3BCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUMxRSxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRTVFLElBQ1csNEJBQTRCLENBQUMsS0FBYTtRQUNuRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyw0QkFBNEI7UUFDckMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7K0dBekVVLHFDQUFxQzttR0FBckMscUNBQXFDOzs0RkFBckMscUNBQXFDO2tCQUpqRCxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRSw4QkFBOEI7aUJBQ3pDOzZKQW9FWSw0QkFBNEI7c0JBRHRDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIElucHV0LCBPbkRlc3Ryb3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gXCJAZWxkZXJieXRlL3RzLWxvZ2dlclwiO1xuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdCwgbWFwLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqcy9pbnRlcm5hbC9TdWJqZWN0XCI7XG5pbXBvcnQgeyBFbGRlclNlYXJjaFVybEJpbmRpbmdTZXJ2aWNlIH0gZnJvbSBcIi4vc2VhcmNoLWJveC9lbGRlci1zZWFyY2gtdXJsLWJpbmRpbmcuc2VydmljZVwiO1xuaW1wb3J0IHsgRWxkZXJTZWFyY2hDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSBcIi4vZWxkZXItc2VhcmNoLWNvbnRleHQuZGlyZWN0aXZlXCI7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBjb250YWluZXIgbWFuYWdlcyBhIGdyb3VwIG9mIHNlYXJjaC1pbnB1dHNcbiAqIGFuZCBob2xkcyB0aGVpciB2YWx1ZXMgaW4gYSBjZW50cmFsIHNlYXJjaCBtb2RlbC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltlbGRlclNlYXJjaENvbnRleHRVcmxCaW5kaW5nXVwiLFxuICBleHBvcnRBczogXCJlbGRlclNlYXJjaENvbnRleHRVcmxCaW5kaW5nXCJcbn0pXG5leHBvcnQgY2xhc3MgRWxkZXJTZWFyY2hDb250ZXh0VXJsQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfdXJsQmluZGluZzogc3RyaW5nO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VhcmNoQ29udGV4dDogRWxkZXJTZWFyY2hDb250ZXh0RGlyZWN0aXZlLFxuICAgIHByaXZhdGUgdXJsQmluZGluZ1NlcnZpY2U6IEVsZGVyU2VhcmNoVXJsQmluZGluZ1NlcnZpY2VcbiAgKSB7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogTGlmZSBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl91cmxCaW5kaW5nKSB7XG4gICAgICB0aGlzLnVybEJpbmRpbmdTZXJ2aWNlLmluaXRpYWxTZWFyY2hNYXAkLnBpcGUoXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgZmlsdGVyKHNlYXJjaE1hcCA9PiBzZWFyY2hNYXAuaGFzKHRoaXMuX3VybEJpbmRpbmcpKSxcbiAgICAgICAgbWFwKHNlYXJjaE1hcCA9PiBzZWFyY2hNYXAuZ2V0KHRoaXMuX3VybEJpbmRpbmcpKSxcbiAgICAgICAgbWFwKGZpbHRlck1hcCA9PiBBcnJheS5mcm9tKGZpbHRlck1hcC5maWx0ZXJzLnZhbHVlcygpKSlcbiAgICAgICkuc3Vic2NyaWJlKGZpbHRlcnMgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaENvbnRleHQuZmlsdGVyQ29udGV4dC51cGRhdGVGaWx0ZXJzKGZpbHRlcnMpO1xuICAgICAgICB0aGlzLnNlYXJjaENvbnRleHQuYXBwbHlNb2RlbFRvSW5wdXRzKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZWFyY2hDb250ZXh0LnVzZXJGaWx0ZXJzJC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICkuc3Vic2NyaWJlKGZpbHRlcnMgPT5cbiAgICAgICAgdGhpcy51cmxCaW5kaW5nU2VydmljZS51cGRhdGVGaWx0ZXJzRm9yQ29udGV4dCh0aGlzLl91cmxCaW5kaW5nLCBmaWx0ZXJzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51cmxCaW5kaW5nU2VydmljZS5yZXNldEZpbHRlckZvckNvbnRleHQodGhpcy5fdXJsQmluZGluZyk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlbGRlclNlYXJjaENvbnRleHRVcmxCaW5kaW5nKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl91cmxCaW5kaW5nID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZGVyU2VhcmNoQ29udGV4dFVybEJpbmRpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsQmluZGluZztcbiAgfVxufVxuXG4iXX0=
@@ -1,81 +0,0 @@
1
- import { Objects } from '../../../../common/objects';
2
- /**
3
- * Immutable representation of the state of an search input
4
- */
5
- export class SearchInputState {
6
- static unknown() {
7
- return new SearchInputState(null, null, null, true);
8
- }
9
- /***************************************************************************
10
- * *
11
- * Constructor *
12
- * *
13
- **************************************************************************/
14
- constructor(
15
- /**
16
- * attribute The name name
17
- */
18
- attribute,
19
- /**
20
- * queryValue The query value as string. Supports multi string value.
21
- */
22
- queryValue,
23
- /**
24
- * queryKey The query key
25
- */
26
- queryKey,
27
- /**
28
- * pristine Has the user touched this?
29
- */
30
- pristine) {
31
- this.attribute = attribute;
32
- this.queryValue = queryValue;
33
- this.queryKey = queryKey;
34
- this.pristine = pristine;
35
- }
36
- /***************************************************************************
37
- * *
38
- * Private methods *
39
- * *
40
- **************************************************************************/
41
- static isValueDefined(value) {
42
- if (Objects.nonNull(value)) {
43
- if (value instanceof Array) {
44
- return value.length > 0;
45
- }
46
- else {
47
- return true;
48
- }
49
- }
50
- return false;
51
- }
52
- /***************************************************************************
53
- * *
54
- * Properties *
55
- * *
56
- **************************************************************************/
57
- /**
58
- * Checks if this search input has a value.
59
- *
60
- * The value must not be null and in case its
61
- * an array, it must not be empty.
62
- */
63
- get hasValue() {
64
- return SearchInputState.isValueDefined(this.queryValue);
65
- }
66
- /***************************************************************************
67
- * *
68
- * Public Api *
69
- * *
70
- **************************************************************************/
71
- withQueryValue(value, pristine) {
72
- let pristineNow = SearchInputState.isValueDefined(value);
73
- if (!pristineNow) {
74
- if (pristine !== undefined && pristine !== null) {
75
- pristineNow = pristine;
76
- }
77
- }
78
- return new SearchInputState(this.attribute, value, this.queryKey, pristineNow);
79
- }
80
- }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWlucHV0LXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy9zZWFyY2gvbW9kZWwvc2VhcmNoLWlucHV0LXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUVuRDs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFFcEIsTUFBTSxDQUFDLE9BQU87UUFDbkIsT0FBTyxJQUFJLGdCQUFnQixDQUN6QixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztnRkFJNEU7SUFFNUU7SUFFRTs7T0FFRztJQUNhLFNBQWlCO0lBRWpDOztPQUVHO0lBQ2EsVUFBb0M7SUFFcEQ7O09BRUc7SUFDYSxRQUFnQjtJQUVoQzs7T0FFRztJQUNhLFFBQWlCO1FBZmpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFLakIsZUFBVSxHQUFWLFVBQVUsQ0FBMEI7UUFLcEMsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUtoQixhQUFRLEdBQVIsUUFBUSxDQUFTO0lBQy9CLENBQUM7SUFFTDs7OztnRkFJNEU7SUFFckUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUErQjtRQUMxRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO2dCQUMxQixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNMLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O2dGQUk0RTtJQUU1RTs7Ozs7T0FLRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7O2dGQUk0RTtJQUVyRSxjQUFjLENBQUMsS0FBK0IsRUFBRSxRQUFrQjtRQUV2RSxJQUFJLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDL0MsV0FBVyxHQUFHLFFBQVEsQ0FBQzthQUN4QjtTQUNGO1FBRUQsT0FBTyxJQUFJLGdCQUFnQixDQUN6QixJQUFJLENBQUMsU0FBUyxFQUNkLEtBQUssRUFDTCxJQUFJLENBQUMsUUFBUSxFQUNiLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztDQUlGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYmplY3RzfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vb2JqZWN0cyc7XG5cbi8qKlxuICogSW1tdXRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0ZSBvZiBhbiBzZWFyY2ggaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaElucHV0U3RhdGUge1xuXG4gIHB1YmxpYyBzdGF0aWMgdW5rbm93bigpOiBTZWFyY2hJbnB1dFN0YXRlIHtcbiAgICByZXR1cm4gbmV3IFNlYXJjaElucHV0U3RhdGUoXG4gICAgICBudWxsLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGwsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuXG4gICAgLyoqXG4gICAgICogYXR0cmlidXRlIFRoZSBuYW1lIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYXR0cmlidXRlOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBxdWVyeVZhbHVlIFRoZSBxdWVyeSB2YWx1ZSBhcyBzdHJpbmcuIFN1cHBvcnRzIG11bHRpIHN0cmluZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcXVlcnlWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsLFxuXG4gICAgLyoqXG4gICAgICogcXVlcnlLZXkgVGhlIHF1ZXJ5IGtleVxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBxdWVyeUtleTogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogcHJpc3RpbmUgSGFzIHRoZSB1c2VyIHRvdWNoZWQgdGhpcz9cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpc3RpbmU6IGJvb2xlYW5cbiAgKSB7IH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsdWVEZWZpbmVkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoT2JqZWN0cy5ub25OdWxsKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIHNlYXJjaCBpbnB1dCBoYXMgYSB2YWx1ZS5cbiAgICpcbiAgICogVGhlIHZhbHVlIG11c3Qgbm90IGJlIG51bGwgYW5kIGluIGNhc2UgaXRzXG4gICAqIGFuIGFycmF5LCBpdCBtdXN0IG5vdCBiZSBlbXB0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFNlYXJjaElucHV0U3RhdGUuaXNWYWx1ZURlZmluZWQodGhpcy5xdWVyeVZhbHVlKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQXBpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyB3aXRoUXVlcnlWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsLCBwcmlzdGluZT86IGJvb2xlYW4pOiBTZWFyY2hJbnB1dFN0YXRlIHtcblxuICAgIGxldCBwcmlzdGluZU5vdyA9IFNlYXJjaElucHV0U3RhdGUuaXNWYWx1ZURlZmluZWQodmFsdWUpO1xuICAgIGlmICghcHJpc3RpbmVOb3cpIHtcbiAgICAgIGlmIChwcmlzdGluZSAhPT0gdW5kZWZpbmVkICYmIHByaXN0aW5lICE9PSBudWxsKSB7XG4gICAgICAgIHByaXN0aW5lTm93ID0gcHJpc3RpbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZWFyY2hJbnB1dFN0YXRlKFxuICAgICAgdGhpcy5hdHRyaWJ1dGUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHRoaXMucXVlcnlLZXksXG4gICAgICBwcmlzdGluZU5vd1xuICAgICk7XG4gIH1cblxuXG5cbn1cbiJdfQ==