@firestitch/filter 18.0.46 → 18.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/action-button/action-button.component.d.ts +1 -1
- package/app/components/action-kebab-actions/action-kebab-actions.component.d.ts +1 -1
- package/app/components/actions/actions.component.d.ts +1 -1
- package/app/components/filter/filter.component.d.ts +17 -25
- package/app/components/filter-chip/filter-chip.component.d.ts +7 -7
- package/app/components/filter-chip-content/filter-chip-content.component.d.ts +1 -1
- package/app/components/filter-chips/filter-chips.component.d.ts +1 -1
- package/app/components/filter-drawer/filter-drawer.component.d.ts +18 -12
- package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +5 -1
- package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +1 -1
- package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +1 -1
- package/app/components/filters-item/base-item/base-item.component.d.ts +1 -1
- package/app/components/filters-item/checkbox/checkbox.component.d.ts +1 -1
- package/app/components/filters-item/chips/chips.component.d.ts +2 -3
- package/app/components/filters-item/date/date.component.d.ts +1 -1
- package/app/components/filters-item/date-range/date-range.component.d.ts +1 -1
- package/app/components/filters-item/filter-item.component.d.ts +1 -1
- package/app/components/filters-item/range/range.component.d.ts +1 -1
- package/app/components/filters-item/select/backdrop/backdrop.component.d.ts +1 -1
- package/app/components/filters-item/select/groups/groups.component.d.ts +1 -1
- package/app/components/filters-item/select/multiple/multiple.component.d.ts +1 -1
- package/app/components/filters-item/select/select.component.d.ts +1 -1
- package/app/components/filters-item/select/simple/simple.component.d.ts +1 -1
- package/app/components/filters-item/text/text.component.d.ts +1 -1
- package/app/components/filters-item/week/week.component.d.ts +1 -1
- package/app/components/saved-filter/index.d.ts +1 -2
- package/app/components/saved-filter/saved-filter-autocomplete-chips/index.d.ts +1 -0
- package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +32 -0
- package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.d.ts +1 -0
- package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.d.ts +13 -0
- package/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +17 -10
- package/app/consts/filter-icon.d.ts +1 -0
- package/app/consts/index.d.ts +2 -0
- package/app/directives/focus-to-item/focus-to-item.directive.d.ts +1 -1
- package/app/directives/status-bar/status-bar.directive.d.ts +1 -1
- package/app/fs-filter.module.d.ts +30 -62
- package/app/helpers/build-query-params.d.ts +2 -1
- package/app/helpers/create-filter-item.d.ts +1 -1
- package/app/injectors/filter-drawer-overlay.d.ts +2 -1
- package/app/interfaces/external-params.interface.d.ts +2 -2
- package/app/interfaces/saved-filters.interface.d.ts +11 -6
- package/app/models/items/autocomplete/index.d.ts +1 -0
- package/app/models/items/autocomplete-chips-item.d.ts +1 -1
- package/app/models/items/base-item.d.ts +1 -1
- package/app/models/items/chips-item.d.ts +1 -1
- package/app/models/items/date/base-date-item.d.ts +1 -1
- package/app/models/items/date/index.d.ts +1 -0
- package/app/models/items/date-range/base-date-range-item.d.ts +1 -1
- package/app/models/items/date-range/index.d.ts +1 -0
- package/app/models/items/index.d.ts +17 -0
- package/app/models/items/select/index.d.ts +3 -0
- package/app/models/items/select/multiple-select-item.d.ts +3 -3
- package/app/models/items/select/simple-select-item.d.ts +2 -2
- package/app/models/items/week-item.d.ts +1 -1
- package/app/pipes/remove-isolate-value.pipe.d.ts +1 -1
- package/app/services/filter-overlay.service.d.ts +7 -11
- package/app/services/index.d.ts +7 -0
- package/app/services/{items-store.service.d.ts → item-store.service.d.ts} +9 -7
- package/app/services/param-controller.service.d.ts +30 -0
- package/app/services/{external-params/query-persistance-controller.service.d.ts → persistance-controller.service.d.ts} +4 -4
- package/app/services/query-param-controller.service.d.ts +21 -0
- package/app/services/{external-params/saved-filters-controller.service.d.ts → saved-filter-controller.service.d.ts} +17 -15
- package/esm2022/app/components/action-button/action-button.component.mjs +22 -7
- package/esm2022/app/components/action-kebab-actions/action-kebab-actions.component.mjs +13 -7
- package/esm2022/app/components/actions/actions.component.mjs +35 -15
- package/esm2022/app/components/filter/filter.component.mjs +111 -119
- package/esm2022/app/components/filter-chip/filter-chip.component.mjs +30 -18
- package/esm2022/app/components/filter-chip-content/filter-chip-content.component.mjs +3 -3
- package/esm2022/app/components/filter-chips/filter-chips.component.mjs +5 -5
- package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +70 -36
- package/esm2022/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +27 -7
- package/esm2022/app/components/filters-item/autocomplete/autocomplete.component.mjs +14 -6
- package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +14 -6
- package/esm2022/app/components/filters-item/base-item/base-item.component.mjs +3 -2
- package/esm2022/app/components/filters-item/checkbox/checkbox.component.mjs +15 -7
- package/esm2022/app/components/filters-item/chips/chips.component.mjs +19 -14
- package/esm2022/app/components/filters-item/date/date.component.mjs +19 -8
- package/esm2022/app/components/filters-item/date-range/date-range.component.mjs +19 -8
- package/esm2022/app/components/filters-item/filter-item.component.mjs +24 -14
- package/esm2022/app/components/filters-item/range/range.component.mjs +19 -9
- package/esm2022/app/components/filters-item/select/backdrop/backdrop.component.mjs +3 -3
- package/esm2022/app/components/filters-item/select/groups/groups.component.mjs +21 -10
- package/esm2022/app/components/filters-item/select/multiple/multiple.component.mjs +25 -12
- package/esm2022/app/components/filters-item/select/select.component.mjs +17 -9
- package/esm2022/app/components/filters-item/select/simple/simple.component.mjs +24 -12
- package/esm2022/app/components/filters-item/text/text.component.mjs +17 -9
- package/esm2022/app/components/filters-item/week/week.component.mjs +19 -8
- package/esm2022/app/components/saved-filter/index.mjs +2 -3
- package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/index.mjs +2 -0
- package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +120 -0
- package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.mjs +2 -0
- package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.mjs +28 -0
- package/esm2022/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +46 -31
- package/esm2022/app/consts/filter-icon.mjs +2 -0
- package/esm2022/app/consts/index.mjs +3 -0
- package/esm2022/app/directives/focus-to-item/focus-to-item.directive.mjs +3 -2
- package/esm2022/app/directives/status-bar/status-bar.directive.mjs +3 -2
- package/esm2022/app/fs-filter.module.mjs +31 -141
- package/esm2022/app/helpers/build-query-params.mjs +8 -3
- package/esm2022/app/helpers/compare.mjs +2 -2
- package/esm2022/app/injectors/filter-drawer-overlay.mjs +1 -1
- package/esm2022/app/interfaces/external-params.interface.mjs +1 -1
- package/esm2022/app/interfaces/saved-filters.interface.mjs +1 -1
- package/esm2022/app/models/items/autocomplete/index.mjs +2 -0
- package/esm2022/app/models/items/autocomplete-chips-item.mjs +4 -4
- package/esm2022/app/models/items/base-item.mjs +4 -4
- package/esm2022/app/models/items/chips-item.mjs +5 -5
- package/esm2022/app/models/items/date/base-date-item.mjs +9 -9
- package/esm2022/app/models/items/date/index.mjs +2 -0
- package/esm2022/app/models/items/date-range/base-date-range-item.mjs +12 -12
- package/esm2022/app/models/items/date-range/index.mjs +2 -0
- package/esm2022/app/models/items/index.mjs +18 -0
- package/esm2022/app/models/items/select/index.mjs +4 -0
- package/esm2022/app/models/items/select/multiple-select-item.mjs +17 -17
- package/esm2022/app/models/items/select/simple-select-item.mjs +10 -10
- package/esm2022/app/models/items/week-item.mjs +11 -9
- package/esm2022/app/pipes/remove-isolate-value.pipe.mjs +3 -2
- package/esm2022/app/services/filter-overlay.service.mjs +10 -21
- package/esm2022/app/services/index.mjs +8 -0
- package/esm2022/app/services/item-store.service.mjs +356 -0
- package/esm2022/app/services/param-controller.service.mjs +149 -0
- package/esm2022/app/services/persistance-controller.service.mjs +65 -0
- package/esm2022/app/services/query-param-controller.service.mjs +65 -0
- package/esm2022/app/services/saved-filter-controller.service.mjs +169 -0
- package/esm2022/public_api.mjs +2 -4
- package/fesm2022/firestitch-filter.mjs +1962 -1810
- package/fesm2022/firestitch-filter.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -3
- package/app/components/saved-filter/saved-filter-edit/index.d.ts +0 -1
- package/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.d.ts +0 -18
- package/app/components/saved-filter/saved-filters-menu/index.d.ts +0 -1
- package/app/components/saved-filter/saved-filters-menu/saved-filters-menu.component.d.ts +0 -24
- package/app/services/external-params/index.d.ts +0 -3
- package/app/services/external-params/query-params-controller.service.d.ts +0 -21
- package/app/services/external-params-controller.service.d.ts +0 -38
- package/esm2022/app/components/saved-filter/saved-filter-edit/index.mjs +0 -2
- package/esm2022/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.mjs +0 -55
- package/esm2022/app/components/saved-filter/saved-filters-menu/index.mjs +0 -2
- package/esm2022/app/components/saved-filter/saved-filters-menu/saved-filters-menu.component.mjs +0 -61
- package/esm2022/app/services/external-params/index.mjs +0 -4
- package/esm2022/app/services/external-params/query-params-controller.service.mjs +0 -65
- package/esm2022/app/services/external-params/query-persistance-controller.service.mjs +0 -65
- package/esm2022/app/services/external-params/saved-filters-controller.service.mjs +0 -165
- package/esm2022/app/services/external-params-controller.service.mjs +0 -183
- package/esm2022/app/services/items-store.service.mjs +0 -345
|
@@ -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/saved-filter-edit/saved-filter-edit.component';
|
|
6
|
-
import { buildQueryParams } from '../../helpers/build-query-params';
|
|
7
|
-
import { restoreItems } from '../../helpers/restore-items';
|
|
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
|
-
_itemsStore;
|
|
14
|
-
_dialog;
|
|
15
|
-
_config;
|
|
16
|
-
_savedFilters$ = new BehaviorSubject([]);
|
|
17
|
-
_activeFilter$ = new BehaviorSubject(null);
|
|
18
|
-
_enabled$ = new BehaviorSubject(false);
|
|
19
|
-
_destroy$ = new Subject();
|
|
20
|
-
constructor(_itemsStore, _dialog) {
|
|
21
|
-
this._itemsStore = _itemsStore;
|
|
22
|
-
this._dialog = _dialog;
|
|
23
|
-
}
|
|
24
|
-
get enabled() {
|
|
25
|
-
return this._enabled$.getValue();
|
|
26
|
-
}
|
|
27
|
-
get enabled$() {
|
|
28
|
-
return this._enabled$
|
|
29
|
-
.pipe(distinctUntilChanged());
|
|
30
|
-
}
|
|
31
|
-
get savedFilters() {
|
|
32
|
-
return this._savedFilters$.getValue();
|
|
33
|
-
}
|
|
34
|
-
set savedFilters(filters) {
|
|
35
|
-
this._savedFilters$.next(filters);
|
|
36
|
-
}
|
|
37
|
-
get savedFilters$() {
|
|
38
|
-
return this._savedFilters$
|
|
39
|
-
.pipe(distinctUntilChanged());
|
|
40
|
-
}
|
|
41
|
-
get activeFilter() {
|
|
42
|
-
return this._activeFilter$.getValue();
|
|
43
|
-
}
|
|
44
|
-
get activeFilter$() {
|
|
45
|
-
return this._activeFilter$
|
|
46
|
-
.pipe(distinctUntilChanged());
|
|
47
|
-
}
|
|
48
|
-
get activeFilterData() {
|
|
49
|
-
return this._activeFilter$.getValue()?.filters;
|
|
50
|
-
}
|
|
51
|
-
ngOnDestroy() {
|
|
52
|
-
this._destroy$.next(null);
|
|
53
|
-
this._destroy$.complete();
|
|
54
|
-
}
|
|
55
|
-
init(remoteParamsConfig) {
|
|
56
|
-
if (!remoteParamsConfig) {
|
|
57
|
-
this._setEnabledStatus(false);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
this._setEnabledStatus(true);
|
|
61
|
-
this._config = remoteParamsConfig;
|
|
62
|
-
}
|
|
63
|
-
initSavedFilters(filters) {
|
|
64
|
-
filters = [...filters];
|
|
65
|
-
filters.forEach((savedFilter) => {
|
|
66
|
-
savedFilter.filters = restoreItems(savedFilter.filters, this._itemsStore.items);
|
|
67
|
-
});
|
|
68
|
-
this.savedFilters = filters;
|
|
69
|
-
}
|
|
70
|
-
load() {
|
|
71
|
-
return this._config.load()
|
|
72
|
-
.pipe(tap((response) => {
|
|
73
|
-
this.initSavedFilters(response);
|
|
74
|
-
}));
|
|
75
|
-
}
|
|
76
|
-
save(savedFilter) {
|
|
77
|
-
return this._config.save(savedFilter);
|
|
78
|
-
}
|
|
79
|
-
order(savedFilters) {
|
|
80
|
-
return this._config.order(savedFilters)
|
|
81
|
-
.pipe(tap(() => {
|
|
82
|
-
this.savedFilters = [
|
|
83
|
-
...savedFilters,
|
|
84
|
-
];
|
|
85
|
-
}));
|
|
86
|
-
}
|
|
87
|
-
delete(savedFilter) {
|
|
88
|
-
return this._config.delete(savedFilter)
|
|
89
|
-
.pipe(tap(() => {
|
|
90
|
-
this.savedFilters = this.savedFilters
|
|
91
|
-
.filter((f) => f.id !== savedFilter.id);
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
94
|
-
setActiveFilter(savedFilter) {
|
|
95
|
-
if (savedFilter) {
|
|
96
|
-
const existingFilter = this.savedFilters
|
|
97
|
-
.find((f) => f.id === savedFilter.id);
|
|
98
|
-
if (!existingFilter) {
|
|
99
|
-
throw new Error(`Saved filter cannot be activated, because it does not exists. Filter ID = ${savedFilter.id}`);
|
|
100
|
-
}
|
|
101
|
-
this._activeFilter$.next(existingFilter);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
this._activeFilter$.next(null);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
openSavedFilterEditDialog() {
|
|
108
|
-
const params = buildQueryParams(this._itemsStore.valuesAsQuery(), this._itemsStore.items);
|
|
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);
|
|
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
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController, deps: [{ token: i1.FsFilterItemsStore }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
160
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController });
|
|
161
|
-
}
|
|
162
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController, decorators: [{
|
|
163
|
-
type: Injectable
|
|
164
|
-
}], ctorParameters: () => [{ type: i1.FsFilterItemsStore }, { type: i2.MatDialog }] });
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtZmlsdGVycy1jb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9zYXZlZC1maWx0ZXJzLWNvbnRyb2xsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLGdDQUFnQyxHQUNqQyxNQUFNLDZFQUE2RSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQU0zRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUk1RCxNQUFNLE9BQU8sc0JBQXNCO0lBVXZCO0lBQ0E7SUFUQSxPQUFPLENBQTRCO0lBRXJDLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7SUFDL0QsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFxQixJQUFJLENBQUMsQ0FBQztJQUMvRCxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDaEQsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFeEMsWUFDVSxXQUErQixFQUMvQixPQUFrQjtRQURsQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsWUFBTyxHQUFQLE9BQU8sQ0FBVztJQUN6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SSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLGlCQUFpQjtRQUN0Qix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN4QyxXQUFXLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQWM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQzt3R0E1TVUsc0JBQXNCOzRHQUF0QixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgRnNGaWx0ZXJTYXZlZEZpbHRlckVkaXRDb21wb25lbnQsXG59IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2F2ZWQtZmlsdGVyL3NhdmVkLWZpbHRlci1lZGl0L3NhdmVkLWZpbHRlci1lZGl0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy9idWlsZC1xdWVyeS1wYXJhbXMnO1xuaW1wb3J0IHsgcmVzdG9yZUl0ZW1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy9yZXN0b3JlLWl0ZW1zJztcbmltcG9ydCB7IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZXh0ZXJuYWwtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBJRmlsdGVyU2F2ZWRGaWx0ZXIsXG4gIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2F2ZWQtZmlsdGVycy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNGaWx0ZXJJdGVtc1N0b3JlIH0gZnJvbSAnLi4vaXRlbXMtc3RvcmUuc2VydmljZSc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByb3RlY3RlZCBfY29uZmlnOiBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnO1xuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcltdPihbXSk7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcj4obnVsbCk7XG4gIHByaXZhdGUgX2VuYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9pdGVtc1N0b3JlOiBGc0ZpbHRlckl0ZW1zU3RvcmUsXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVuYWJsZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBzYXZlZEZpbHRlcnMoKTogSUZpbHRlclNhdmVkRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNhdmVkRmlsdGVycyhmaWx0ZXJzOiBJRmlsdGVyU2F2ZWRGaWx0ZXJbXSkge1xuICAgIHRoaXMuX3NhdmVkRmlsdGVycyQubmV4dChmaWx0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2F2ZWRGaWx0ZXJzJCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkRmlsdGVycyRcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyKCk6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlciQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyJCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXIkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlckRhdGEoKTogSUZpbHRlckV4dGVybmFsUGFyYW1zIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyJC5nZXRWYWx1ZSgpPy5maWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KFxuICAgIHJlbW90ZVBhcmFtc0NvbmZpZzogSUZpbHRlclNhdmVkRmlsdGVyc0NvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFyZW1vdGVQYXJhbXNDb25maWcpIHtcbiAgICAgIHRoaXMuX3NldEVuYWJsZWRTdGF0dXMoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NldEVuYWJsZWRTdGF0dXModHJ1ZSk7XG5cbiAgICB0aGlzLl9jb25maWcgPSByZW1vdGVQYXJhbXNDb25maWc7XG4gIH1cblxuICBwdWJsaWMgaW5pdFNhdmVkRmlsdGVycyhmaWx0ZXJzOiBJRmlsdGVyU2F2ZWRGaWx0ZXJbXSk6IHZvaWQge1xuICAgIGZpbHRlcnMgPSBbLi4uZmlsdGVyc107XG4gICAgZmlsdGVycy5mb3JFYWNoKChzYXZlZEZpbHRlcikgPT4ge1xuICAgICAgc2F2ZWRGaWx0ZXIuZmlsdGVycyA9IHJlc3RvcmVJdGVtcyhcbiAgICAgICAgc2F2ZWRGaWx0ZXIuZmlsdGVycyxcbiAgICAgICAgdGhpcy5faXRlbXNTdG9yZS5pdGVtcyxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IGZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgbG9hZCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5sb2FkKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0U2F2ZWRGaWx0ZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmUoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IE9ic2VydmFibGU8SUZpbHRlclNhdmVkRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYXZlKHNhdmVkRmlsdGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBvcmRlcihzYXZlZEZpbHRlcnM6IElGaWx0ZXJTYXZlZEZpbHRlcltdKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcub3JkZXIoc2F2ZWRGaWx0ZXJzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlZEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAuLi5zYXZlZEZpbHRlcnMsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShzYXZlZEZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmRlbGV0ZShzYXZlZEZpbHRlcilcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2ZWRGaWx0ZXJzID0gdGhpcy5zYXZlZEZpbHRlcnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYuaWQgIT09IHNhdmVkRmlsdGVyLmlkKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUZpbHRlcihzYXZlZEZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKHNhdmVkRmlsdGVyKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpbHRlciA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAgIC5maW5kKChmKSA9PiBmLmlkID09PSBzYXZlZEZpbHRlci5pZCk7XG5cbiAgICAgIGlmICghZXhpc3RpbmdGaWx0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYXZlZCBmaWx0ZXIgY2Fubm90IGJlIGFjdGl2YXRlZCwgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdHMuIEZpbHRlciBJRCA9ICR7c2F2ZWRGaWx0ZXIuaWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlciQubmV4dChleGlzdGluZ0ZpbHRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlciQubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3BlblNhdmVkRmlsdGVyRWRpdERpYWxvZygpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXMgPSBidWlsZFF1ZXJ5UGFyYW1zKFxuICAgICAgdGhpcy5faXRlbXNTdG9yZS52YWx1ZXNBc1F1ZXJ5KCksXG4gICAgICB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zLFxuICAgICk7XG5cbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICBzYXZlZEZpbHRlcnM6IHRoaXMuc2F2ZWRGaWx0ZXJzLFxuICAgICAgICBzYXZlQ2FsbGJhY2s6IHRoaXMuc2F2ZS5iaW5kKHRoaXMpLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGhpcy5fZGlhbG9nXG4gICAgICAub3BlbihGc0ZpbHRlclNhdmVkRmlsdGVyRWRpdENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKVxuICAgICAgLmJlZm9yZUNsb3NlZCgpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHVwZGF0ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlciB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXIpIHtcbiAgICAgICAgICAvLyBnZXQgYWxyZWFkeSBzYXZlZCByZWxhdGVkIGZpbHRlciBvYmplY3RcbiAgICAgICAgICBjb25zdCBzYXZlZEZpbHRlciA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAgICAgICAuZmluZCgoZikgPT4gZi5pZCA9PT0gdXBkYXRlZEZpbHRlci5pZCk7XG5cbiAgICAgICAgICAvLyByZXN0b3JlIHZhbHVlcyBmcm9tIHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgIHVwZGF0ZWRGaWx0ZXIuZmlsdGVycyA9IHJlc3RvcmVJdGVtcyhcbiAgICAgICAgICAgIHVwZGF0ZWRGaWx0ZXIuZmlsdGVycyxcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXMsXG4gICAgICAgICAgKTtcblxuXG4gICAgICAgICAgaWYgKHNhdmVkRmlsdGVyKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNhdmVkRmlsdGVyLCB1cGRhdGVkRmlsdGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEFjdGl2ZUZpbHRlcigpO1xuICAgICAgICAgICAgdGhpcy5zYXZlZEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgIC4uLnRoaXMuc2F2ZWRGaWx0ZXJzLFxuICAgICAgICAgICAgICB1cGRhdGVkRmlsdGVyLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVBY3RpdmVGaWx0ZXIoKTogdm9pZCB7XG4gICAgLy8gTG9va3VwIGFjdGl2ZSBmaWx0ZXJcbiAgICBjb25zdCBhY2l0dmVGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgLmZpbmQoKGYpID0+IGYuYWN0aXZlKTtcblxuICAgIGlmIChhY2l0dmVGaWx0ZXIpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlRmlsdGVyKGFjaXR2ZUZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0QWN0aXZlRmlsdGVyKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IGFsbCBwcmV2aW91c2x5IGFjdGl2YXRlZCBmaWx0ZXJzXG4gICAgdGhpcy5zYXZlZEZpbHRlcnMuZm9yRWFjaCgoc2F2ZWRGaWx0ZXIpID0+IHtcbiAgICAgIHNhdmVkRmlsdGVyLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRBY3RpdmVGaWx0ZXIobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRFbmFibGVkU3RhdHVzKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZW5hYmxlZCQubmV4dCh2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,183 +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 { QueryParamsController, QueryPersistanceController, SavedFiltersController, } from './external-params';
|
|
6
|
-
import { FsFilterItemsStore } from './items-store.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./items-store.service";
|
|
9
|
-
import * as i2 from "./external-params";
|
|
10
|
-
export class ExternalParamsController {
|
|
11
|
-
_itemsStore;
|
|
12
|
-
_persistanceStore;
|
|
13
|
-
_queryParams;
|
|
14
|
-
_savedFilters;
|
|
15
|
-
_init;
|
|
16
|
-
_pending$ = new BehaviorSubject(false);
|
|
17
|
-
_shouldResetSavedFilters = true;
|
|
18
|
-
_config;
|
|
19
|
-
_destroy$ = new Subject();
|
|
20
|
-
constructor(_itemsStore, _persistanceStore, _queryParams, _savedFilters) {
|
|
21
|
-
this._itemsStore = _itemsStore;
|
|
22
|
-
this._persistanceStore = _persistanceStore;
|
|
23
|
-
this._queryParams = _queryParams;
|
|
24
|
-
this._savedFilters = _savedFilters;
|
|
25
|
-
}
|
|
26
|
-
get params() {
|
|
27
|
-
let result = {};
|
|
28
|
-
if (this._persistanceStore.queryEnabled) {
|
|
29
|
-
result = {
|
|
30
|
-
...result,
|
|
31
|
-
...this._persistanceStore.getQuery(),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
if (this._savedFilters.enabled && this._savedFilters.activeFilter) {
|
|
35
|
-
const query = Object.keys(result)
|
|
36
|
-
.filter((key) => !this._itemsStore.itemNames.includes(key))
|
|
37
|
-
.reduce((acc, key) => {
|
|
38
|
-
return {
|
|
39
|
-
...acc,
|
|
40
|
-
[key]: result[key],
|
|
41
|
-
};
|
|
42
|
-
}, {});
|
|
43
|
-
result = {
|
|
44
|
-
...query,
|
|
45
|
-
...this._savedFilters.activeFilterData,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
else if (this._queryParams.enabled) {
|
|
49
|
-
result = {
|
|
50
|
-
...result,
|
|
51
|
-
...this._queryParams.fetchedParams,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
get pending() {
|
|
57
|
-
return this._pending$.getValue();
|
|
58
|
-
}
|
|
59
|
-
get pending$() {
|
|
60
|
-
return this._pending$.asObservable();
|
|
61
|
-
}
|
|
62
|
-
get savedFiltersController() {
|
|
63
|
-
return this._savedFilters;
|
|
64
|
-
}
|
|
65
|
-
get savedFiltersEnabled() {
|
|
66
|
-
return this._savedFilters.enabled;
|
|
67
|
-
}
|
|
68
|
-
ngOnDestroy() {
|
|
69
|
-
this._destroy$.next(null);
|
|
70
|
-
this._destroy$.complete();
|
|
71
|
-
}
|
|
72
|
-
setConfig(config) {
|
|
73
|
-
this._config = config;
|
|
74
|
-
this._initQueryParams();
|
|
75
|
-
this._initSavedFilters();
|
|
76
|
-
this.initItems();
|
|
77
|
-
}
|
|
78
|
-
setActiveSavedFilter(savedFilter) {
|
|
79
|
-
this.savedFiltersController.setActiveFilter(savedFilter);
|
|
80
|
-
if (savedFilter) {
|
|
81
|
-
this.reloadFiltersWithValues(savedFilter.filters, false);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
reloadFiltersWithValues(params, shouldResetSavedFilters = true) {
|
|
85
|
-
this._shouldResetSavedFilters = shouldResetSavedFilters;
|
|
86
|
-
this._itemsStore.updateItemsWithValues(params);
|
|
87
|
-
this._saveQueryParams();
|
|
88
|
-
this._savePersistedParams();
|
|
89
|
-
}
|
|
90
|
-
initItems() {
|
|
91
|
-
this._pending$.next(true);
|
|
92
|
-
if (this._savedFilters.enabled) {
|
|
93
|
-
this._savedFilters
|
|
94
|
-
.load()
|
|
95
|
-
.pipe(takeUntil(this._destroy$))
|
|
96
|
-
.subscribe(() => {
|
|
97
|
-
this._savedFilters.updateActiveFilter();
|
|
98
|
-
this._initItemsValues();
|
|
99
|
-
this._listenAndResetSavedFilters();
|
|
100
|
-
this._pending$.next(false);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
this._initItemsValues();
|
|
105
|
-
this._pending$.next(false);
|
|
106
|
-
}
|
|
107
|
-
this._listenItemsChange();
|
|
108
|
-
}
|
|
109
|
-
_initItemsValues() {
|
|
110
|
-
this._itemsStore.init(this.params);
|
|
111
|
-
this._saveQueryParams();
|
|
112
|
-
this._savePersistedParams();
|
|
113
|
-
}
|
|
114
|
-
fetchQueryParams() {
|
|
115
|
-
this._initQueryParams();
|
|
116
|
-
this._itemsStore.updateItemsWithValues(this.params);
|
|
117
|
-
}
|
|
118
|
-
_initQueryParams() {
|
|
119
|
-
this._queryParams.init(this._config.queryParam);
|
|
120
|
-
}
|
|
121
|
-
_initSavedFilters() {
|
|
122
|
-
this._savedFilters.init(this._config.savedFilters);
|
|
123
|
-
}
|
|
124
|
-
_listenItemsChange() {
|
|
125
|
-
this._itemsStore.ready$
|
|
126
|
-
.pipe(filter((v) => v), take(1), takeUntil(this._destroy$))
|
|
127
|
-
.subscribe(() => {
|
|
128
|
-
this._saveQueryParams();
|
|
129
|
-
this._savePersistedParams();
|
|
130
|
-
});
|
|
131
|
-
this._itemsStore
|
|
132
|
-
.itemsChange$
|
|
133
|
-
.pipe(takeUntil(this._destroy$))
|
|
134
|
-
.subscribe(() => {
|
|
135
|
-
this._saveQueryParams();
|
|
136
|
-
this._savePersistedParams();
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
_listenAndResetSavedFilters() {
|
|
140
|
-
this._itemsStore
|
|
141
|
-
.itemsChange$
|
|
142
|
-
.pipe(filter(() => !!this.savedFiltersController.activeFilter), switchMap(() => {
|
|
143
|
-
const shouldReset = this._shouldResetSavedFilters;
|
|
144
|
-
this._shouldResetSavedFilters = true;
|
|
145
|
-
return of(shouldReset);
|
|
146
|
-
}), filter((shouldReset) => shouldReset), takeUntil(this._destroy$))
|
|
147
|
-
.subscribe(() => {
|
|
148
|
-
this.savedFiltersController.resetActiveFilter();
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
_saveQueryParams() {
|
|
152
|
-
const params = buildQueryParams(this._itemsStore
|
|
153
|
-
.valuesAsQuery({
|
|
154
|
-
onlyPresented: false,
|
|
155
|
-
items: this._itemsStore.items,
|
|
156
|
-
persisted: true,
|
|
157
|
-
}), this._itemsStore.items);
|
|
158
|
-
this._itemsStore.items
|
|
159
|
-
.filter((item) => item.queryParamsDisabled || !item.isQueryParamVisible)
|
|
160
|
-
.forEach((item) => {
|
|
161
|
-
params[item.name] = undefined;
|
|
162
|
-
});
|
|
163
|
-
this._queryParams.writeStateToQueryParams(params);
|
|
164
|
-
}
|
|
165
|
-
_savePersistedParams() {
|
|
166
|
-
if (this._persistanceStore.queryEnabled) {
|
|
167
|
-
const targetItems = this._itemsStore.items
|
|
168
|
-
.filter((item) => !item.persistanceDisabled)
|
|
169
|
-
.filter((item) => item.value !== undefined)
|
|
170
|
-
.reduce((acc, item) => {
|
|
171
|
-
acc[item.name] = item.model;
|
|
172
|
-
return acc;
|
|
173
|
-
}, {});
|
|
174
|
-
this._persistanceStore.setQuery(targetItems);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalParamsController, deps: [{ token: i1.FsFilterItemsStore }, { token: i2.QueryPersistanceController }, { token: i2.QueryParamsController }, { token: i2.SavedFiltersController }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
178
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalParamsController });
|
|
179
|
-
}
|
|
180
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalParamsController, decorators: [{
|
|
181
|
-
type: Injectable
|
|
182
|
-
}], ctorParameters: () => [{ type: i1.FsFilterItemsStore }, { type: i2.QueryPersistanceController }, { type: i2.QueryParamsController }, { type: i2.SavedFiltersController }] });
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJakUsT0FBTyxFQUNMLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLHNCQUFzQixHQUMxRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBSTNELE1BQU0sT0FBTyx3QkFBd0I7SUFVekI7SUFDQTtJQUNBO0lBQ0E7SUFYQSxLQUFLLENBQUM7SUFFUixTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLE9BQU8sQ0FBaUI7SUFDeEIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFeEMsWUFDVSxXQUErQixFQUMvQixpQkFBNkMsRUFDN0MsWUFBbUMsRUFDbkMsYUFBcUM7UUFIckMsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNEI7UUFDN0MsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBQ25DLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtJQUMzQyxDQUFDO0lBRUwsSUFBVyxNQUFNO1FBQ2YsSUFBSSxNQUFNLEdBQTBCLEVBQUUsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEdBQUc7Z0JBQ1AsR0FBRyxNQUFNO2dCQUNULEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRTthQUNyQyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDOUIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNuQixPQUFPO29CQUNMLEdBQUcsR0FBRztvQkFDTixDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7aUJBQ25CLENBQUM7WUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFVCxNQUFNLEdBQUc7Z0JBQ1AsR0FBRyxLQUFLO2dCQUNSLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0I7YUFDdkMsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHO2dCQUNQLEdBQUcsTUFBTTtnQkFDVCxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYTthQUNuQyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQU07UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFdEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxXQUErQjtRQUN6RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxNQUE2QixFQUFFLHVCQUF1QixHQUFHLElBQUk7UUFDMUYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGFBQWE7aUJBQ2YsSUFBSSxFQUFFO2lCQUNOLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjtpQkFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTthQUNwQixJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDaEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLFdBQVc7YUFDYixZQUFZO2FBQ1osSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxJQUFJLENBQUMsV0FBVzthQUNiLFlBQVk7YUFDWixJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLEVBQ3hELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFFbEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztZQUVyQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsRUFDRixNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxnQkFBZ0I7UUFFdEIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQzdCLElBQUksQ0FBQyxXQUFXO2FBQ2IsYUFBYSxDQUFDO1lBQ2IsYUFBYSxFQUFFLEtBQUs7WUFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSztZQUM3QixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLEVBQ0osSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQ3ZCLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7YUFDbkIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7YUFDdkUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO2lCQUN2QyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2lCQUMzQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO2lCQUMxQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFFNUIsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQXJOVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBidWlsZFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vaGVscGVycy9idWlsZC1xdWVyeS1wYXJhbXMnO1xuaW1wb3J0IHsgSUZpbHRlckV4dGVybmFsUGFyYW1zLCBJRmlsdGVyU2F2ZWRGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2ZpbHRlci1jb25maWcnO1xuXG5pbXBvcnQge1xuICBRdWVyeVBhcmFtc0NvbnRyb2xsZXIsIFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyLCBTYXZlZEZpbHRlcnNDb250cm9sbGVyLFxufSBmcm9tICcuL2V4dGVybmFsLXBhcmFtcyc7XG5pbXBvcnQgeyBGc0ZpbHRlckl0ZW1zU3RvcmUgfSBmcm9tICcuL2l0ZW1zLXN0b3JlLnNlcnZpY2UnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByb3RlY3RlZCBfaW5pdDtcblxuICBwcml2YXRlIF9wZW5kaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIF9zaG91bGRSZXNldFNhdmVkRmlsdGVycyA9IHRydWU7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9pdGVtc1N0b3JlOiBGc0ZpbHRlckl0ZW1zU3RvcmUsXG4gICAgcHJpdmF0ZSBfcGVyc2lzdGFuY2VTdG9yZTogUXVlcnlQZXJzaXN0YW5jZUNvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfcXVlcnlQYXJhbXM6IFF1ZXJ5UGFyYW1zQ29udHJvbGxlcixcbiAgICBwcml2YXRlIF9zYXZlZEZpbHRlcnM6IFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIsXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBwYXJhbXMoKTogSUZpbHRlckV4dGVybmFsUGFyYW1zIHtcbiAgICBsZXQgcmVzdWx0OiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgPSB7fTtcblxuICAgIGlmICh0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLnF1ZXJ5RW5hYmxlZCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAuLi5yZXN1bHQsIFxuICAgICAgICAuLi50aGlzLl9wZXJzaXN0YW5jZVN0b3JlLmdldFF1ZXJ5KCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zYXZlZEZpbHRlcnMuZW5hYmxlZCAmJiB0aGlzLl9zYXZlZEZpbHRlcnMuYWN0aXZlRmlsdGVyKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5rZXlzKHJlc3VsdClcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhdGhpcy5faXRlbXNTdG9yZS5pdGVtTmFtZXMuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgW2tleV06IHJlc3VsdFtrZXldLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAuLi5xdWVyeSwgXG4gICAgICAgIC4uLnRoaXMuX3NhdmVkRmlsdGVycy5hY3RpdmVGaWx0ZXJEYXRhLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3F1ZXJ5UGFyYW1zLmVuYWJsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgLi4ucmVzdWx0LCBcbiAgICAgICAgLi4udGhpcy5fcXVlcnlQYXJhbXMuZmV0Y2hlZFBhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVuZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVuZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzYXZlZEZpbHRlcnNDb250cm9sbGVyKCk6IFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhdmVkRmlsdGVyc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkRmlsdGVycy5lbmFibGVkO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuXG4gICAgdGhpcy5faW5pdFF1ZXJ5UGFyYW1zKCk7XG4gICAgdGhpcy5faW5pdFNhdmVkRmlsdGVycygpO1xuICAgIHRoaXMuaW5pdEl0ZW1zKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlU2F2ZWRGaWx0ZXIoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcikge1xuICAgIHRoaXMuc2F2ZWRGaWx0ZXJzQ29udHJvbGxlci5zZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXIpO1xuXG4gICAgaWYgKHNhdmVkRmlsdGVyKSB7XG4gICAgICB0aGlzLnJlbG9hZEZpbHRlcnNXaXRoVmFsdWVzKHNhdmVkRmlsdGVyLmZpbHRlcnMsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkRmlsdGVyc1dpdGhWYWx1ZXMocGFyYW1zOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMsIHNob3VsZFJlc2V0U2F2ZWRGaWx0ZXJzID0gdHJ1ZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlc2V0U2F2ZWRGaWx0ZXJzID0gc2hvdWxkUmVzZXRTYXZlZEZpbHRlcnM7XG4gICAgdGhpcy5faXRlbXNTdG9yZS51cGRhdGVJdGVtc1dpdGhWYWx1ZXMocGFyYW1zKTtcblxuICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0SXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZyQubmV4dCh0cnVlKTtcbiAgICBpZiAodGhpcy5fc2F2ZWRGaWx0ZXJzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3NhdmVkRmlsdGVyc1xuICAgICAgICAubG9hZCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc2F2ZWRGaWx0ZXJzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICAgIHRoaXMuX2luaXRJdGVtc1ZhbHVlcygpO1xuICAgICAgICAgIHRoaXMuX2xpc3RlbkFuZFJlc2V0U2F2ZWRGaWx0ZXJzKCk7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbml0SXRlbXNWYWx1ZXMoKTtcbiAgICAgIHRoaXMuX3BlbmRpbmckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3Rlbkl0ZW1zQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgX2luaXRJdGVtc1ZhbHVlcygpIHtcbiAgICB0aGlzLl9pdGVtc1N0b3JlLmluaXQodGhpcy5wYXJhbXMpO1xuICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaFF1ZXJ5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX2l0ZW1zU3RvcmUudXBkYXRlSXRlbXNXaXRoVmFsdWVzKHRoaXMucGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRRdWVyeVBhcmFtcygpIHtcbiAgICB0aGlzLl9xdWVyeVBhcmFtcy5pbml0KHRoaXMuX2NvbmZpZy5xdWVyeVBhcmFtKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRTYXZlZEZpbHRlcnMoKSB7XG4gICAgdGhpcy5fc2F2ZWRGaWx0ZXJzLmluaXQodGhpcy5fY29uZmlnLnNhdmVkRmlsdGVycyk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JdGVtc0NoYW5nZSgpIHtcbiAgICB0aGlzLl9pdGVtc1N0b3JlLnJlYWR5JFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigodikgPT4gdiksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZVF1ZXJ5UGFyYW1zKCk7XG4gICAgICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faXRlbXNTdG9yZVxuICAgICAgLml0ZW1zQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZVF1ZXJ5UGFyYW1zKCk7XG4gICAgICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuQW5kUmVzZXRTYXZlZEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5faXRlbXNTdG9yZVxuICAgICAgLml0ZW1zQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuc2F2ZWRGaWx0ZXJzQ29udHJvbGxlci5hY3RpdmVGaWx0ZXIpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlc2V0ID0gdGhpcy5fc2hvdWxkUmVzZXRTYXZlZEZpbHRlcnM7XG5cbiAgICAgICAgICB0aGlzLl9zaG91bGRSZXNldFNhdmVkRmlsdGVycyA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gb2Yoc2hvdWxkUmVzZXQpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKChzaG91bGRSZXNldCkgPT4gc2hvdWxkUmVzZXQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZWRGaWx0ZXJzQ29udHJvbGxlci5yZXNldEFjdGl2ZUZpbHRlcigpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUXVlcnlQYXJhbXMoKSB7XG5cbiAgICBjb25zdCBwYXJhbXMgPSBidWlsZFF1ZXJ5UGFyYW1zKFxuICAgICAgdGhpcy5faXRlbXNTdG9yZVxuICAgICAgICAudmFsdWVzQXNRdWVyeSh7XG4gICAgICAgICAgb25seVByZXNlbnRlZDogZmFsc2UsXG4gICAgICAgICAgaXRlbXM6IHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXMsXG4gICAgICAgICAgcGVyc2lzdGVkOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXMsXG4gICAgKTtcbiAgIFxuICAgIHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ucXVlcnlQYXJhbXNEaXNhYmxlZCB8fCAhaXRlbS5pc1F1ZXJ5UGFyYW1WaXNpYmxlKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgcGFyYW1zW2l0ZW0ubmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3F1ZXJ5UGFyYW1zLndyaXRlU3RhdGVUb1F1ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUGVyc2lzdGVkUGFyYW1zKCkge1xuICAgIGlmKHRoaXMuX3BlcnNpc3RhbmNlU3RvcmUucXVlcnlFbmFibGVkKSB7XG4gICAgICBjb25zdCB0YXJnZXRJdGVtcyA9IHRoaXMuX2l0ZW1zU3RvcmUuaXRlbXNcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0ucGVyc2lzdGFuY2VEaXNhYmxlZClcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICBhY2NbaXRlbS5uYW1lXSA9IGl0ZW0ubW9kZWw7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgIHRoaXMuX3BlcnNpc3RhbmNlU3RvcmUuc2V0UXVlcnkodGFyZ2V0SXRlbXMpO1xuICAgIH1cbiAgfVxufVxuIl19
|