@firestitch/filter 12.13.2 → 13.0.1

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 (154) hide show
  1. package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +2 -1
  2. package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +1 -5
  3. package/app/models/items/autocomplete/base-autocomplete-item.d.ts +1 -1
  4. package/app/models/items/base-item.d.ts +1 -1
  5. package/{esm2015/app/classes/actions-controller.js → esm2020/app/classes/actions-controller.mjs} +4 -4
  6. package/esm2020/app/components/action-button/action-button.component.mjs +24 -0
  7. package/esm2020/app/components/action-kebab-actions/action-kebab-actions.component.mjs +17 -0
  8. package/esm2020/app/components/actions/actions.component.mjs +26 -0
  9. package/esm2020/app/components/filter/filter.component.mjs +572 -0
  10. package/esm2020/app/components/filter-chip/filter-chip.component.mjs +86 -0
  11. package/{esm2015/app/components/filter-chip-content/filter-chip-content.component.js → esm2020/app/components/filter-chip-content/filter-chip-content.component.mjs} +5 -10
  12. package/esm2020/app/components/filter-chips/filter-chips.component.mjs +23 -0
  13. package/esm2020/app/components/filter-drawer/filter-drawer.component.mjs +71 -0
  14. package/esm2020/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +41 -0
  15. package/esm2020/app/components/filters-item/autocomplete/autocomplete.component.mjs +27 -0
  16. package/esm2020/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +42 -0
  17. package/{esm2015/app/components/filters-item/base-item/base-item.component.js → esm2020/app/components/filters-item/base-item/base-item.component.mjs} +4 -4
  18. package/esm2020/app/components/filters-item/checkbox/checkbox.component.mjs +21 -0
  19. package/esm2020/app/components/filters-item/chips/chips.component.mjs +28 -0
  20. package/esm2020/app/components/filters-item/date/date.component.mjs +43 -0
  21. package/esm2020/app/components/filters-item/date-range/date-range.component.mjs +34 -0
  22. package/esm2020/app/components/filters-item/filter-item.component.mjs +80 -0
  23. package/esm2020/app/components/filters-item/range/range.component.mjs +45 -0
  24. package/esm2020/app/components/filters-item/select/backdrop/backdrop.component.mjs +12 -0
  25. package/esm2020/app/components/filters-item/select/groups/groups.component.mjs +30 -0
  26. package/esm2020/app/components/filters-item/select/multiple/multiple.component.mjs +57 -0
  27. package/esm2020/app/components/filters-item/select/select.component.mjs +51 -0
  28. package/esm2020/app/components/filters-item/select/simple/simple.component.mjs +43 -0
  29. package/esm2020/app/components/filters-item/text/text.component.mjs +49 -0
  30. package/esm2020/app/components/filters-item/week/week.component.mjs +25 -0
  31. package/esm2020/app/components/saved-filter-edit/saved-filter-edit.component.mjs +55 -0
  32. package/esm2020/app/components/saved-filters-menu/saved-filters-menu.component.mjs +51 -0
  33. package/{esm2015/app/directives/focus-to-item/focus-to-item.directive.js → esm2020/app/directives/focus-to-item/focus-to-item.directive.mjs} +4 -4
  34. package/{esm2015/app/directives/status-bar/status-bar.directive.js → esm2020/app/directives/status-bar/status-bar.directive.mjs} +4 -4
  35. package/{esm2015/app/fs-filter.module.js → esm2020/app/fs-filter.module.mjs} +10 -7
  36. package/esm2020/app/models/action.model.mjs +108 -0
  37. package/esm2020/app/models/filter-config.mjs +66 -0
  38. package/esm2020/app/models/items/autocomplete/base-autocomplete-item.mjs +14 -0
  39. package/esm2020/app/models/items/autocomplete-chips-item.mjs +61 -0
  40. package/{esm2015/app/models/items/autocomplete-item.js → esm2020/app/models/items/autocomplete-item.mjs} +2 -2
  41. package/{esm2015/app/models/items/base-item.js → esm2020/app/models/items/base-item.mjs} +6 -8
  42. package/{esm2015/app/models/items/checkbox-item.js → esm2020/app/models/items/checkbox-item.mjs} +2 -2
  43. package/{esm2015/app/models/items/chips-item.js → esm2020/app/models/items/chips-item.mjs} +2 -2
  44. package/{esm2015/app/models/items/date-item.js → esm2020/app/models/items/date-item.mjs} +2 -2
  45. package/esm2020/app/models/items/date-range/base-date-range-item.mjs +135 -0
  46. package/esm2020/app/models/items/date-time-item.mjs +10 -0
  47. package/esm2020/app/models/items/range-item.mjs +83 -0
  48. package/esm2020/app/models/items/select/base-select-item.mjs +37 -0
  49. package/esm2020/app/models/items/select/multiple-select-item.mjs +88 -0
  50. package/esm2020/app/models/items/select/simple-select-item.mjs +66 -0
  51. package/{esm2015/app/models/items/text-item.js → esm2020/app/models/items/text-item.mjs} +2 -2
  52. package/esm2020/app/models/items/week-item.mjs +94 -0
  53. package/{esm2015/app/pipes/remove-isolate-value.pipe.js → esm2020/app/pipes/remove-isolate-value.pipe.mjs} +4 -4
  54. package/esm2020/app/services/external-params/persistance-params-controller.service.mjs +58 -0
  55. package/{esm2015/app/services/external-params/query-params-controller.service.js → esm2020/app/services/external-params/query-params-controller.service.mjs} +4 -4
  56. package/esm2020/app/services/external-params/saved-filters-controller.service.mjs +164 -0
  57. package/esm2020/app/services/external-params-controller.service.mjs +162 -0
  58. package/{esm2015/app/services/filter-overlay.service.js → esm2020/app/services/filter-overlay.service.mjs} +4 -4
  59. package/{esm2015/app/services/focus-controller.service.js → esm2020/app/services/focus-controller.service.mjs} +4 -4
  60. package/esm2020/app/services/items-store.service.mjs +337 -0
  61. package/fesm2015/{firestitch-filter.js → firestitch-filter.mjs} +965 -1082
  62. package/fesm2015/firestitch-filter.mjs.map +1 -0
  63. package/fesm2020/firestitch-filter.mjs +4444 -0
  64. package/fesm2020/firestitch-filter.mjs.map +1 -0
  65. package/package.json +20 -7
  66. package/bundles/firestitch-filter.umd.js +0 -5753
  67. package/bundles/firestitch-filter.umd.js.map +0 -1
  68. package/esm2015/app/components/action-button/action-button.component.js +0 -28
  69. package/esm2015/app/components/action-kebab-actions/action-kebab-actions.component.js +0 -22
  70. package/esm2015/app/components/actions/actions.component.js +0 -31
  71. package/esm2015/app/components/filter/filter.component.js +0 -577
  72. package/esm2015/app/components/filter-chip/filter-chip.component.js +0 -91
  73. package/esm2015/app/components/filter-chips/filter-chips.component.js +0 -27
  74. package/esm2015/app/components/filter-drawer/filter-drawer.component.js +0 -76
  75. package/esm2015/app/components/filter-drawer-actions/filter-drawer-actions.component.js +0 -44
  76. package/esm2015/app/components/filters-item/autocomplete/autocomplete.component.js +0 -30
  77. package/esm2015/app/components/filters-item/autocompletechips/autocompletechips.component.js +0 -52
  78. package/esm2015/app/components/filters-item/checkbox/checkbox.component.js +0 -25
  79. package/esm2015/app/components/filters-item/chips/chips.component.js +0 -32
  80. package/esm2015/app/components/filters-item/date/date.component.js +0 -46
  81. package/esm2015/app/components/filters-item/date-range/date-range.component.js +0 -37
  82. package/esm2015/app/components/filters-item/filter-item.component.js +0 -84
  83. package/esm2015/app/components/filters-item/range/range.component.js +0 -48
  84. package/esm2015/app/components/filters-item/select/backdrop/backdrop.component.js +0 -17
  85. package/esm2015/app/components/filters-item/select/groups/groups.component.js +0 -33
  86. package/esm2015/app/components/filters-item/select/multiple/multiple.component.js +0 -61
  87. package/esm2015/app/components/filters-item/select/select.component.js +0 -55
  88. package/esm2015/app/components/filters-item/select/simple/simple.component.js +0 -47
  89. package/esm2015/app/components/filters-item/text/text.component.js +0 -54
  90. package/esm2015/app/components/filters-item/week/week.component.js +0 -28
  91. package/esm2015/app/components/saved-filter-edit/saved-filter-edit.component.js +0 -55
  92. package/esm2015/app/components/saved-filters-menu/saved-filters-menu.component.js +0 -58
  93. package/esm2015/app/models/action.model.js +0 -109
  94. package/esm2015/app/models/filter-config.js +0 -67
  95. package/esm2015/app/models/items/autocomplete/base-autocomplete-item.js +0 -15
  96. package/esm2015/app/models/items/autocomplete-chips-item.js +0 -62
  97. package/esm2015/app/models/items/date-range/base-date-range-item.js +0 -137
  98. package/esm2015/app/models/items/date-time-item.js +0 -10
  99. package/esm2015/app/models/items/range-item.js +0 -84
  100. package/esm2015/app/models/items/select/base-select-item.js +0 -34
  101. package/esm2015/app/models/items/select/multiple-select-item.js +0 -89
  102. package/esm2015/app/models/items/select/simple-select-item.js +0 -66
  103. package/esm2015/app/models/items/week-item.js +0 -94
  104. package/esm2015/app/services/external-params/persistance-params-controller.service.js +0 -58
  105. package/esm2015/app/services/external-params/saved-filters-controller.service.js +0 -165
  106. package/esm2015/app/services/external-params-controller.service.js +0 -163
  107. package/esm2015/app/services/items-store.service.js +0 -341
  108. package/fesm2015/firestitch-filter.js.map +0 -1
  109. /package/{esm2015/app/consts/query-param-delimiter.js → esm2020/app/consts/query-param-delimiter.mjs} +0 -0
  110. /package/{esm2015/app/enums/action-mode.enum.js → esm2020/app/enums/action-mode.enum.mjs} +0 -0
  111. /package/{esm2015/app/enums/action-type.enum.js → esm2020/app/enums/action-type.enum.mjs} +0 -0
  112. /package/{esm2015/app/enums/button-style.js → esm2020/app/enums/button-style.mjs} +0 -0
  113. /package/{esm2015/app/enums/index.js → esm2020/app/enums/index.mjs} +0 -0
  114. /package/{esm2015/app/enums/item-date-mode.enum.js → esm2020/app/enums/item-date-mode.enum.mjs} +0 -0
  115. /package/{esm2015/app/enums/item-type.enum.js → esm2020/app/enums/item-type.enum.mjs} +0 -0
  116. /package/{esm2015/app/enums/picker-view-type.enum.js → esm2020/app/enums/picker-view-type.enum.mjs} +0 -0
  117. /package/{esm2015/app/helpers/build-query-params.js → esm2020/app/helpers/build-query-params.mjs} +0 -0
  118. /package/{esm2015/app/helpers/compare.js → esm2020/app/helpers/compare.mjs} +0 -0
  119. /package/{esm2015/app/helpers/create-filter-item.js → esm2020/app/helpers/create-filter-item.mjs} +0 -0
  120. /package/{esm2015/app/helpers/find-value.js → esm2020/app/helpers/find-value.mjs} +0 -0
  121. /package/{esm2015/app/helpers/get-range-name.js → esm2020/app/helpers/get-range-name.mjs} +0 -0
  122. /package/{esm2015/app/helpers/parse-date.js → esm2020/app/helpers/parse-date.mjs} +0 -0
  123. /package/{esm2015/app/helpers/parse-item-value-from-stored.js → esm2020/app/helpers/parse-item-value-from-stored.mjs} +0 -0
  124. /package/{esm2015/app/helpers/query-param-transformers.js → esm2020/app/helpers/query-param-transformers.mjs} +0 -0
  125. /package/{esm2015/app/helpers/restore-items.js → esm2020/app/helpers/restore-items.mjs} +0 -0
  126. /package/{esm2015/app/helpers/try-convert-to-number.js → esm2020/app/helpers/try-convert-to-number.mjs} +0 -0
  127. /package/{esm2015/app/injectors/filter-config.js → esm2020/app/injectors/filter-config.mjs} +0 -0
  128. /package/{esm2015/app/injectors/filter-drawer-data.js → esm2020/app/injectors/filter-drawer-data.mjs} +0 -0
  129. /package/{esm2015/app/injectors/filter-drawer-overlay.js → esm2020/app/injectors/filter-drawer-overlay.mjs} +0 -0
  130. /package/{esm2015/app/interfaces/action.interface.js → esm2020/app/interfaces/action.interface.mjs} +0 -0
  131. /package/{esm2015/app/interfaces/config.interface.js → esm2020/app/interfaces/config.interface.mjs} +0 -0
  132. /package/{esm2015/app/interfaces/external-params.interface.js → esm2020/app/interfaces/external-params.interface.mjs} +0 -0
  133. /package/{esm2015/app/interfaces/filter.interface.js → esm2020/app/interfaces/filter.interface.mjs} +0 -0
  134. /package/{esm2015/app/interfaces/items/autocomplete-chips.interface.js → esm2020/app/interfaces/items/autocomplete-chips.interface.mjs} +0 -0
  135. /package/{esm2015/app/interfaces/items/autocomplete.interface.js → esm2020/app/interfaces/items/autocomplete.interface.mjs} +0 -0
  136. /package/{esm2015/app/interfaces/items/base.interface.js → esm2020/app/interfaces/items/base.interface.mjs} +0 -0
  137. /package/{esm2015/app/interfaces/items/checkbox.interface.js → esm2020/app/interfaces/items/checkbox.interface.mjs} +0 -0
  138. /package/{esm2015/app/interfaces/items/chips.interface.js → esm2020/app/interfaces/items/chips.interface.mjs} +0 -0
  139. /package/{esm2015/app/interfaces/items/date-range.interface.js → esm2020/app/interfaces/items/date-range.interface.mjs} +0 -0
  140. /package/{esm2015/app/interfaces/items/date.interface.js → esm2020/app/interfaces/items/date.interface.mjs} +0 -0
  141. /package/{esm2015/app/interfaces/items/range.interface.js → esm2020/app/interfaces/items/range.interface.mjs} +0 -0
  142. /package/{esm2015/app/interfaces/items/select.interface.js → esm2020/app/interfaces/items/select.interface.mjs} +0 -0
  143. /package/{esm2015/app/interfaces/items/text.interface.js → esm2020/app/interfaces/items/text.interface.mjs} +0 -0
  144. /package/{esm2015/app/interfaces/items/week.interface.js → esm2020/app/interfaces/items/week.interface.mjs} +0 -0
  145. /package/{esm2015/app/interfaces/saved-filters.interface.js → esm2020/app/interfaces/saved-filters.interface.mjs} +0 -0
  146. /package/{esm2015/app/interfaces/update-filter-item.interface.js → esm2020/app/interfaces/update-filter-item.interface.mjs} +0 -0
  147. /package/{esm2015/app/models/action-menu-item.model.js → esm2020/app/models/action-menu-item.model.mjs} +0 -0
  148. /package/{esm2015/app/models/items/date/base-date-item.js → esm2020/app/models/items/date/base-date-item.mjs} +0 -0
  149. /package/{esm2015/app/models/items/date-range-item.js → esm2020/app/models/items/date-range-item.mjs} +0 -0
  150. /package/{esm2015/app/models/items/date-time-range-item.js → esm2020/app/models/items/date-time-range-item.mjs} +0 -0
  151. /package/{esm2015/app/models/items/select-item.js → esm2020/app/models/items/select-item.mjs} +0 -0
  152. /package/{esm2015/app/providers/filter-meta.js → esm2020/app/providers/filter-meta.mjs} +0 -0
  153. /package/{esm2015/firestitch-filter.js → esm2020/firestitch-filter.mjs} +0 -0
  154. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -1,165 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { MatDialog } from '@angular/material/dialog';
