@updevs/components 1.0.0-alpha.96 → 1.0.0-alpha.97
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/esm2022/table/components/filter-row/filter-row.component.mjs +12 -19
- package/esm2022/table/components/search-section/search-section.component.mjs +16 -28
- package/esm2022/table/services/current-search-request.service.mjs +254 -0
- package/esm2022/table/table.component.mjs +25 -34
- package/esm2022/table/tools/filters.tools.mjs +3 -3
- package/fesm2022/updevs-components-table.mjs +297 -77
- package/fesm2022/updevs-components-table.mjs.map +1 -1
- package/package.json +19 -19
- package/table/components/filter-row/filter-row.component.d.ts +2 -2
- package/table/components/search-section/search-section.component.d.ts +4 -8
- package/table/services/current-search-request.service.d.ts +164 -0
- package/table/table.component.d.ts +4 -9
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { Injectable, signal, computed } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Service to manage the current search request state across table components.
|
|
6
|
+
* Uses Angular signals for reactive state management, eliminating the need for prop drilling.
|
|
7
|
+
* Should be provided at the table component level so each table instance has its own state.
|
|
8
|
+
*/
|
|
9
|
+
export class CurrentSearchRequestService {
|
|
10
|
+
constructor() {
|
|
11
|
+
this._searchRequest = signal({});
|
|
12
|
+
this._isSearching = signal(false);
|
|
13
|
+
this._hasChanges = signal(false);
|
|
14
|
+
/**
|
|
15
|
+
* Read-only signal for the current search request
|
|
16
|
+
*/
|
|
17
|
+
this.searchRequest = this._searchRequest.asReadonly();
|
|
18
|
+
/**
|
|
19
|
+
* Read-only signal for the searching state
|
|
20
|
+
*/
|
|
21
|
+
this.isSearching = this._isSearching.asReadonly();
|
|
22
|
+
/**
|
|
23
|
+
* Read-only signal indicating if the search request has changed from default
|
|
24
|
+
*/
|
|
25
|
+
this.hasChanges = this._hasChanges.asReadonly();
|
|
26
|
+
/**
|
|
27
|
+
* Subject to trigger search operations
|
|
28
|
+
*/
|
|
29
|
+
this.searchRequestSubject = new Subject();
|
|
30
|
+
/**
|
|
31
|
+
* Count of active filters (non-hidden)
|
|
32
|
+
*/
|
|
33
|
+
this.activeFilterCount = computed(() => this.searchRequest().filters?.filter(f => !f.isHidden).length || 0);
|
|
34
|
+
/**
|
|
35
|
+
* Whether there are any active filters
|
|
36
|
+
*/
|
|
37
|
+
this.hasFilters = computed(() => (this.searchRequest().filters?.length || 0) > 0);
|
|
38
|
+
/**
|
|
39
|
+
* Count of visible (non-hidden) filters
|
|
40
|
+
*/
|
|
41
|
+
this.visibleFilterCount = computed(() => this.searchRequest().filters?.filter(f => !f.isHidden).length || 0);
|
|
42
|
+
/**
|
|
43
|
+
* Whether there's a search description/text query
|
|
44
|
+
*/
|
|
45
|
+
this.hasDescription = computed(() => !!this.searchRequest().description && this.searchRequest().description.length > 0);
|
|
46
|
+
/**
|
|
47
|
+
* Whether there are any sortings applied
|
|
48
|
+
*/
|
|
49
|
+
this.hasSorting = computed(() => (this.searchRequest().sortings?.length || 0) > 0);
|
|
50
|
+
/**
|
|
51
|
+
* The current sorting (first one if multiple exist)
|
|
52
|
+
*/
|
|
53
|
+
this.currentSorting = computed(() => this.hasSorting() ? this.searchRequest().sortings[0] : undefined);
|
|
54
|
+
/**
|
|
55
|
+
* Whether any search criteria is active (filters, description, or sorting)
|
|
56
|
+
*/
|
|
57
|
+
this.hasAnySearchCriteria = computed(() => this.hasFilters() || this.hasDescription() || this.hasSorting());
|
|
58
|
+
/**
|
|
59
|
+
* Current page number (1-indexed for display)
|
|
60
|
+
*/
|
|
61
|
+
this.currentPageNumber = computed(() => (this.searchRequest().pageIndex || 0) + 1);
|
|
62
|
+
/**
|
|
63
|
+
* Whether pagination is configured
|
|
64
|
+
*/
|
|
65
|
+
this.hasPagination = computed(() => !!this.searchRequest().pageSize && this.searchRequest().pageSize > 0);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Updates the entire search request
|
|
69
|
+
* @param request The new search request
|
|
70
|
+
*/
|
|
71
|
+
updateSearchRequest(request) {
|
|
72
|
+
const previousRequest = this._searchRequest();
|
|
73
|
+
this._searchRequest.set(request);
|
|
74
|
+
// Only mark as changed if the new request is actually different from previous
|
|
75
|
+
if (!this.areSearchRequestsEqual(previousRequest, request)) {
|
|
76
|
+
this._hasChanges.set(true);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Partially updates the search request
|
|
81
|
+
* @param partial Partial search request properties to update
|
|
82
|
+
*/
|
|
83
|
+
patchSearchRequest(partial) {
|
|
84
|
+
const previousRequest = this._searchRequest();
|
|
85
|
+
const newRequest = { ...previousRequest, ...partial };
|
|
86
|
+
this._searchRequest.set(newRequest);
|
|
87
|
+
// Only mark as changed if the patch actually changed something
|
|
88
|
+
if (!this.areSearchRequestsEqual(previousRequest, newRequest)) {
|
|
89
|
+
this._hasChanges.set(true);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Sets the searching state
|
|
94
|
+
* @param isSearching Whether a search is in progress
|
|
95
|
+
*/
|
|
96
|
+
setSearching(isSearching) {
|
|
97
|
+
this._isSearching.set(isSearching);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resets the search request to default state
|
|
101
|
+
*/
|
|
102
|
+
reset() {
|
|
103
|
+
this._searchRequest.set({});
|
|
104
|
+
this._isSearching.set(false);
|
|
105
|
+
this._hasChanges.set(false);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Triggers a search operation by emitting on the searchRequestSubject
|
|
109
|
+
*/
|
|
110
|
+
triggerSearch() {
|
|
111
|
+
this.searchRequestSubject.next(this._searchRequest());
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Manually sets the hasChanges flag
|
|
115
|
+
* Useful for changes that aren't part of the search request but should enable Save View
|
|
116
|
+
* (e.g., column visibility changes)
|
|
117
|
+
* @param hasChanges Whether there are changes
|
|
118
|
+
*/
|
|
119
|
+
setHasChanges(hasChanges) {
|
|
120
|
+
this._hasChanges.set(hasChanges);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Adds a filter to the search request
|
|
124
|
+
* @param filter The filter to add
|
|
125
|
+
*/
|
|
126
|
+
addFilter(filter) {
|
|
127
|
+
const currentFilters = this.searchRequest().filters || [];
|
|
128
|
+
this.patchSearchRequest({ filters: [...currentFilters, filter] });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Removes a filter by name
|
|
132
|
+
* @param filterName The name of the filter column to remove
|
|
133
|
+
*/
|
|
134
|
+
removeFilter(filterName) {
|
|
135
|
+
const currentFilters = this.searchRequest().filters || [];
|
|
136
|
+
this.patchSearchRequest({ filters: currentFilters.filter(f => f.column !== filterName) });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Removes a filter by index
|
|
140
|
+
* @param index The index of the filter to remove
|
|
141
|
+
*/
|
|
142
|
+
removeFilterByIndex(index) {
|
|
143
|
+
const currentFilters = this.searchRequest().filters || [];
|
|
144
|
+
this.patchSearchRequest({ filters: currentFilters.filter((_, i) => i !== index) });
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Updates a specific filter by column name
|
|
148
|
+
* @param columnName The column name of the filter to update
|
|
149
|
+
* @param newData Partial filter properties to update
|
|
150
|
+
*/
|
|
151
|
+
updateFilter(columnName, newData) {
|
|
152
|
+
const currentFilters = this.searchRequest().filters || [];
|
|
153
|
+
this.patchSearchRequest({ filters: currentFilters.map(f => f.column === columnName ? { ...f, ...newData } : f) });
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Updates a filter by its index position
|
|
157
|
+
* @param index The index of the filter to update
|
|
158
|
+
* @param newData Partial filter properties to update
|
|
159
|
+
*/
|
|
160
|
+
updateFilterByIndex(index, newData) {
|
|
161
|
+
const currentFilters = this.searchRequest().filters || [];
|
|
162
|
+
if (index >= 0 && index < currentFilters.length) {
|
|
163
|
+
this.patchSearchRequest({ filters: currentFilters.map((f, i) => i === index ? { ...f, ...newData } : f) });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clears all filters
|
|
168
|
+
*/
|
|
169
|
+
clearFilters() {
|
|
170
|
+
this.patchSearchRequest({ filters: [] });
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Sets the sorting (replaces existing sortings)
|
|
174
|
+
* @param column The column name to sort by
|
|
175
|
+
* @param direction The sort direction
|
|
176
|
+
*/
|
|
177
|
+
setSorting(column, direction) {
|
|
178
|
+
this.patchSearchRequest({ sortings: [{ column, direction }] });
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clears all sorting
|
|
182
|
+
*/
|
|
183
|
+
clearSorting() {
|
|
184
|
+
this.patchSearchRequest({ sortings: [] });
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Sets the search description/text query
|
|
188
|
+
* @param description The search text
|
|
189
|
+
*/
|
|
190
|
+
setDescription(description) {
|
|
191
|
+
this.patchSearchRequest({ description });
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Clears the search description
|
|
195
|
+
*/
|
|
196
|
+
clearDescription() {
|
|
197
|
+
this.patchSearchRequest({ description: '' });
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Clears ALL search criteria (filters, description, sorting)
|
|
201
|
+
* Note: Does not reset pagination - use reset() for that
|
|
202
|
+
*/
|
|
203
|
+
clearAll() {
|
|
204
|
+
this.patchSearchRequest({ filters: [], description: '', sortings: [] });
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clears all search criteria except pagination
|
|
208
|
+
* Useful when you want to reset search but maintain current page
|
|
209
|
+
*/
|
|
210
|
+
clearAllExceptPagination() {
|
|
211
|
+
this.clearAll();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Deep comparison of two search requests
|
|
215
|
+
* @param a First search request
|
|
216
|
+
* @param b Second search request
|
|
217
|
+
* @returns true if they are equal, false otherwise
|
|
218
|
+
*/
|
|
219
|
+
areSearchRequestsEqual(a, b) {
|
|
220
|
+
if ((a.description || '') !== (b.description || '')) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
const aFilters = a.filters || [];
|
|
224
|
+
const bFilters = b.filters || [];
|
|
225
|
+
if (aFilters.length !== bFilters.length) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
for (let i = 0; i < aFilters.length; i++) {
|
|
229
|
+
if (JSON.stringify(aFilters[i]) !== JSON.stringify(bFilters[i])) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const aSortings = a.sortings || [];
|
|
234
|
+
const bSortings = b.sortings || [];
|
|
235
|
+
if (aSortings.length !== bSortings.length) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
for (let i = 0; i < aSortings.length; i++) {
|
|
239
|
+
if (JSON.stringify(aSortings[i]) !== JSON.stringify(bSortings[i])) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (a.pageSize !== b.pageSize || a.pageIndex !== b.pageIndex) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CurrentSearchRequestService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
249
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CurrentSearchRequestService }); }
|
|
250
|
+
}
|
|
251
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CurrentSearchRequestService, decorators: [{
|
|
252
|
+
type: Injectable
|
|
253
|
+
}] });
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVudC1zZWFyY2gtcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RhYmxlL3NyYy9zZXJ2aWNlcy9jdXJyZW50LXNlYXJjaC1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRS9COzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sMkJBQTJCO0lBRHhDO1FBRXFCLG1CQUFjLEdBQUcsTUFBTSxDQUFxQixFQUFFLENBQUMsQ0FBQztRQUNoRCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3Qzs7V0FFRztRQUNNLGtCQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUxRDs7V0FFRztRQUNNLGdCQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV0RDs7V0FFRztRQUNNLGVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXBEOztXQUVHO1FBQ00seUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQXNCLENBQUM7UUFFbEU7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFaEg7O1dBRUc7UUFDTSxlQUFV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S0FBSyxDQUFDO1lBQ2pCLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7OEdBdlJRLDJCQUEyQjtrSEFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUZpbHRlciwgU2VhcmNoUmVxdWVzdE1vZGVsIH0gZnJvbSAnQHVwZGV2cy9zZGsvc3RvcmVzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG1hbmFnZSB0aGUgY3VycmVudCBzZWFyY2ggcmVxdWVzdCBzdGF0ZSBhY3Jvc3MgdGFibGUgY29tcG9uZW50cy5cbiAqIFVzZXMgQW5ndWxhciBzaWduYWxzIGZvciByZWFjdGl2ZSBzdGF0ZSBtYW5hZ2VtZW50LCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgcHJvcCBkcmlsbGluZy5cbiAqIFNob3VsZCBiZSBwcm92aWRlZCBhdCB0aGUgdGFibGUgY29tcG9uZW50IGxldmVsIHNvIGVhY2ggdGFibGUgaW5zdGFuY2UgaGFzIGl0cyBvd24gc3RhdGUuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDdXJyZW50U2VhcmNoUmVxdWVzdFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaFJlcXVlc3QgPSBzaWduYWw8U2VhcmNoUmVxdWVzdE1vZGVsPih7fSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNTZWFyY2hpbmcgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hhc0NoYW5nZXMgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogUmVhZC1vbmx5IHNpZ25hbCBmb3IgdGhlIGN1cnJlbnQgc2VhcmNoIHJlcXVlc3RcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2hSZXF1ZXN0ID0gdGhpcy5fc2VhcmNoUmVxdWVzdC5hc1JlYWRvbmx5KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkLW9ubHkgc2lnbmFsIGZvciB0aGUgc2VhcmNoaW5nIHN0YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaXNTZWFyY2hpbmcgPSB0aGlzLl9pc1NlYXJjaGluZy5hc1JlYWRvbmx5KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkLW9ubHkgc2lnbmFsIGluZGljYXRpbmcgaWYgdGhlIHNlYXJjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkIGZyb20gZGVmYXVsdFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhhc0NoYW5nZXMgPSB0aGlzLl9oYXNDaGFuZ2VzLmFzUmVhZG9ubHkoKTtcblxuICAgIC8qKlxuICAgICAqIFN1YmplY3QgdG8gdHJpZ2dlciBzZWFyY2ggb3BlcmF0aW9uc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlYXJjaFJlcXVlc3RTdWJqZWN0ID0gbmV3IFN1YmplY3Q8U2VhcmNoUmVxdWVzdE1vZGVsPigpO1xuXG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgYWN0aXZlIGZpbHRlcnMgKG5vbi1oaWRkZW4pXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWN0aXZlRmlsdGVyQ291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzPy5maWx0ZXIoZiA9PiAhZi5pc0hpZGRlbikubGVuZ3RoIHx8IDApO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IGFjdGl2ZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzPy5sZW5ndGggfHwgMCkgPiAwKTtcblxuICAgIC8qKlxuICAgICAqIENvdW50IG9mIHZpc2libGUgKG5vbi1oaWRkZW4pIGZpbHRlcnNcbiAgICAgKi9cbiAgICByZWFkb25seSB2aXNpYmxlRmlsdGVyQ291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzPy5maWx0ZXIoZiA9PiAhZi5pc0hpZGRlbikubGVuZ3RoIHx8IDApO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSdzIGEgc2VhcmNoIGRlc2NyaXB0aW9uL3RleHQgcXVlcnlcbiAgICAgKi9cbiAgICByZWFkb25seSBoYXNEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5zZWFyY2hSZXF1ZXN0KCkuZGVzY3JpcHRpb24gJiYgdGhpcy5zZWFyY2hSZXF1ZXN0KCkuZGVzY3JpcHRpb24hLmxlbmd0aCA+IDApO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IHNvcnRpbmdzIGFwcGxpZWRcbiAgICAgKi9cbiAgICByZWFkb25seSBoYXNTb3J0aW5nID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuc2VhcmNoUmVxdWVzdCgpLnNvcnRpbmdzPy5sZW5ndGggfHwgMCkgPiAwKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNvcnRpbmcgKGZpcnN0IG9uZSBpZiBtdWx0aXBsZSBleGlzdClcbiAgICAgKi9cbiAgICByZWFkb25seSBjdXJyZW50U29ydGluZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGFzU29ydGluZygpID8gdGhpcy5zZWFyY2hSZXF1ZXN0KCkuc29ydGluZ3MhWzBdIDogdW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYW55IHNlYXJjaCBjcml0ZXJpYSBpcyBhY3RpdmUgKGZpbHRlcnMsIGRlc2NyaXB0aW9uLCBvciBzb3J0aW5nKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhhc0FueVNlYXJjaENyaXRlcmlhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oYXNGaWx0ZXJzKCkgfHwgdGhpcy5oYXNEZXNjcmlwdGlvbigpIHx8IHRoaXMuaGFzU29ydGluZygpKTtcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGFnZSBudW1iZXIgKDEtaW5kZXhlZCBmb3IgZGlzcGxheSlcbiAgICAgKi9cbiAgICByZWFkb25seSBjdXJyZW50UGFnZU51bWJlciA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNlYXJjaFJlcXVlc3QoKS5wYWdlSW5kZXggfHwgMCkgKyAxKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgcGFnaW5hdGlvbiBpcyBjb25maWd1cmVkXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGFzUGFnaW5hdGlvbiA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5zZWFyY2hSZXF1ZXN0KCkucGFnZVNpemUgJiYgdGhpcy5zZWFyY2hSZXF1ZXN0KCkucGFnZVNpemUhID4gMCk7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBlbnRpcmUgc2VhcmNoIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgbmV3IHNlYXJjaCByZXF1ZXN0XG4gICAgICovXG4gICAgdXBkYXRlU2VhcmNoUmVxdWVzdChyZXF1ZXN0OiBTZWFyY2hSZXF1ZXN0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNSZXF1ZXN0ID0gdGhpcy5fc2VhcmNoUmVxdWVzdCgpO1xuICAgICAgICB0aGlzLl9zZWFyY2hSZXF1ZXN0LnNldChyZXF1ZXN0KTtcblxuICAgICAgICAvLyBPbmx5IG1hcmsgYXMgY2hhbmdlZCBpZiB0aGUgbmV3IHJlcXVlc3QgaXMgYWN0dWFsbHkgZGlmZmVyZW50IGZyb20gcHJldmlvdXNcbiAgICAgICAgaWYgKCF0aGlzLmFyZVNlYXJjaFJlcXVlc3RzRXF1YWwocHJldmlvdXNSZXF1ZXN0LCByZXF1ZXN0KSkge1xuICAgICAgICAgICAgdGhpcy5faGFzQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJ0aWFsbHkgdXBkYXRlcyB0aGUgc2VhcmNoIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcGFydGlhbCBQYXJ0aWFsIHNlYXJjaCByZXF1ZXN0IHByb3BlcnRpZXMgdG8gdXBkYXRlXG4gICAgICovXG4gICAgcGF0Y2hTZWFyY2hSZXF1ZXN0KHBhcnRpYWw6IFBhcnRpYWw8U2VhcmNoUmVxdWVzdE1vZGVsPik6IHZvaWQge1xuICAgICAgICBjb25zdCBwcmV2aW91c1JlcXVlc3QgPSB0aGlzLl9zZWFyY2hSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IG5ld1JlcXVlc3QgPSB7IC4uLnByZXZpb3VzUmVxdWVzdCwgLi4ucGFydGlhbCB9O1xuICAgICAgICB0aGlzLl9zZWFyY2hSZXF1ZXN0LnNldChuZXdSZXF1ZXN0KTtcblxuICAgICAgICAvLyBPbmx5IG1hcmsgYXMgY2hhbmdlZCBpZiB0aGUgcGF0Y2ggYWN0dWFsbHkgY2hhbmdlZCBzb21ldGhpbmdcbiAgICAgICAgaWYgKCF0aGlzLmFyZVNlYXJjaFJlcXVlc3RzRXF1YWwocHJldmlvdXNSZXF1ZXN0LCBuZXdSZXF1ZXN0KSkge1xuICAgICAgICAgICAgdGhpcy5faGFzQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWFyY2hpbmcgc3RhdGVcbiAgICAgKiBAcGFyYW0gaXNTZWFyY2hpbmcgV2hldGhlciBhIHNlYXJjaCBpcyBpbiBwcm9ncmVzc1xuICAgICAqL1xuICAgIHNldFNlYXJjaGluZyhpc1NlYXJjaGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc1NlYXJjaGluZy5zZXQoaXNTZWFyY2hpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc2VhcmNoIHJlcXVlc3QgdG8gZGVmYXVsdCBzdGF0ZVxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWFyY2hSZXF1ZXN0LnNldCh7fSk7XG4gICAgICAgIHRoaXMuX2lzU2VhcmNoaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX2hhc0NoYW5nZXMuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBhIHNlYXJjaCBvcGVyYXRpb24gYnkgZW1pdHRpbmcgb24gdGhlIHNlYXJjaFJlcXVlc3RTdWJqZWN0XG4gICAgICovXG4gICAgdHJpZ2dlclNlYXJjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0U3ViamVjdC5uZXh0KHRoaXMuX3NlYXJjaFJlcXVlc3QoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgc2V0cyB0aGUgaGFzQ2hhbmdlcyBmbGFnXG4gICAgICogVXNlZnVsIGZvciBjaGFuZ2VzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIHNlYXJjaCByZXF1ZXN0IGJ1dCBzaG91bGQgZW5hYmxlIFNhdmUgVmlld1xuICAgICAqIChlLmcuLCBjb2x1bW4gdmlzaWJpbGl0eSBjaGFuZ2VzKVxuICAgICAqIEBwYXJhbSBoYXNDaGFuZ2VzIFdoZXRoZXIgdGhlcmUgYXJlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBzZXRIYXNDaGFuZ2VzKGhhc0NoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFzQ2hhbmdlcy5zZXQoaGFzQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZpbHRlciB0byB0aGUgc2VhcmNoIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYWRkXG4gICAgICovXG4gICAgYWRkRmlsdGVyKGZpbHRlcjogQmFzZUZpbHRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogWy4uLmN1cnJlbnRGaWx0ZXJzLCBmaWx0ZXJdIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBmaWx0ZXIgYnkgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgY29sdW1uIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHJlbW92ZUZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbHRlcnMgPSB0aGlzLnNlYXJjaFJlcXVlc3QoKS5maWx0ZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGZpbHRlcnM6IGN1cnJlbnRGaWx0ZXJzLmZpbHRlcihmID0+IGYuY29sdW1uICE9PSBmaWx0ZXJOYW1lKSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgZmlsdGVyIGJ5IGluZGV4XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmlsdGVyIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHJlbW92ZUZpbHRlckJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogY3VycmVudEZpbHRlcnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHNwZWNpZmljIGZpbHRlciBieSBjb2x1bW4gbmFtZVxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lIFRoZSBjb2x1bW4gbmFtZSBvZiB0aGUgZmlsdGVyIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBuZXdEYXRhIFBhcnRpYWwgZmlsdGVyIHByb3BlcnRpZXMgdG8gdXBkYXRlXG4gICAgICovXG4gICAgdXBkYXRlRmlsdGVyKGNvbHVtbk5hbWU6IHN0cmluZywgbmV3RGF0YTogUGFydGlhbDxCYXNlRmlsdGVyPik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogY3VycmVudEZpbHRlcnMubWFwKGYgPT4gZi5jb2x1bW4gPT09IGNvbHVtbk5hbWUgPyB7IC4uLmYsIC4uLm5ld0RhdGEgfSBhcyBhbnkgOiBmKSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgZmlsdGVyIGJ5IGl0cyBpbmRleCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpbHRlciB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0gbmV3RGF0YSBQYXJ0aWFsIGZpbHRlciBwcm9wZXJ0aWVzIHRvIHVwZGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZUZpbHRlckJ5SW5kZXgoaW5kZXg6IG51bWJlciwgbmV3RGF0YTogUGFydGlhbDxCYXNlRmlsdGVyPik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuc2VhcmNoUmVxdWVzdCgpLmZpbHRlcnMgfHwgW107XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBjdXJyZW50RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgZmlsdGVyczogY3VycmVudEZpbHRlcnMubWFwKChmLCBpKSA9PiBpID09PSBpbmRleCA/IHsgLi4uZiwgLi4ubmV3RGF0YSB9IGFzIGFueSA6IGYpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBmaWx0ZXJzXG4gICAgICovXG4gICAgY2xlYXJGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGZpbHRlcnM6IFtdIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNvcnRpbmcgKHJlcGxhY2VzIGV4aXN0aW5nIHNvcnRpbmdzKVxuICAgICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBuYW1lIHRvIHNvcnQgYnlcbiAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBzb3J0IGRpcmVjdGlvblxuICAgICAqL1xuICAgIHNldFNvcnRpbmcoY29sdW1uOiBzdHJpbmcsIGRpcmVjdGlvbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMucGF0Y2hTZWFyY2hSZXF1ZXN0KHsgc29ydGluZ3M6IFt7IGNvbHVtbiwgZGlyZWN0aW9uIH1dIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgc29ydGluZ1xuICAgICAqL1xuICAgIGNsZWFyU29ydGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXRjaFNlYXJjaFJlcXVlc3QoeyBzb3J0aW5nczogW10gfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VhcmNoIGRlc2NyaXB0aW9uL3RleHQgcXVlcnlcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlYXJjaCB0ZXh0XG4gICAgICovXG4gICAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGRlc2NyaXB0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgc2VhcmNoIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgY2xlYXJEZXNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXRjaFNlYXJjaFJlcXVlc3QoeyBkZXNjcmlwdGlvbjogJycgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIEFMTCBzZWFyY2ggY3JpdGVyaWEgKGZpbHRlcnMsIGRlc2NyaXB0aW9uLCBzb3J0aW5nKVxuICAgICAqIE5vdGU6IERvZXMgbm90IHJlc2V0IHBhZ2luYXRpb24gLSB1c2UgcmVzZXQoKSBmb3IgdGhhdFxuICAgICAqL1xuICAgIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoU2VhcmNoUmVxdWVzdCh7IGZpbHRlcnM6IFtdLCBkZXNjcmlwdGlvbjogJycsIHNvcnRpbmdzOiBbXSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHNlYXJjaCBjcml0ZXJpYSBleGNlcHQgcGFnaW5hdGlvblxuICAgICAqIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHJlc2V0IHNlYXJjaCBidXQgbWFpbnRhaW4gY3VycmVudCBwYWdlXG4gICAgICovXG4gICAgY2xlYXJBbGxFeGNlcHRQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVlcCBjb21wYXJpc29uIG9mIHR3byBzZWFyY2ggcmVxdWVzdHNcbiAgICAgKiBAcGFyYW0gYSBGaXJzdCBzZWFyY2ggcmVxdWVzdFxuICAgICAqIEBwYXJhbSBiIFNlY29uZCBzZWFyY2ggcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhleSBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXJlU2VhcmNoUmVxdWVzdHNFcXVhbChhOiBTZWFyY2hSZXF1ZXN0TW9kZWwsIGI6IFNlYXJjaFJlcXVlc3RNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKGEuZGVzY3JpcHRpb24gfHwgJycpICE9PSAoYi5kZXNjcmlwdGlvbiB8fCAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFGaWx0ZXJzID0gYS5maWx0ZXJzIHx8IFtdO1xuICAgICAgICBjb25zdCBiRmlsdGVycyA9IGIuZmlsdGVycyB8fCBbXTtcblxuICAgICAgICBpZiAoYUZpbHRlcnMubGVuZ3RoICE9PSBiRmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhRmlsdGVyc1tpXSkgIT09IEpTT04uc3RyaW5naWZ5KGJGaWx0ZXJzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFTb3J0aW5ncyA9IGEuc29ydGluZ3MgfHwgW107XG4gICAgICAgIGNvbnN0IGJTb3J0aW5ncyA9IGIuc29ydGluZ3MgfHwgW107XG5cbiAgICAgICAgaWYgKGFTb3J0aW5ncy5sZW5ndGggIT09IGJTb3J0aW5ncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVNvcnRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYVNvcnRpbmdzW2ldKSAhPT0gSlNPTi5zdHJpbmdpZnkoYlNvcnRpbmdzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLnBhZ2VTaXplICE9PSBiLnBhZ2VTaXplIHx8IGEucGFnZUluZGV4ICE9PSBiLnBhZ2VJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIl19
|