@firestitch/filter 18.1.0 → 18.2.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.
- package/app/components/filter/filter.component.d.ts +9 -13
- package/app/components/filter-chip/filter-chip.component.d.ts +7 -7
- package/app/components/filter-drawer/filter-drawer.component.d.ts +7 -7
- package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +2 -2
- package/app/components/saved-filter/index.d.ts +0 -1
- package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +6 -5
- 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 +6 -2
- package/app/fs-filter.module.d.ts +7 -8
- package/app/helpers/build-query-params.d.ts +2 -2
- package/app/helpers/create-filter-item.d.ts +1 -1
- package/app/interfaces/external-params.interface.d.ts +1 -1
- package/app/interfaces/saved-filters.interface.d.ts +2 -2
- 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-range/base-date-range-item.d.ts +1 -1
- 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/services/index.d.ts +5 -5
- package/app/services/{items-store.service.d.ts → item-store.service.d.ts} +9 -9
- package/app/services/{external-params-controller.service.d.ts → param-controller.service.d.ts} +9 -10
- package/app/services/{query-persistance-controller.service.d.ts → persistance-controller.service.d.ts} +3 -3
- package/app/services/query-param-controller.service.d.ts +21 -0
- package/app/services/{saved-filters-controller.service.d.ts → saved-filter-controller.service.d.ts} +6 -10
- package/esm2022/app/components/filter/filter.component.mjs +68 -77
- package/esm2022/app/components/filter-chip/filter-chip.component.mjs +22 -16
- package/esm2022/app/components/filter-chips/filter-chips.component.mjs +3 -3
- package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +18 -18
- package/esm2022/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +1 -1
- package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +5 -5
- package/esm2022/app/components/saved-filter/index.mjs +1 -2
- package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +17 -16
- 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 +24 -17
- package/esm2022/app/fs-filter.module.mjs +1 -5
- package/esm2022/app/helpers/build-query-params.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-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-range/base-date-range-item.mjs +12 -12
- 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/services/index.mjs +6 -6
- 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 -3
- package/fesm2022/firestitch-filter.mjs +1714 -1787
- package/fesm2022/firestitch-filter.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -2
- 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/services/query-params-controller.service.d.ts +0 -21
- 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 -72
- package/esm2022/app/services/external-params-controller.service.mjs +0 -154
- package/esm2022/app/services/items-store.service.mjs +0 -356
- package/esm2022/app/services/query-params-controller.service.mjs +0 -65
- package/esm2022/app/services/query-persistance-controller.service.mjs +0 -65
- package/esm2022/app/services/saved-filters-controller.service.mjs +0 -210
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { inject, Injectable } from '@angular/core';
|
|
2
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
-
import { FsMessage } from '@firestitch/message';
|
|
4
|
-
import { FsPrompt } from '@firestitch/prompt';
|
|
5
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
6
|
-
import { distinctUntilChanged, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
7
|
-
import { FsFilterSavedFilterEditComponent, } from '../components/saved-filter/saved-filter-edit/saved-filter-edit.component';
|
|
8
|
-
import { restoreItems } from '../helpers/restore-items';
|
|
9
|
-
import { FsFilterItemsStore } from './items-store.service';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
export class SavedFiltersController {
|
|
12
|
-
_config;
|
|
13
|
-
_savedFilters$ = new BehaviorSubject([]);
|
|
14
|
-
_activeFilter$ = new BehaviorSubject(null);
|
|
15
|
-
_enabled$ = new BehaviorSubject(false);
|
|
16
|
-
_destroy$ = new Subject();
|
|
17
|
-
_itemsStore = inject(FsFilterItemsStore);
|
|
18
|
-
_dialog = inject(MatDialog);
|
|
19
|
-
_prompt = inject(FsPrompt);
|
|
20
|
-
_message = inject(FsMessage);
|
|
21
|
-
get singularLabel() {
|
|
22
|
-
return this._config?.label?.singular || 'Saved filter';
|
|
23
|
-
}
|
|
24
|
-
get singularLabelLower() {
|
|
25
|
-
return this.singularLabel.toLowerCase();
|
|
26
|
-
}
|
|
27
|
-
get labelIcon() {
|
|
28
|
-
return this._config?.label?.icon || 'save';
|
|
29
|
-
}
|
|
30
|
-
get pluralLabel() {
|
|
31
|
-
return this._config?.label?.plural || 'Saved filters';
|
|
32
|
-
}
|
|
33
|
-
get pluralLabelLower() {
|
|
34
|
-
return this.pluralLabel.toLowerCase();
|
|
35
|
-
}
|
|
36
|
-
get enabled() {
|
|
37
|
-
return this._enabled$.getValue();
|
|
38
|
-
}
|
|
39
|
-
get enabled$() {
|
|
40
|
-
return this._enabled$
|
|
41
|
-
.pipe(distinctUntilChanged());
|
|
42
|
-
}
|
|
43
|
-
get savedFilters() {
|
|
44
|
-
return this._savedFilters$.getValue();
|
|
45
|
-
}
|
|
46
|
-
set savedFilters(filters) {
|
|
47
|
-
this._savedFilters$.next(filters);
|
|
48
|
-
}
|
|
49
|
-
get savedFilters$() {
|
|
50
|
-
return this._savedFilters$
|
|
51
|
-
.pipe(distinctUntilChanged());
|
|
52
|
-
}
|
|
53
|
-
get activeFilter() {
|
|
54
|
-
return this._activeFilter$.getValue();
|
|
55
|
-
}
|
|
56
|
-
get activeFilter$() {
|
|
57
|
-
return this._activeFilter$
|
|
58
|
-
.pipe(distinctUntilChanged());
|
|
59
|
-
}
|
|
60
|
-
get activeFilterData() {
|
|
61
|
-
return this._activeFilter$.getValue()?.filters;
|
|
62
|
-
}
|
|
63
|
-
ngOnDestroy() {
|
|
64
|
-
this._destroy$.next(null);
|
|
65
|
-
this._destroy$.complete();
|
|
66
|
-
}
|
|
67
|
-
init(filterSavedFiltersConfig) {
|
|
68
|
-
if (!filterSavedFiltersConfig) {
|
|
69
|
-
this._setEnabledStatus(false);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
this._setEnabledStatus(true);
|
|
73
|
-
this._config = filterSavedFiltersConfig;
|
|
74
|
-
}
|
|
75
|
-
initSavedFilters(filters) {
|
|
76
|
-
this.savedFilters = filters;
|
|
77
|
-
}
|
|
78
|
-
load() {
|
|
79
|
-
return this._config.load()
|
|
80
|
-
.pipe(tap((response) => {
|
|
81
|
-
this.initSavedFilters(response);
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
create() {
|
|
85
|
-
return this._prompt.input({
|
|
86
|
-
title: `Create ${this.singularLabel}`,
|
|
87
|
-
label: 'Name',
|
|
88
|
-
required: true,
|
|
89
|
-
commitLabel: 'Create',
|
|
90
|
-
dialogConfig: {
|
|
91
|
-
restoreFocus: false,
|
|
92
|
-
},
|
|
93
|
-
})
|
|
94
|
-
.pipe(switchMap((name) => {
|
|
95
|
-
const data = {
|
|
96
|
-
name,
|
|
97
|
-
filters: this._itemsStore.queryParams(),
|
|
98
|
-
};
|
|
99
|
-
return this.save(data);
|
|
100
|
-
}), tap((savedFilter) => {
|
|
101
|
-
this.setActiveFilter(savedFilter);
|
|
102
|
-
}));
|
|
103
|
-
}
|
|
104
|
-
save(savedFilter) {
|
|
105
|
-
const exists = !!savedFilter.id;
|
|
106
|
-
savedFilter = {
|
|
107
|
-
...this.activeFilter,
|
|
108
|
-
...savedFilter,
|
|
109
|
-
filters: this._itemsStore.models(),
|
|
110
|
-
};
|
|
111
|
-
return this._config.save(savedFilter)
|
|
112
|
-
.pipe(tap((_savedFilter) => {
|
|
113
|
-
this.savedFilters = exists ? this.savedFilters
|
|
114
|
-
.map((f) => f.id === savedFilter.id ? _savedFilter : f) : [
|
|
115
|
-
...this.savedFilters,
|
|
116
|
-
_savedFilter,
|
|
117
|
-
];
|
|
118
|
-
this.setActiveFilter(_savedFilter);
|
|
119
|
-
}));
|
|
120
|
-
}
|
|
121
|
-
get orderable() {
|
|
122
|
-
return !!this._config.order;
|
|
123
|
-
}
|
|
124
|
-
order(savedFilters) {
|
|
125
|
-
return this._config.order(savedFilters)
|
|
126
|
-
.pipe(tap(() => {
|
|
127
|
-
this.savedFilters = [
|
|
128
|
-
...savedFilters,
|
|
129
|
-
];
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
delete(savedFilter) {
|
|
133
|
-
return this._config.delete(savedFilter)
|
|
134
|
-
.pipe(tap(() => {
|
|
135
|
-
this.savedFilters = this.savedFilters
|
|
136
|
-
.filter((f) => f.id !== savedFilter.id);
|
|
137
|
-
}));
|
|
138
|
-
}
|
|
139
|
-
setActiveFilter(savedFilter) {
|
|
140
|
-
if (savedFilter) {
|
|
141
|
-
const existingFilter = this.savedFilters
|
|
142
|
-
.find((f) => f.id === savedFilter.id);
|
|
143
|
-
if (!existingFilter) {
|
|
144
|
-
throw new Error(`Saved filter cannot be activated, because it does not exists. Filter ID = ${savedFilter.id}`);
|
|
145
|
-
}
|
|
146
|
-
this._activeFilter$.next(existingFilter);
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
this._activeFilter$.next(null);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
openSavedFilterEditDialog() {
|
|
153
|
-
const params = this._itemsStore.queryParams();
|
|
154
|
-
const dialogConfig = {
|
|
155
|
-
data: {
|
|
156
|
-
params: params,
|
|
157
|
-
savedFilters: this.savedFilters,
|
|
158
|
-
saveCallback: this.save.bind(this),
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
this._dialog
|
|
162
|
-
.open(FsFilterSavedFilterEditComponent, dialogConfig)
|
|
163
|
-
.beforeClosed()
|
|
164
|
-
.pipe(take(1), takeUntil(this._destroy$))
|
|
165
|
-
.subscribe((updatedFilter) => {
|
|
166
|
-
if (updatedFilter) {
|
|
167
|
-
// get already saved related filter object
|
|
168
|
-
const savedFilter = this.savedFilters
|
|
169
|
-
.find((f) => f.id === updatedFilter.id);
|
|
170
|
-
// restore values from query string
|
|
171
|
-
updatedFilter.filters = restoreItems(updatedFilter.filters, this._itemsStore.items);
|
|
172
|
-
if (savedFilter) {
|
|
173
|
-
Object.assign(savedFilter, updatedFilter);
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this.resetActiveFilter();
|
|
177
|
-
this.savedFilters = [
|
|
178
|
-
...this.savedFilters,
|
|
179
|
-
updatedFilter,
|
|
180
|
-
];
|
|
181
|
-
}
|
|
182
|
-
this.updateActiveFilter();
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
updateActiveFilter() {
|
|
187
|
-
// Lookup active filter
|
|
188
|
-
const acitveFilter = this.savedFilters
|
|
189
|
-
.find((f) => f.active);
|
|
190
|
-
if (acitveFilter) {
|
|
191
|
-
this.setActiveFilter(acitveFilter);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
resetActiveFilter() {
|
|
195
|
-
// Reset all previously activated filters
|
|
196
|
-
this.savedFilters.forEach((savedFilter) => {
|
|
197
|
-
savedFilter.active = false;
|
|
198
|
-
});
|
|
199
|
-
this.setActiveFilter(null);
|
|
200
|
-
}
|
|
201
|
-
_setEnabledStatus(value) {
|
|
202
|
-
this._enabled$.next(value);
|
|
203
|
-
}
|
|
204
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
205
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController });
|
|
206
|
-
}
|
|
207
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController, decorators: [{
|
|
208
|
-
type: Injectable
|
|
209
|
-
}] });
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtZmlsdGVycy1jb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3NlcnZpY2VzL3NhdmVkLWZpbHRlcnMtY29udHJvbGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLGdDQUFnQyxHQUNqQyxNQUFNLDBFQUEwRSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU94RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFJM0QsTUFBTSxPQUFPLHNCQUFzQjtJQUV6QixPQUFPLENBQTRCO0lBQ25DLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7SUFDL0QsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFxQixJQUFJLENBQUMsQ0FBQztJQUMvRCxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDaEQsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDaEMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sR0FB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T25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIEZzRmlsdGVyU2F2ZWRGaWx0ZXJFZGl0Q29tcG9uZW50LFxufSBmcm9tICcuLi9jb21wb25lbnRzL3NhdmVkLWZpbHRlci9zYXZlZC1maWx0ZXItZWRpdC9zYXZlZC1maWx0ZXItZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgcmVzdG9yZUl0ZW1zIH0gZnJvbSAnLi4vaGVscGVycy9yZXN0b3JlLWl0ZW1zJztcbmltcG9ydCB7IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0ZXJuYWwtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBJRmlsdGVyU2F2ZWRGaWx0ZXIsXG4gIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvc2F2ZWQtZmlsdGVycy5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBGc0ZpbHRlckl0ZW1zU3RvcmUgfSBmcm9tICcuL2l0ZW1zLXN0b3JlLnNlcnZpY2UnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTYXZlZEZpbHRlcnNDb250cm9sbGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9jb25maWc6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc7XG4gIHByaXZhdGUgX3NhdmVkRmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcltdPihbXSk7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcj4obnVsbCk7XG4gIHByaXZhdGUgX2VuYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfaXRlbXNTdG9yZSA9IGluamVjdChGc0ZpbHRlckl0ZW1zU3RvcmUpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuXG4gIHB1YmxpYyBnZXQgc2luZ3VsYXJMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmxhYmVsPy5zaW5ndWxhciB8fCAnU2F2ZWQgZmlsdGVyJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2luZ3VsYXJMYWJlbExvd2VyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ3VsYXJMYWJlbC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBsYWJlbEljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5sYWJlbD8uaWNvbiB8fCAnc2F2ZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBsdXJhbExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8ubGFiZWw/LnBsdXJhbCB8fCAnU2F2ZWQgZmlsdGVycyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBsdXJhbExhYmVsTG93ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wbHVyYWxMYWJlbC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2F2ZWRGaWx0ZXJzKCk6IElGaWx0ZXJTYXZlZEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fc2F2ZWRGaWx0ZXJzJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldCBzYXZlZEZpbHRlcnMoZmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW10pIHtcbiAgICB0aGlzLl9zYXZlZEZpbHRlcnMkLm5leHQoZmlsdGVycyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhdmVkRmlsdGVycyQoKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnMkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlcigpOiBJRmlsdGVyU2F2ZWRGaWx0ZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXIkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlciQoKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVGaWx0ZXJEYXRhKCk6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlciQuZ2V0VmFsdWUoKT8uZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdChcbiAgICBmaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG4gICk6IHZvaWQge1xuICAgIGlmICghZmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnKSB7XG4gICAgICB0aGlzLl9zZXRFbmFibGVkU3RhdHVzKGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRFbmFibGVkU3RhdHVzKHRydWUpO1xuXG4gICAgdGhpcy5fY29uZmlnID0gZmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIGluaXRTYXZlZEZpbHRlcnMoZmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IGZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgbG9hZCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5sb2FkKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0U2F2ZWRGaWx0ZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZSgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6IGBDcmVhdGUgJHt0aGlzLnNpbmd1bGFyTGFiZWx9YCxcbiAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIGNvbW1pdExhYmVsOiAnQ3JlYXRlJyxcbiAgICAgIGRpYWxvZ0NvbmZpZzoge1xuICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGE6IElGaWx0ZXJTYXZlZEZpbHRlciA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLl9pdGVtc1N0b3JlLnF1ZXJ5UGFyYW1zKCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnNhdmUoZGF0YSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHNhdmVkRmlsdGVyKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXIpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZShzYXZlZEZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXI+IHtcbiAgICBjb25zdCBleGlzdHMgPSAhIXNhdmVkRmlsdGVyLmlkO1xuXG4gICAgc2F2ZWRGaWx0ZXIgPSB7XG4gICAgICAuLi50aGlzLmFjdGl2ZUZpbHRlcixcbiAgICAgIC4uLnNhdmVkRmlsdGVyLFxuICAgICAgZmlsdGVyczogdGhpcy5faXRlbXNTdG9yZS5tb2RlbHMoKSxcbiAgICB9OyAgXG5cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnNhdmUoc2F2ZWRGaWx0ZXIpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChfc2F2ZWRGaWx0ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmVkRmlsdGVycyA9IGV4aXN0cyA/IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAgICAgICAubWFwKChmKSA9PiBmLmlkID09PSBzYXZlZEZpbHRlci5pZCA/IF9zYXZlZEZpbHRlciA6IGYpIDogW1xuICAgICAgICAgICAgLi4udGhpcy5zYXZlZEZpbHRlcnMsXG4gICAgICAgICAgICBfc2F2ZWRGaWx0ZXIsXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZUZpbHRlcihfc2F2ZWRGaWx0ZXIpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9yZGVyYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9jb25maWcub3JkZXI7XG4gIH1cblxuICBwdWJsaWMgb3JkZXIoc2F2ZWRGaWx0ZXJzOiBJRmlsdGVyU2F2ZWRGaWx0ZXJbXSk6IE9ic2VydmFibGU8SUZpbHRlclNhdmVkRmlsdGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLm9yZGVyKHNhdmVkRmlsdGVycylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2ZWRGaWx0ZXJzID0gW1xuICAgICAgICAgICAgLi4uc2F2ZWRGaWx0ZXJzLFxuICAgICAgICAgIF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IE9ic2VydmFibGU8SUZpbHRlclNhdmVkRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5kZWxldGUoc2F2ZWRGaWx0ZXIpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmVkRmlsdGVycyA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiBmLmlkICE9PSBzYXZlZEZpbHRlci5pZCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IHZvaWQge1xuICAgIGlmIChzYXZlZEZpbHRlcikge1xuICAgICAgY29uc3QgZXhpc3RpbmdGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAuZmluZCgoZikgPT4gZi5pZCA9PT0gc2F2ZWRGaWx0ZXIuaWQpO1xuXG4gICAgICBpZiAoIWV4aXN0aW5nRmlsdGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2F2ZWQgZmlsdGVyIGNhbm5vdCBiZSBhY3RpdmF0ZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3RzLiBGaWx0ZXIgSUQgPSAke3NhdmVkRmlsdGVyLmlkfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIkLm5leHQoZXhpc3RpbmdGaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5TYXZlZEZpbHRlckVkaXREaWFsb2coKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5faXRlbXNTdG9yZS5xdWVyeVBhcmFtcygpO1xuXG4gICAgY29uc3QgZGlhbG9nQ29uZmlnID0ge1xuICAgICAgZGF0YToge1xuICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgc2F2ZWRGaWx0ZXJzOiB0aGlzLnNhdmVkRmlsdGVycyxcbiAgICAgICAgc2F2ZUNhbGxiYWNrOiB0aGlzLnNhdmUuYmluZCh0aGlzKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMuX2RpYWxvZ1xuICAgICAgLm9wZW4oRnNGaWx0ZXJTYXZlZEZpbHRlckVkaXRDb21wb25lbnQsIGRpYWxvZ0NvbmZpZylcbiAgICAgIC5iZWZvcmVDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyOiBJRmlsdGVyU2F2ZWRGaWx0ZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICh1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgICAgLy8gZ2V0IGFscmVhZHkgc2F2ZWQgcmVsYXRlZCBmaWx0ZXIgb2JqZWN0XG4gICAgICAgICAgY29uc3Qgc2F2ZWRGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAgICAgLmZpbmQoKGYpID0+IGYuaWQgPT09IHVwZGF0ZWRGaWx0ZXIuaWQpO1xuXG4gICAgICAgICAgLy8gcmVzdG9yZSB2YWx1ZXMgZnJvbSBxdWVyeSBzdHJpbmdcbiAgICAgICAgICB1cGRhdGVkRmlsdGVyLmZpbHRlcnMgPSByZXN0b3JlSXRlbXMoXG4gICAgICAgICAgICB1cGRhdGVkRmlsdGVyLmZpbHRlcnMsXG4gICAgICAgICAgICB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zLFxuICAgICAgICAgICk7XG5cblxuICAgICAgICAgIGlmIChzYXZlZEZpbHRlcikge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzYXZlZEZpbHRlciwgdXBkYXRlZEZpbHRlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZWRGaWx0ZXJzID0gW1xuICAgICAgICAgICAgICAuLi50aGlzLnNhdmVkRmlsdGVycyxcbiAgICAgICAgICAgICAgdXBkYXRlZEZpbHRlcixcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQWN0aXZlRmlsdGVyKCk6IHZvaWQge1xuICAgIC8vIExvb2t1cCBhY3RpdmUgZmlsdGVyXG4gICAgY29uc3QgYWNpdHZlRmlsdGVyID0gdGhpcy5zYXZlZEZpbHRlcnNcbiAgICAgIC5maW5kKChmKSA9PiBmLmFjdGl2ZSk7XG5cbiAgICBpZiAoYWNpdHZlRmlsdGVyKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZUZpbHRlcihhY2l0dmVGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldEFjdGl2ZUZpbHRlcigpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBhbGwgcHJldmlvdXNseSBhY3RpdmF0ZWQgZmlsdGVyc1xuICAgIHRoaXMuc2F2ZWRGaWx0ZXJzLmZvckVhY2goKHNhdmVkRmlsdGVyKSA9PiB7XG4gICAgICBzYXZlZEZpbHRlci5hY3RpdmUgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0QWN0aXZlRmlsdGVyKG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RW5hYmxlZFN0YXR1cyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2VuYWJsZWQkLm5leHQodmFsdWUpO1xuICB9XG59XG4iXX0=
|