3
- import { BehaviorSubject, Subject } from 'rxjs';
4
- import { distinctUntilChanged, take, takeUntil, tap, } from 'rxjs/operators';
5
- import { FsFilterSavedFilterEditComponent } from '../../components/saved-filter-edit/saved-filter-edit.component';
6
- import { restoreItems } from '../../helpers/restore-items';
7
- import { buildQueryParams } from '../../helpers/build-query-params';
8
- import { FsFilterItemsStore } from '../items-store.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../items-store.service";
11
- import * as i2 from "@angular/material/dialog";
12
- export class SavedFiltersController {
13
- constructor(_itemsStore, _dialog) {
14
- this._itemsStore = _itemsStore;
15
- this._dialog = _dialog;
16
- this._savedFilters$ = new BehaviorSubject([]);
17
- this._activeFilter$ = new BehaviorSubject(null);
18
- this._enabled$ = new BehaviorSubject(false);
19
- this._destroy$ = new Subject();
20
- }
21
- get enabled() {
22
- return this._enabled$.getValue();
23
- }
24
- get enabled$() {
25
- return this._enabled$
26
- .pipe(distinctUntilChanged());
27
- }
28
- get savedFilters() {
29
- return this._savedFilters$.getValue();
30
- }
31
- get savedFilters$() {
32
- return this._savedFilters$
33
- .pipe(distinctUntilChanged());
34
- }
35
- get activeFilter() {
36
- return this._activeFilter$.getValue();
37
- }
38
- get activeFilter$() {
39
- return this._activeFilter$
40
- .pipe(distinctUntilChanged());
41
- }
42
- get activeFilterData() {
43
- var _a;
44
- return (_a = this._activeFilter$.getValue()) === null || _a === void 0 ? void 0 : _a.filters;
45
- }
46
- set savedFilters(filters) {
47
- this._savedFilters$.next(filters);
48
- }
49
- ngOnDestroy() {
50
- this._destroy$.next();
51
- this._destroy$.complete();
52
- }
53
- init(remoteParamsConfig, paramsCase) {
54
- if (!remoteParamsConfig) {
55
- this._setEnabledStatus(false);
56
- return;
57
- }
58
- this._setEnabledStatus(true);
59
- this._paramsCase = paramsCase;
60
- this._config = remoteParamsConfig;
61
- }
62
- initSavedFilters(filters) {
63
- filters = [...filters];
64
- filters.forEach((savedFilter) => {
65
- savedFilter.filters = restoreItems(savedFilter.filters, this._itemsStore.items, this._paramsCase);
66
- });
67
- this.savedFilters = filters;
68
- }
69
- load() {
70
- return this._config.load()
71
- .pipe(tap((response) => {
72
- this.initSavedFilters(response);
73
- }));
74
- }
75
- save(savedFilter) {
76
- return this._config.save(savedFilter);
77
- }
78
- order(savedFilters) {
79
- return this._config.order(savedFilters)
80
- .pipe(tap((response) => {
81
- this.savedFilters = [
82
- ...response,
83
- ];
84
- }));
85
- }
86
- delete(savedFilter) {
87
- return this._config.delete(savedFilter)
88
- .pipe(tap((response) => {
89
- this.savedFilters = this.savedFilters
90
- .filter((f) => f.id !== response.id);
91
- }));
92
- }
93
- setActiveFilter(savedFilter) {
94
- if (savedFilter) {
95
- const existingFilter = this.savedFilters
96
- .find((f) => f.id === savedFilter.id);
97
- if (!existingFilter) {
98
- throw new Error('Saved filter cannot be activated, because it does not exists. Filter ID = ' + savedFilter.id);
99
- }
100
- this._activeFilter$.next(existingFilter);
101
- }
102
- else {
103
- this._activeFilter$.next(null);
104
- }
105
- }
106
- openSavedFilterEditDialog() {
107
- const params = buildQueryParams(this._itemsStore.valuesAsQuery(), this._itemsStore.items);
108
- const values = this._itemsStore.values(true);
109
- const dialogConfig = {
110
- data: {
111
- params: params,
112
- savedFilters: this.savedFilters,
113
- saveCallback: this.save.bind(this),
114
- },
115
- };
116
- this._dialog
117
- .open(FsFilterSavedFilterEditComponent, dialogConfig)
118
- .beforeClosed()
119
- .pipe(take(1), takeUntil(this._destroy$))
120
- .subscribe((updatedFilter) => {
121
- if (updatedFilter) {
122
- // get already saved related filter object
123
- const savedFilter = this.savedFilters
124
- .find((f) => f.id === updatedFilter.id);
125
- // restore values from query string
126
- updatedFilter.filters = restoreItems(updatedFilter.filters, this._itemsStore.items, this._paramsCase);
127
- if (savedFilter) {
128
- Object.assign(savedFilter, updatedFilter);
129
- }
130
- else {
131
- this.resetActiveFilter();
132
- this.savedFilters = [
133
- ...this.savedFilters,
134
- updatedFilter
135
- ];
136
- }
137
- this.updateActiveFilter();
138
- }
139
- });
140
- }
141
- updateActiveFilter() {
142
- // Lookup active filter
143
- const acitveFilter = this.savedFilters
144
- .find((f) => f.active);
145
- if (acitveFilter) {
146
- this.setActiveFilter(acitveFilter);
147
- }
148
- }
149
- resetActiveFilter() {
150
- // Reset all previously activated filters
151
- this.savedFilters.forEach((savedFilter) => {
152
- savedFilter.active = false;
153
- });
154
- this.setActiveFilter(null);
155
- }
156
- _setEnabledStatus(value) {
157
- this._enabled$.next(value);
158
- }
159
- }
160
- SavedFiltersController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SavedFiltersController, deps: [{ token: i1.FsFilterItemsStore }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable });
161
- SavedFiltersController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SavedFiltersController });
162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SavedFiltersController, decorators: [{
163
- type: Injectable
164
- }], ctorParameters: function () { return [{ type: i1.FsFilterItemsStore }, { type: i2.MatDialog }]; } });
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtZmlsdGVycy1jb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9zYXZlZC1maWx0ZXJzLWNvbnRyb2xsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLGdDQUFnQyxFQUNqQyxNQUFNLGdFQUFnRSxDQUFDO0FBTXhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUk1RCxNQUFNLE9BQU8sc0JBQXNCO0lBYWpDLFlBQ1UsV0FBK0IsRUFDL0IsT0FBa0I7UUFEbEIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFYbEIsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7UUFDL0QsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFFL0QsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBSWxELGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBS3JDLENBQUM7SUFFSixJQUFXLE9BQU87UUFD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RUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpCLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3hDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBYztRQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QixDQUFDOztvSEF2TlUsc0JBQXNCO3dIQUF0QixzQkFBc0I7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBGc0ZpbHRlclNhdmVkRmlsdGVyRWRpdENvbXBvbmVudFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3NhdmVkLWZpbHRlci1lZGl0L3NhdmVkLWZpbHRlci1lZGl0LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBJRmlsdGVyU2F2ZWRGaWx0ZXIsXG4gIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWdcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zYXZlZC1maWx0ZXJzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2V4dGVybmFsLXBhcmFtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcmVzdG9yZUl0ZW1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy9yZXN0b3JlLWl0ZW1zJztcbmltcG9ydCB7IGJ1aWxkUXVlcnlQYXJhbXMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2J1aWxkLXF1ZXJ5LXBhcmFtcyc7XG5pbXBvcnQgeyBGc0ZpbHRlckl0ZW1zU3RvcmUgfSBmcm9tICcuLi9pdGVtcy1zdG9yZS5zZXJ2aWNlJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2F2ZWRGaWx0ZXJzQ29udHJvbGxlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHJvdGVjdGVkIF9jb25maWc6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc7XG5cbiAgcHJvdGVjdGVkIF9zYXZlZEZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRmlsdGVyU2F2ZWRGaWx0ZXJbXT4oW10pO1xuICBwcm90ZWN0ZWQgX2FjdGl2ZUZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcj4obnVsbCk7XG5cbiAgcHJvdGVjdGVkIF9lbmFibGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByb3RlY3RlZCBfcGFyYW1zQ2FzZTogJ3NuYWtlJyB8ICdjYW1lbCc7XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2l0ZW1zU3RvcmU6IEZzRmlsdGVySXRlbXNTdG9yZSxcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhdmVkRmlsdGVycygpOiBJRmlsdGVyU2F2ZWRGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkRmlsdGVycyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2F2ZWRGaWx0ZXJzJCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkRmlsdGVycyRcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyKCk6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlciQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyJCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXIkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlckRhdGEoKTogSUZpbHRlckV4dGVybmFsUGFyYW1zIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyJC5nZXRWYWx1ZSgpPy5maWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBzYXZlZEZpbHRlcnMoZmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW10pIHtcbiAgICB0aGlzLl9zYXZlZEZpbHRlcnMkLm5leHQoZmlsdGVycyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdChcbiAgICByZW1vdGVQYXJhbXNDb25maWc6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG4gICAgcGFyYW1zQ2FzZTogJ3NuYWtlJyB8ICdjYW1lbCcsXG4gICk6IHZvaWQge1xuICAgIGlmICghcmVtb3RlUGFyYW1zQ29uZmlnKSB7XG4gICAgICB0aGlzLl9zZXRFbmFibGVkU3RhdHVzKGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRFbmFibGVkU3RhdHVzKHRydWUpO1xuXG4gICAgdGhpcy5fcGFyYW1zQ2FzZSA9IHBhcmFtc0Nhc2U7XG4gICAgdGhpcy5fY29uZmlnID0gcmVtb3RlUGFyYW1zQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIGluaXRTYXZlZEZpbHRlcnMoZmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW10pOiB2b2lkIHtcbiAgICBmaWx0ZXJzID0gWy4uLmZpbHRlcnNdO1xuICAgIGZpbHRlcnMuZm9yRWFjaCgoc2F2ZWRGaWx0ZXIpID0+IHtcbiAgICAgIHNhdmVkRmlsdGVyLmZpbHRlcnMgPSByZXN0b3JlSXRlbXMoXG4gICAgICAgIHNhdmVkRmlsdGVyLmZpbHRlcnMsXG4gICAgICAgIHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXMsXG4gICAgICAgIHRoaXMuX3BhcmFtc0Nhc2VcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IGZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgbG9hZCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5sb2FkKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0U2F2ZWRGaWx0ZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmUoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IE9ic2VydmFibGU8SUZpbHRlclNhdmVkRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYXZlKHNhdmVkRmlsdGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBvcmRlcihzYXZlZEZpbHRlcnM6IElGaWx0ZXJTYXZlZEZpbHRlcltdKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcub3JkZXIoc2F2ZWRGaWx0ZXJzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmVkRmlsdGVycyA9IFtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShzYXZlZEZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmRlbGV0ZShzYXZlZEZpbHRlcilcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlZEZpbHRlcnMgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigoZikgPT4gZi5pZCAhPT0gcmVzcG9uc2UuaWQpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IHZvaWQge1xuICAgIGlmIChzYXZlZEZpbHRlcikge1xuICAgICAgY29uc3QgZXhpc3RpbmdGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAuZmluZCgoZikgPT4gZi5pZCA9PT0gc2F2ZWRGaWx0ZXIuaWQpO1xuXG4gICAgICBpZiAoIWV4aXN0aW5nRmlsdGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2F2ZWQgZmlsdGVyIGNhbm5vdCBiZSBhY3RpdmF0ZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3RzLiBGaWx0ZXIgSUQgPSAnICsgc2F2ZWRGaWx0ZXIuaWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIkLm5leHQoZXhpc3RpbmdGaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5TYXZlZEZpbHRlckVkaXREaWFsb2coKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gYnVpbGRRdWVyeVBhcmFtcyhcbiAgICAgIHRoaXMuX2l0ZW1zU3RvcmUudmFsdWVzQXNRdWVyeSgpLFxuICAgICAgdGhpcy5faXRlbXNTdG9yZS5pdGVtcyxcbiAgICApO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX2l0ZW1zU3RvcmUudmFsdWVzKHRydWUpO1xuXG4gICAgY29uc3QgZGlhbG9nQ29uZmlnID0ge1xuICAgICAgZGF0YToge1xuICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgc2F2ZWRGaWx0ZXJzOiB0aGlzLnNhdmVkRmlsdGVycyxcbiAgICAgICAgc2F2ZUNhbGxiYWNrOiB0aGlzLnNhdmUuYmluZCh0aGlzKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMuX2RpYWxvZ1xuICAgICAgLm9wZW4oRnNGaWx0ZXJTYXZlZEZpbHRlckVkaXRDb21wb25lbnQsIGRpYWxvZ0NvbmZpZylcbiAgICAgIC5iZWZvcmVDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyOiBJRmlsdGVyU2F2ZWRGaWx0ZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICh1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgICAgLy8gZ2V0IGFscmVhZHkgc2F2ZWQgcmVsYXRlZCBmaWx0ZXIgb2JqZWN0XG4gICAgICAgICAgY29uc3Qgc2F2ZWRGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAgICAgLmZpbmQoKGYpID0+IGYuaWQgPT09IHVwZGF0ZWRGaWx0ZXIuaWQpXG5cbiAgICAgICAgICAvLyByZXN0b3JlIHZhbHVlcyBmcm9tIHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgIHVwZGF0ZWRGaWx0ZXIuZmlsdGVycyA9IHJlc3RvcmVJdGVtcyhcbiAgICAgICAgICAgIHVwZGF0ZWRGaWx0ZXIuZmlsdGVycyxcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXMsXG4gICAgICAgICAgICB0aGlzLl9wYXJhbXNDYXNlXG4gICAgICAgICAgKTtcblxuXG4gICAgICAgICAgaWYgKHNhdmVkRmlsdGVyKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNhdmVkRmlsdGVyLCB1cGRhdGVkRmlsdGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEFjdGl2ZUZpbHRlcigpO1xuICAgICAgICAgICAgdGhpcy5zYXZlZEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgIC4uLnRoaXMuc2F2ZWRGaWx0ZXJzLFxuICAgICAgICAgICAgICB1cGRhdGVkRmlsdGVyXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG5cblxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUFjdGl2ZUZpbHRlcigpOiB2b2lkIHtcbiAgICAvLyBMb29rdXAgYWN0aXZlIGZpbHRlclxuICAgIGNvbnN0IGFjaXR2ZUZpbHRlciA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAuZmluZCgoZikgPT4gZi5hY3RpdmUpO1xuXG4gICAgaWYgKGFjaXR2ZUZpbHRlcikge1xuICAgICAgdGhpcy5zZXRBY3RpdmVGaWx0ZXIoYWNpdHZlRmlsdGVyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRBY3RpdmVGaWx0ZXIoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgYWxsIHByZXZpb3VzbHkgYWN0aXZhdGVkIGZpbHRlcnNcbiAgICB0aGlzLnNhdmVkRmlsdGVycy5mb3JFYWNoKChzYXZlZEZpbHRlcikgPT4ge1xuICAgICAgc2F2ZWRGaWx0ZXIuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldEFjdGl2ZUZpbHRlcihudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEVuYWJsZWRTdGF0dXModmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkJC5uZXh0KHZhbHVlKVxuICB9XG59XG4iXX0=
@@ -1,163 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, of, Subject } from 'rxjs';
3
- import { filter, switchMap, take, takeUntil } from 'rxjs/operators';
4
- import { buildQueryParams } from '../helpers/build-query-params';
5
- import { PersistanceParamsController } from './external-params/persistance-params-controller.service';
6
- import { QueryParamsController } from './external-params/query-params-controller.service';
7
- import { SavedFiltersController } from './external-params/saved-filters-controller.service';
8
- import { FsFilterItemsStore } from './items-store.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./items-store.service";
11
- import * as i2 from "./external-params/persistance-params-controller.service";
12
- import * as i3 from "./external-params/query-params-controller.service";
13
- import * as i4 from "./external-params/saved-filters-controller.service";
14
- export class ExternalParamsController {
15
- constructor(_itemsStore, _persistanceStore, _queryParams, _savedFilters) {
16
- this._itemsStore = _itemsStore;
17
- this._persistanceStore = _persistanceStore;
18
- this._queryParams = _queryParams;
19
- this._savedFilters = _savedFilters;
20
- this._pending$ = new BehaviorSubject(false);
21
- this._shouldResetSavedFilters = true;
22
- this._destroy$ = new Subject();
23
- }
24
- get params() {
25
- var _a;
26
- const result = {};
27
- if (this._persistanceStore.enabled) {
28
- Object.assign(result, (_a = this._persistanceStore.value) === null || _a === void 0 ? void 0 : _a.data);
29
- }
30
- if (this._savedFilters.enabled && this._savedFilters.activeFilter) {
31
- Object.assign(result, this._savedFilters.activeFilterData);
32
- }
33
- if (this._queryParams.enabled) {
34
- Object.assign(result, this._queryParams.fetchedParams);
35
- }
36
- return result;
37
- }
38
- get pending() {
39
- return this._pending$.getValue();
40
- }
41
- get pending$() {
42
- return this._pending$.asObservable();
43
- }
44
- get savedFiltersController() {
45
- return this._savedFilters;
46
- }
47
- get savedFiltersEnabled() {
48
- return this._savedFilters.enabled;
49
- }
50
- ngOnDestroy() {
51
- this._destroy$.next();
52
- this._destroy$.complete();
53
- }
54
- setConfig(config) {
55
- this._config = config;
56
- this._initPersistance();
57
- this._initQueryParams();
58
- this._initSavedFilters();
59
- this.initItems();
60
- }
61
- setActiveSavedFilter(savedFilter) {
62
- this.savedFiltersController.setActiveFilter(savedFilter);
63
- if (savedFilter) {
64
- this.reloadFiltersWithValues(savedFilter.filters, false);
65
- }
66
- }
67
- reloadFiltersWithValues(params, shouldResetSavedFilters = true) {
68
- this._shouldResetSavedFilters = shouldResetSavedFilters;
69
- this._itemsStore.updateItemsWithValues(params);
70
- this._saveQueryParams();
71
- this._savePersistedParams();
72
- }
73
- initItems() {
74
- this._pending$.next(true);
75
- if (this._savedFilters.enabled) {
76
- this._savedFilters
77
- .load()
78
- .pipe(takeUntil(this._destroy$))
79
- .subscribe(() => {
80
- this._savedFilters.updateActiveFilter();
81
- this._initItemsValues();
82
- this._listenAndResetSavedFilters();
83
- this._pending$.next(false);
84
- });
85
- }
86
- else {
87
- this._initItemsValues();
88
- this._pending$.next(false);
89
- }
90
- this._listenItemsChange();
91
- }
92
- _initItemsValues() {
93
- this._itemsStore.init(this.params);
94
- this._saveQueryParams();
95
- this._savePersistedParams();
96
- }
97
- fetchQueryParams() {
98
- this._initQueryParams();
99
- this._itemsStore.updateItemsWithValues(this.params);
100
- }
101
- _initPersistance() {
102
- this._persistanceStore.init(this._config.persist, this._config.namespace, this._config.case);
103
- }
104
- _initQueryParams() {
105
- this._queryParams.init(this._config.queryParam, this._config.case);
106
- }
107
- _initSavedFilters() {
108
- this._savedFilters.init(this._config.savedFilters, this._config.case);
109
- }
110
- _listenItemsChange() {
111
- this._itemsStore.ready$
112
- .pipe(filter((v) => v), take(1), takeUntil(this._destroy$))
113
- .subscribe(() => {
114
- this._saveQueryParams();
115
- this._savePersistedParams();
116
- });
117
- this._itemsStore
118
- .itemsChange$
119
- .pipe(takeUntil(this._destroy$))
120
- .subscribe(() => {
121
- this._saveQueryParams();
122
- this._savePersistedParams();
123
- });
124
- }
125
- _listenAndResetSavedFilters() {
126
- this._itemsStore
127
- .itemsChange$
128
- .pipe(filter(() => !!this.savedFiltersController.activeFilter), switchMap(() => {
129
- const shouldReset = this._shouldResetSavedFilters;
130
- this._shouldResetSavedFilters = true;
131
- return of(shouldReset);
132
- }), filter((shouldReset) => shouldReset), takeUntil(this._destroy$))
133
- .subscribe(() => {
134
- this.savedFiltersController.resetActiveFilter();
135
- });
136
- }
137
- _saveQueryParams() {
138
- const targetItems = this._itemsStore.items
139
- .filter((item) => !item.queryParamsDisabled);
140
- const params = buildQueryParams(this._itemsStore.valuesAsQuery({
141
- onlyPresented: false,
142
- items: targetItems,
143
- persisted: true,
144
- }), targetItems);
145
- this._queryParams.writeStateToQueryParams(params);
146
- }
147
- _savePersistedParams() {
148
- const targetItems = this._itemsStore.items
149
- .filter((item) => !item.persistanceDisabled);
150
- const params = buildQueryParams(this._itemsStore.valuesAsQuery({
151
- onlyPresented: false,
152
- items: targetItems,
153
- persisted: true,
154
- }), targetItems);
155
- this._persistanceStore.save(params);
156
- }
157
- }
158
- ExternalParamsController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ExternalParamsController, deps: [{ token: i1.FsFilterItemsStore }, { token: i2.PersistanceParamsController }, { token: i3.QueryParamsController }, { token: i4.SavedFiltersController }], target: i0.ɵɵFactoryTarget.Injectable });
159
- ExternalParamsController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ExternalParamsController });
160
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ExternalParamsController, decorators: [{
161
- type: Injectable
162
- }], ctorParameters: function () { return [{ type: i1.FsFilterItemsStore }, { type: i2.PersistanceParamsController }, { type: i3.QueryParamsController }, { type: i4.SavedFiltersController }]; } });
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFLakUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDdEcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDNUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQUkzRCxNQUFNLE9BQU8sd0JBQXdCO0lBU25DLFlBQ1UsV0FBK0IsRUFDL0IsaUJBQThDLEVBQzlDLFlBQW1DLEVBQ25DLGFBQXFDO1FBSHJDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTZCO1FBQzlDLGlCQUFZLEdBQVosWUFBWSxDQUF1QjtRQUNuQyxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFUdkMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLDZCQUF3QixHQUFHLElBQUksQ0FBQztRQUVoQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU9wQyxDQUFDO0lB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QUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSzthQUN2QyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFL0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1lBQzdCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsRUFDRixXQUFXLENBQ1osQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7YUFDdkMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUM3QixhQUFhLEVBQUUsS0FBSztZQUNwQixLQUFLLEVBQUUsV0FBVztZQUNsQixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLEVBQ0YsV0FBVyxDQUNaLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7O3NIQTFNVSx3QkFBd0I7MEhBQXhCLHdCQUF3Qjs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGJ1aWxkUXVlcnlQYXJhbXMgfSBmcm9tICcuLi9oZWxwZXJzL2J1aWxkLXF1ZXJ5LXBhcmFtcyc7XG5pbXBvcnQgeyBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dGVybmFsLXBhcmFtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUZpbHRlclNhdmVkRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zYXZlZC1maWx0ZXJzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcblxuaW1wb3J0IHsgUGVyc2lzdGFuY2VQYXJhbXNDb250cm9sbGVyIH0gZnJvbSAnLi9leHRlcm5hbC1wYXJhbXMvcGVyc2lzdGFuY2UtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVBhcmFtc0NvbnRyb2xsZXIgfSBmcm9tICcuL2V4dGVybmFsLXBhcmFtcy9xdWVyeS1wYXJhbXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIgfSBmcm9tICcuL2V4dGVybmFsLXBhcmFtcy9zYXZlZC1maWx0ZXJzLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckl0ZW1zU3RvcmUgfSBmcm9tICcuL2l0ZW1zLXN0b3JlLnNlcnZpY2UnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByb3RlY3RlZCBfaW5pdDtcblxuICBwcml2YXRlIF9wZW5kaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIF9zaG91bGRSZXNldFNhdmVkRmlsdGVycyA9IHRydWU7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9pdGVtc1N0b3JlOiBGc0ZpbHRlckl0ZW1zU3RvcmUsXG4gICAgcHJpdmF0ZSBfcGVyc2lzdGFuY2VTdG9yZTogUGVyc2lzdGFuY2VQYXJhbXNDb250cm9sbGVyLFxuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtc0NvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJzOiBTYXZlZEZpbHRlcnNDb250cm9sbGVyLFxuICApIHsgfVxuXG4gIHB1YmxpYyBnZXQgcGFyYW1zKCk6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB7XG4gICAgY29uc3QgcmVzdWx0OiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgPSB7fTtcblxuICAgIGlmICh0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLmVuYWJsZWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLnZhbHVlPy5kYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2F2ZWRGaWx0ZXJzLmVuYWJsZWQgJiYgdGhpcy5fc2F2ZWRGaWx0ZXJzLmFjdGl2ZUZpbHRlcikge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHRoaXMuX3NhdmVkRmlsdGVycy5hY3RpdmVGaWx0ZXJEYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcXVlcnlQYXJhbXMuZW5hYmxlZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHRoaXMuX3F1ZXJ5UGFyYW1zLmZldGNoZWRQYXJhbXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmckLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2F2ZWRGaWx0ZXJzQ29udHJvbGxlcigpOiBTYXZlZEZpbHRlcnNDb250cm9sbGVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2F2ZWRGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldCBzYXZlZEZpbHRlcnNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnMuZW5hYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuXG4gICAgdGhpcy5faW5pdFBlcnNpc3RhbmNlKCk7XG4gICAgdGhpcy5faW5pdFF1ZXJ5UGFyYW1zKCk7XG4gICAgdGhpcy5faW5pdFNhdmVkRmlsdGVycygpO1xuICAgIHRoaXMuaW5pdEl0ZW1zKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlU2F2ZWRGaWx0ZXIoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcikge1xuICAgIHRoaXMuc2F2ZWRGaWx0ZXJzQ29udHJvbGxlci5zZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXIpO1xuXG4gICAgaWYgKHNhdmVkRmlsdGVyKSB7XG4gICAgICB0aGlzLnJlbG9hZEZpbHRlcnNXaXRoVmFsdWVzKHNhdmVkRmlsdGVyLmZpbHRlcnMsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkRmlsdGVyc1dpdGhWYWx1ZXMocGFyYW1zOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMsIHNob3VsZFJlc2V0U2F2ZWRGaWx0ZXJzID0gdHJ1ZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlc2V0U2F2ZWRGaWx0ZXJzID0gc2hvdWxkUmVzZXRTYXZlZEZpbHRlcnM7XG4gICAgdGhpcy5faXRlbXNTdG9yZS51cGRhdGVJdGVtc1dpdGhWYWx1ZXMocGFyYW1zKTtcblxuICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0SXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZyQubmV4dCh0cnVlKTtcbiAgICBpZiAodGhpcy5fc2F2ZWRGaWx0ZXJzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3NhdmVkRmlsdGVyc1xuICAgICAgICAubG9hZCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc2F2ZWRGaWx0ZXJzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICAgIHRoaXMuX2luaXRJdGVtc1ZhbHVlcygpO1xuICAgICAgICAgIHRoaXMuX2xpc3RlbkFuZFJlc2V0U2F2ZWRGaWx0ZXJzKCk7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbml0SXRlbXNWYWx1ZXMoKTtcbiAgICAgIHRoaXMuX3BlbmRpbmckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3Rlbkl0ZW1zQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgX2luaXRJdGVtc1ZhbHVlcygpIHtcbiAgICB0aGlzLl9pdGVtc1N0b3JlLmluaXQodGhpcy5wYXJhbXMpO1xuICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaFF1ZXJ5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX2l0ZW1zU3RvcmUudXBkYXRlSXRlbXNXaXRoVmFsdWVzKHRoaXMucGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRQZXJzaXN0YW5jZSgpIHtcbiAgICB0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLmluaXQoXG4gICAgICB0aGlzLl9jb25maWcucGVyc2lzdCxcbiAgICAgIHRoaXMuX2NvbmZpZy5uYW1lc3BhY2UsXG4gICAgICB0aGlzLl9jb25maWcuY2FzZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFF1ZXJ5UGFyYW1zKCkge1xuICAgIHRoaXMuX3F1ZXJ5UGFyYW1zLmluaXQodGhpcy5fY29uZmlnLnF1ZXJ5UGFyYW0sIHRoaXMuX2NvbmZpZy5jYXNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRTYXZlZEZpbHRlcnMoKSB7XG4gICAgdGhpcy5fc2F2ZWRGaWx0ZXJzLmluaXQodGhpcy5fY29uZmlnLnNhdmVkRmlsdGVycywgdGhpcy5fY29uZmlnLmNhc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuSXRlbXNDaGFuZ2UoKSB7XG4gICAgdGhpcy5faXRlbXNTdG9yZS5yZWFkeSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHYpID0+IHYpLFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgICAgICB0aGlzLl9zYXZlUGVyc2lzdGVkUGFyYW1zKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2l0ZW1zU3RvcmVcbiAgICAgIC5pdGVtc0NoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgICAgICB0aGlzLl9zYXZlUGVyc2lzdGVkUGFyYW1zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkFuZFJlc2V0U2F2ZWRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX2l0ZW1zU3RvcmVcbiAgICAgIC5pdGVtc0NoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLnNhdmVkRmlsdGVyc0NvbnRyb2xsZXIuYWN0aXZlRmlsdGVyKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzaG91bGRSZXNldCA9IHRoaXMuX3Nob3VsZFJlc2V0U2F2ZWRGaWx0ZXJzO1xuXG4gICAgICAgICAgdGhpcy5fc2hvdWxkUmVzZXRTYXZlZEZpbHRlcnMgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG9mKHNob3VsZFJlc2V0KTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcigoc2hvdWxkUmVzZXQpID0+IHNob3VsZFJlc2V0KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNhdmVkRmlsdGVyc0NvbnRyb2xsZXIucmVzZXRBY3RpdmVGaWx0ZXIoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2F2ZVF1ZXJ5UGFyYW1zKCkge1xuICAgIGNvbnN0IHRhcmdldEl0ZW1zID0gdGhpcy5faXRlbXNTdG9yZS5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0ucXVlcnlQYXJhbXNEaXNhYmxlZCk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSBidWlsZFF1ZXJ5UGFyYW1zKFxuICAgICAgdGhpcy5faXRlbXNTdG9yZS52YWx1ZXNBc1F1ZXJ5KHtcbiAgICAgICAgb25seVByZXNlbnRlZDogZmFsc2UsXG4gICAgICAgIGl0ZW1zOiB0YXJnZXRJdGVtcyxcbiAgICAgICAgcGVyc2lzdGVkOiB0cnVlLFxuICAgICAgfSksXG4gICAgICB0YXJnZXRJdGVtcyxcbiAgICApO1xuXG4gICAgdGhpcy5fcXVlcnlQYXJhbXMud3JpdGVTdGF0ZVRvUXVlcnlQYXJhbXMocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKSB7XG4gICAgY29uc3QgdGFyZ2V0SXRlbXMgPSB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5wZXJzaXN0YW5jZURpc2FibGVkKTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IGJ1aWxkUXVlcnlQYXJhbXMoXG4gICAgICB0aGlzLl9pdGVtc1N0b3JlLnZhbHVlc0FzUXVlcnkoe1xuICAgICAgICBvbmx5UHJlc2VudGVkOiBmYWxzZSxcbiAgICAgICAgaXRlbXM6IHRhcmdldEl0ZW1zLFxuICAgICAgICBwZXJzaXN0ZWQ6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIHRhcmdldEl0ZW1zLFxuICAgICk7XG5cbiAgICB0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLnNhdmUocGFyYW1zKTtcbiAgfVxufVxuIl19