@byuhbll/components 0.0.8
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/README.md +25 -0
- package/esm2022/byuhbll-components.mjs +5 -0
- package/esm2022/lib/animations/animations.mjs +22 -0
- package/esm2022/lib/directives/hbll-pill-btn/hbll-pill-btn.directive.mjs +121 -0
- package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +17 -0
- package/esm2022/lib/hbll-header/hbll-header.component.mjs +60 -0
- package/esm2022/lib/hbll-multi-select/hbll-multi-select.component.mjs +114 -0
- package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +270 -0
- package/esm2022/lib/ss-search-bar/constants.mjs +41 -0
- package/esm2022/lib/ss-search-bar/date-range/date-range.component.mjs +71 -0
- package/esm2022/lib/ss-search-bar/pipes/advanced-queries.pipe.mjs +27 -0
- package/esm2022/lib/ss-search-bar/simple-search/simple-search.component.mjs +85 -0
- package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +199 -0
- package/esm2022/lib/ss-search-bar/utils.mjs +16 -0
- package/esm2022/public-api.mjs +6 -0
- package/fesm2022/byuhbll-components.mjs +1001 -0
- package/fesm2022/byuhbll-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/animations/animations.d.ts +4 -0
- package/lib/directives/hbll-pill-btn/hbll-pill-btn.directive.d.ts +17 -0
- package/lib/hbll-checkbox/hbll-checkbox.component.d.ts +6 -0
- package/lib/hbll-header/hbll-header.component.d.ts +40 -0
- package/lib/hbll-multi-select/hbll-multi-select.component.d.ts +52 -0
- package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +122 -0
- package/lib/ss-search-bar/constants.d.ts +40 -0
- package/lib/ss-search-bar/date-range/date-range.component.d.ts +25 -0
- package/lib/ss-search-bar/pipes/advanced-queries.pipe.d.ts +8 -0
- package/lib/ss-search-bar/simple-search/simple-search.component.d.ts +28 -0
- package/lib/ss-search-bar/ss-search-bar.component.d.ts +121 -0
- package/lib/ss-search-bar/utils.d.ts +7 -0
- package/package.json +25 -0
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, inject, } from '@angular/core';
|
|
2
|
+
import { NonNullableFormBuilder, ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
3
|
+
import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
|
|
4
|
+
import { filter, startWith, tap } from 'rxjs/operators';
|
|
5
|
+
import { ADVANCED_SEARCH_OPTIONS, ADVANCED_SEARCH_QUERIES_LIMIT, } from '../ss-search-bar.component';
|
|
6
|
+
import { Subscription } from 'rxjs';
|
|
7
|
+
import { validateDateRangeFields } from '../utils';
|
|
8
|
+
import { CommonModule } from '@angular/common';
|
|
9
|
+
import { ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_QUALIFIER_MAP } from '../constants';
|
|
10
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
11
|
+
import { HbllMultiSelectComponent } from '../../hbll-multi-select/hbll-multi-select.component';
|
|
12
|
+
import { HbllCheckboxComponent } from '../../hbll-checkbox/hbll-checkbox.component';
|
|
13
|
+
import { HbllPillBtnDirective } from '../../directives/hbll-pill-btn/hbll-pill-btn.directive';
|
|
14
|
+
import { DateRangeComponent } from '../date-range/date-range.component';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@angular/forms";
|
|
17
|
+
import * as i2 from "@angular/material/tooltip";
|
|
18
|
+
const DATE_VALIDATOR_REGEX = '^[0-9]{4}$';
|
|
19
|
+
export class AdvancedSearchComponent {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.fb = inject(NonNullableFormBuilder);
|
|
22
|
+
this.advancedSearch = new EventEmitter();
|
|
23
|
+
this.subscription = new Subscription();
|
|
24
|
+
/**
|
|
25
|
+
* Takes a `FormGroup` and syncs up the `field` and `qualifier` values.
|
|
26
|
+
* After syncing, when the `field` value changes, the `qualifier` value will update appropriately.
|
|
27
|
+
*/
|
|
28
|
+
this.syncUpFieldAndQualifier = (fg, scope) => {
|
|
29
|
+
this.subscription.add(fg.controls.field.valueChanges
|
|
30
|
+
.pipe(filter(() => scope === 'local'), tap((val) => fg.controls.qualifier.setValue(ADVANCED_SEARCH_OPTIONS.qualifiers[val][0])))
|
|
31
|
+
.subscribe());
|
|
32
|
+
};
|
|
33
|
+
this.advancedSearchForm = this.fb.group({
|
|
34
|
+
queries: this.fb.array([], [Validators.maxLength(ADVANCED_SEARCH_QUERIES_LIMIT)]),
|
|
35
|
+
types: [[]],
|
|
36
|
+
collections: [[]],
|
|
37
|
+
languages: [[]],
|
|
38
|
+
datePublished: this.fb.group({
|
|
39
|
+
from: ['', [Validators.maxLength(4), Validators.pattern(DATE_VALIDATOR_REGEX)]],
|
|
40
|
+
to: ['', [Validators.maxLength(4), Validators.pattern(DATE_VALIDATOR_REGEX)]],
|
|
41
|
+
}, { validators: validateDateRangeFields() }),
|
|
42
|
+
limitResults: this.fb.group({
|
|
43
|
+
peerReviewed: [false],
|
|
44
|
+
}),
|
|
45
|
+
expandResults: this.fb.group({
|
|
46
|
+
applyRelatedWords: [false],
|
|
47
|
+
applyEquivalentSubjects: [false],
|
|
48
|
+
fullText: [false],
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
this.isSubmitted = false;
|
|
52
|
+
this.advancedSearchOptions = ADVANCED_SEARCH_OPTIONS;
|
|
53
|
+
this.advancedSearchFieldMap = ADVANCED_SEARCH_FIELD_MAP;
|
|
54
|
+
this.advancedSearchQualifierMap = ADVANCED_SEARCH_QUALIFIER_MAP;
|
|
55
|
+
/**
|
|
56
|
+
* Add a query to `queries` `FormArray`. This FormGroup has an additional `boolean` control.
|
|
57
|
+
*/
|
|
58
|
+
this.addQuery = () => {
|
|
59
|
+
this.queries.push(this.fb.group({
|
|
60
|
+
boolean: [ADVANCED_SEARCH_OPTIONS.boolean[0]],
|
|
61
|
+
field: [
|
|
62
|
+
this.config.scope === 'external'
|
|
63
|
+
? ADVANCED_SEARCH_OPTIONS.externalFields[0]
|
|
64
|
+
: ADVANCED_SEARCH_OPTIONS.localFields[0],
|
|
65
|
+
],
|
|
66
|
+
qualifier: [
|
|
67
|
+
ADVANCED_SEARCH_OPTIONS.qualifiers[ADVANCED_SEARCH_OPTIONS.localFields[0]][0],
|
|
68
|
+
],
|
|
69
|
+
query: ['', Validators.required],
|
|
70
|
+
}));
|
|
71
|
+
this.syncUpFieldAndQualifier(this.queries.at(-1), this.config.scope);
|
|
72
|
+
};
|
|
73
|
+
this.removeQuery = (i) => {
|
|
74
|
+
this.queries.removeAt(i);
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Prepares appropriate query params before performing a local advanced search.
|
|
78
|
+
*/
|
|
79
|
+
this.doLocalAdvancedSearch = () => {
|
|
80
|
+
this.doAdvancedSearch({
|
|
81
|
+
localAdvancedSearch: {
|
|
82
|
+
...this.config.localAdvancedSearch,
|
|
83
|
+
selectedResourceTypes: this.types.value,
|
|
84
|
+
selectedCollections: this.collections.value,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Prepares appropriate query params before performing an external advanced search.
|
|
90
|
+
*/
|
|
91
|
+
this.doExternalAdvancedSearch = () => {
|
|
92
|
+
// Compares 'from' and 'to' to ensure 'to' is greater than / equal to 'from', swaps them if not
|
|
93
|
+
const from = this.from.value
|
|
94
|
+
? parseInt(this.from.value) <= parseInt(this.to.value)
|
|
95
|
+
? this.from.value
|
|
96
|
+
: this.to.value
|
|
97
|
+
: '';
|
|
98
|
+
// Compares 'from' and 'to' to ensure 'to' is greater than / equal to 'from', swaps them if not
|
|
99
|
+
const to = this.to.value
|
|
100
|
+
? parseInt(this.to.value) >= parseInt(this.from.value)
|
|
101
|
+
? this.to.value
|
|
102
|
+
: this.from.value
|
|
103
|
+
: '';
|
|
104
|
+
this.doAdvancedSearch({
|
|
105
|
+
externalAdvancedSearch: {
|
|
106
|
+
...this.config.externalAdvancedSearch,
|
|
107
|
+
datePublished: { from, to },
|
|
108
|
+
selectedLanguages: this.languages.value,
|
|
109
|
+
limitResults: {
|
|
110
|
+
peerReviewed: this.peerReviewed.value,
|
|
111
|
+
},
|
|
112
|
+
expandResults: {
|
|
113
|
+
applyRelatedWords: this.applyRelatedWords.value,
|
|
114
|
+
applyEquivalentSubjects: this.applyEquivalentSubjects.value,
|
|
115
|
+
fullText: this.fullText.value,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Verifies that there is a query to use, gathers all other query parameters needed, then performs an advanced search via `router.navigate()`.
|
|
122
|
+
* @param {Record<string, string>} queryParams base set of query params to navigate with
|
|
123
|
+
*/
|
|
124
|
+
this.doAdvancedSearch = (updatedProps) => {
|
|
125
|
+
this.isSubmitted = true;
|
|
126
|
+
// Don't perform a search unless there is at least one query
|
|
127
|
+
if (this.queries.at(0).controls.query.invalid &&
|
|
128
|
+
!this.queries.value.some((v) => !!v.query)) {
|
|
129
|
+
this.showSearchValidationToolTip();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Don't perform a search unless the date form is valid
|
|
133
|
+
if (this.advancedSearchForm.controls.datePublished.invalid)
|
|
134
|
+
return;
|
|
135
|
+
this.advancedSearch.emit({
|
|
136
|
+
...this.config,
|
|
137
|
+
...updatedProps,
|
|
138
|
+
advancedSearchQueryRows: this.queries.value,
|
|
139
|
+
});
|
|
140
|
+
this.isSubmitted = false;
|
|
141
|
+
};
|
|
142
|
+
this.showSearchValidationToolTip = () => {
|
|
143
|
+
this.searchInput.nativeElement.focus();
|
|
144
|
+
this.inputTooltip.disabled = false;
|
|
145
|
+
this.inputTooltip.show();
|
|
146
|
+
};
|
|
147
|
+
this.setupForm = () => {
|
|
148
|
+
this.queries.clear();
|
|
149
|
+
// Always keep at least two queries available
|
|
150
|
+
this.addQuery();
|
|
151
|
+
this.addQuery();
|
|
152
|
+
// Ensure validation tooltip closes when uses enters a query
|
|
153
|
+
this.subscription.add(this.queries
|
|
154
|
+
.at(0)
|
|
155
|
+
.controls.query.valueChanges.pipe(startWith(''))
|
|
156
|
+
.pipe(filter(() => !!this.inputTooltip))
|
|
157
|
+
.subscribe(() => (this.inputTooltip.disabled = true)));
|
|
158
|
+
// If no `q{NUM}` use `q` for first query
|
|
159
|
+
if (!this.config.advancedSearchQueryRows.length)
|
|
160
|
+
this.queries.at(0).controls.query.setValue(this.config.q);
|
|
161
|
+
this.config.advancedSearchQueryRows.forEach((queryRow, i) => {
|
|
162
|
+
// Add a query form control for every q{num} key after the first.
|
|
163
|
+
let queryControl = null;
|
|
164
|
+
if (i === 0 || i === 1) {
|
|
165
|
+
queryControl = this.queries.at(i);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this.addQuery();
|
|
169
|
+
queryControl = this.queries.at(-1);
|
|
170
|
+
}
|
|
171
|
+
// Add the query value.
|
|
172
|
+
queryControl.controls.query.setValue(queryRow.query);
|
|
173
|
+
// Add the field value, if available.
|
|
174
|
+
if (queryRow.field)
|
|
175
|
+
queryControl.controls.field.setValue(queryRow.field);
|
|
176
|
+
else
|
|
177
|
+
queryControl.controls.field.setValue(this.config.scope === 'external'
|
|
178
|
+
? this.advancedSearchOptions.externalFields[0]
|
|
179
|
+
: this.advancedSearchOptions.localFields[0]);
|
|
180
|
+
// Add the qualifier value, if available and a local search.
|
|
181
|
+
if (this.config.scope === 'local' && queryRow.qualifier)
|
|
182
|
+
queryControl.controls.qualifier.setValue(queryRow.qualifier);
|
|
183
|
+
// Add the boolean, if available and not the first query.
|
|
184
|
+
if (i !== 0 && queryRow.boolean)
|
|
185
|
+
queryControl.controls.boolean.setValue(queryRow.boolean);
|
|
186
|
+
});
|
|
187
|
+
if (this.config.scope === 'local') {
|
|
188
|
+
this.types.setValue(this.config.localAdvancedSearch.selectedResourceTypes);
|
|
189
|
+
this.collections.setValue(this.config.localAdvancedSearch.selectedCollections);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.languages.setValue(this.config.externalAdvancedSearch
|
|
193
|
+
.selectedLanguages);
|
|
194
|
+
this.peerReviewed.setValue(this.config.externalAdvancedSearch.limitResults.peerReviewed);
|
|
195
|
+
this.applyRelatedWords.setValue(this.config.externalAdvancedSearch.expandResults.applyRelatedWords);
|
|
196
|
+
this.applyEquivalentSubjects.setValue(this.config.externalAdvancedSearch.expandResults.applyEquivalentSubjects);
|
|
197
|
+
this.fullText.setValue(this.config.externalAdvancedSearch.expandResults.fullText);
|
|
198
|
+
this.from.setValue(this.config.externalAdvancedSearch.datePublished.from);
|
|
199
|
+
this.to.setValue(this.config.externalAdvancedSearch.datePublished.to);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
set config(config) {
|
|
204
|
+
this._config = config;
|
|
205
|
+
this.setupForm();
|
|
206
|
+
}
|
|
207
|
+
get config() {
|
|
208
|
+
return this._config;
|
|
209
|
+
}
|
|
210
|
+
ngOnDestroy() {
|
|
211
|
+
this.subscription.unsubscribe();
|
|
212
|
+
}
|
|
213
|
+
get queries() {
|
|
214
|
+
return this.advancedSearchForm.controls.queries;
|
|
215
|
+
}
|
|
216
|
+
get types() {
|
|
217
|
+
return this.advancedSearchForm.controls.types;
|
|
218
|
+
}
|
|
219
|
+
get collections() {
|
|
220
|
+
return this.advancedSearchForm.controls.collections;
|
|
221
|
+
}
|
|
222
|
+
get languages() {
|
|
223
|
+
return this.advancedSearchForm.controls.languages;
|
|
224
|
+
}
|
|
225
|
+
get from() {
|
|
226
|
+
return this.advancedSearchForm.controls.datePublished.controls.from;
|
|
227
|
+
}
|
|
228
|
+
get to() {
|
|
229
|
+
return this.advancedSearchForm.controls.datePublished.controls.to;
|
|
230
|
+
}
|
|
231
|
+
get peerReviewed() {
|
|
232
|
+
return this.advancedSearchForm.controls.limitResults.controls.peerReviewed;
|
|
233
|
+
}
|
|
234
|
+
get fullText() {
|
|
235
|
+
return this.advancedSearchForm.controls.expandResults.controls.fullText;
|
|
236
|
+
}
|
|
237
|
+
get applyRelatedWords() {
|
|
238
|
+
return this.advancedSearchForm.controls.expandResults.controls.applyRelatedWords;
|
|
239
|
+
}
|
|
240
|
+
get applyEquivalentSubjects() {
|
|
241
|
+
return this.advancedSearchForm.controls.expandResults.controls.applyEquivalentSubjects;
|
|
242
|
+
}
|
|
243
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
244
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"hidden\">Field {{ queryIndex }}</label>\n <div class=\"select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"hidden\">Query {{ queryIndex }}</label>\n <div class=\"query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"config.localAdvancedSearch.availableResourceTypes\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"config.localAdvancedSearch.availableCollections\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply related words -->\n <label class=\"checkbox-label\" for=\"applyRelatedWords\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyRelatedWords\"\n type=\"checkbox\"\n [formControlName]=\"'applyRelatedWords'\"\n data-testid=\"applyRelatedWords\"\n />\n <lib-hbll-checkbox [isChecked]=\"applyRelatedWords.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Apply related words</span>\n </label>\n <!-- Apply equivalent subjects -->\n <label class=\"checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <div id=\"dateOptions\">\n <h4>Date Published</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n <!-- Language -->\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"config.externalAdvancedSearch.availableLanguages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n }\n </div>\n <div id=\"advSearchFooter\">\n <button libHbllPillBtn [color]=\"'blue'\" type=\"submit\" data-testid=\"advSearchSubmitButton\">\n Search\n </button>\n </div>\n</form>\n", styles: ["select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.select-wrapper{position:relative}.select-wrapper select{cursor:pointer;padding-right:2em}.select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}:host{box-sizing:border-box}:host *{box-sizing:inherit}.select-wrapper{margin-right:.3em}.row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.row-cancel:hover{color:#666}.row-cancel .icon{font-size:1em}.hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em}h4{margin-bottom:.3em;font-weight:600}.adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.query-input{display:inline-block;width:100%;margin-top:.4rem}.query-input input{width:100%}.other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.other-options label{margin-right:1rem}.checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.checkbox-label:not(:last-of-type){margin-bottom:.75em}.checkbox-label .label-text{margin-top:-.1em;margin-left:.45em}.checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:flex-end;font-size:1.2em}@media screen and (min-width: 615px){.adv-search-row{flex-wrap:nowrap}.other-options{grid-template-columns:repeat(2,1fr)}.query-input{margin-top:0}#dateOptions{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-hbll-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-hbll-checkbox", inputs: ["isChecked"] }, { kind: "directive", type: HbllPillBtnDirective, selector: "[libHbllPillBtn]", inputs: ["isDestructiveStyle", "isDisabled", "isFullWidth", "color"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
|
|
245
|
+
}
|
|
246
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
|
|
247
|
+
type: Component,
|
|
248
|
+
args: [{ selector: 'lib-ss-advanced-search', standalone: true, imports: [
|
|
249
|
+
CommonModule,
|
|
250
|
+
ReactiveFormsModule,
|
|
251
|
+
MatTooltipModule,
|
|
252
|
+
MatIconModule,
|
|
253
|
+
HbllMultiSelectComponent,
|
|
254
|
+
HbllCheckboxComponent,
|
|
255
|
+
HbllPillBtnDirective,
|
|
256
|
+
DateRangeComponent,
|
|
257
|
+
], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"hidden\">Field {{ queryIndex }}</label>\n <div class=\"select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"hidden\">Query {{ queryIndex }}</label>\n <div class=\"query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"config.localAdvancedSearch.availableResourceTypes\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"config.localAdvancedSearch.availableCollections\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply related words -->\n <label class=\"checkbox-label\" for=\"applyRelatedWords\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyRelatedWords\"\n type=\"checkbox\"\n [formControlName]=\"'applyRelatedWords'\"\n data-testid=\"applyRelatedWords\"\n />\n <lib-hbll-checkbox [isChecked]=\"applyRelatedWords.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Apply related words</span>\n </label>\n <!-- Apply equivalent subjects -->\n <label class=\"checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <div id=\"dateOptions\">\n <h4>Date Published</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n <!-- Language -->\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"config.externalAdvancedSearch.availableLanguages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n }\n </div>\n <div id=\"advSearchFooter\">\n <button libHbllPillBtn [color]=\"'blue'\" type=\"submit\" data-testid=\"advSearchSubmitButton\">\n Search\n </button>\n </div>\n</form>\n", styles: ["select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.select-wrapper{position:relative}.select-wrapper select{cursor:pointer;padding-right:2em}.select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}:host{box-sizing:border-box}:host *{box-sizing:inherit}.select-wrapper{margin-right:.3em}.row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.row-cancel:hover{color:#666}.row-cancel .icon{font-size:1em}.hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em}h4{margin-bottom:.3em;font-weight:600}.adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.query-input{display:inline-block;width:100%;margin-top:.4rem}.query-input input{width:100%}.other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.other-options label{margin-right:1rem}.checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.checkbox-label:not(:last-of-type){margin-bottom:.75em}.checkbox-label .label-text{margin-top:-.1em;margin-left:.45em}.checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:flex-end;font-size:1.2em}@media screen and (min-width: 615px){.adv-search-row{flex-wrap:nowrap}.other-options{grid-template-columns:repeat(2,1fr)}.query-input{margin-top:0}#dateOptions{grid-column:span 2}}\n"] }]
|
|
258
|
+
}], propDecorators: { config: [{
|
|
259
|
+
type: Input,
|
|
260
|
+
args: [{ required: true }]
|
|
261
|
+
}], advancedSearch: [{
|
|
262
|
+
type: Output
|
|
263
|
+
}], searchInput: [{
|
|
264
|
+
type: ViewChild,
|
|
265
|
+
args: ['searchInput']
|
|
266
|
+
}], inputTooltip: [{
|
|
267
|
+
type: ViewChild,
|
|
268
|
+
args: [MatTooltip]
|
|
269
|
+
}] } });
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFLSCx1QkFBdUIsRUFDdkIsNkJBQTZCLEdBSWhDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3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QWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBQ3JGLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUMzRixDQUFDOzhHQTdHUSx1QkFBdUI7a0dBQXZCLHVCQUF1QiwwU0FpQnJCLFVBQVUsZ0RDbkZ6Qix5MlVBME9BLHFoRURsTFEsWUFBWSw4QkFDWixtQkFBbUIsNDFEQUNuQixnQkFBZ0IsNFRBQ2hCLGFBQWEsK0JBQ2Isd0JBQXdCLG9KQUN4QixxQkFBcUIscUZBQ3JCLG9CQUFvQixtSUFDcEIsa0JBQWtCOzsyRkFHYix1QkFBdUI7a0JBaEJuQyxTQUFTOytCQUNJLHdCQUF3QixjQUN0QixJQUFJLFdBR1A7d0JBQ0wsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix3QkFBd0I7d0JBQ3hCLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixrQkFBa0I7cUJBQ3JCOzhCQUs4QixNQUFNO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFPZixjQUFjO3NCQUF2QixNQUFNO2dCQUcyQixXQUFXO3NCQUE1QyxTQUFTO3VCQUFDLGFBQWE7Z0JBSU8sWUFBWTtzQkFBMUMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgRm9ybUNvbnRyb2wsXG4gICAgRm9ybUdyb3VwLFxuICAgIE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwLCBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24sXG4gICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMsXG4gICAgQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQsXG4gICAgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXIsXG4gICAgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVlcnlSb3csXG59IGZyb20gJy4uL3NzLXNlYXJjaC1iYXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2VhcmNoQ29uZmlnIH0gZnJvbSAnLi4vc3Mtc2VhcmNoLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQURWQU5DRURfU0VBUkNIX0ZJRUxEX01BUCwgQURWQU5DRURfU0VBUkNIX1FVQUxJRklFUl9NQVAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGJsbC1tdWx0aS1zZWxlY3QvaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhibGxDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2hibGwtY2hlY2tib3gvaGJsbC1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGJsbFBpbGxCdG5EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2hibGwtcGlsbC1idG4vaGJsbC1waWxsLWJ0bi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudCc7XG5cbnR5cGUgUXVlcnlSb3cgPSB7XG4gICAgYm9vbGVhbjogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uPjtcbiAgICBmaWVsZDogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uPjtcbiAgICBxdWFsaWZpZXI6IEZvcm1Db250cm9sPEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uPjtcbiAgICBxdWVyeTogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbn07XG5cbmNvbnN0IERBVEVfVkFMSURBVE9SX1JFR0VYID0gJ15bMC05XXs0fSQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1zcy1hZHZhbmNlZC1zZWFyY2gnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIEhibGxNdWx0aVNlbGVjdENvbXBvbmVudCxcbiAgICAgICAgSGJsbENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBIYmxsUGlsbEJ0bkRpcmVjdGl2ZSxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgY29uZmlnKGNvbmZpZzogU2VhcmNoQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgQE91dHB1dCgpIGFkdmFuY2VkU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG5cbiAgICAvLyBUaG91Z2ggbXVsdGlwbGUgaW5zdGFuY2VzIGV4aXN0cywgdGhpcyByZXByZXNlbnQgcXVlcnkgMS5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIC8vIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAvLyBJdCBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQgaWYgYSB1c2VyIHNlYXJjaGVzIGFnYWluc3QgYW4gZW1wdHkgcXVlcnkgKHNpbXBsZSBvciBxMSkuXG4gICAgLy8gQW55IGNoYW5nZSB0byB0aGUgc2VhcmNoIGZpZWxkIGRpc2FibGVzIHRoZSB0b29sdGlwLlxuICAgIEBWaWV3Q2hpbGQoTWF0VG9vbHRpcCkgcHJpdmF0ZSBpbnB1dFRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGBGb3JtR3JvdXBgIGFuZCBzeW5jcyB1cCB0aGUgYGZpZWxkYCBhbmQgYHF1YWxpZmllcmAgdmFsdWVzLlxuICAgICAqIEFmdGVyIHN5bmNpbmcsIHdoZW4gdGhlIGBmaWVsZGAgdmFsdWUgY2hhbmdlcywgdGhlIGBxdWFsaWZpZXJgIHZhbHVlIHdpbGwgdXBkYXRlIGFwcHJvcHJpYXRlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jVXBGaWVsZEFuZFF1YWxpZmllciA9IChcbiAgICAgICAgZmc6IEZvcm1Hcm91cDx7XG4gICAgICAgICAgICBib29sZWFuOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIGZpZWxkOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWVyeTogRm9ybUNvbnRyb2w7XG4gICAgICAgIH0+LFxuICAgICAgICBzY29wZTogU2VhcmNoQ29uZmlnWydzY29wZSddLFxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICBmZy5jb250cm9scy5maWVsZC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHNjb3BlID09PSAnbG9jYWwnKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCh2YWw6IEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZmcuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbdmFsXVswXSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5PEZvcm1Hcm91cDxRdWVyeVJvdz4+KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQpXSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZXM6IFtbXSBhcyBzdHJpbmdbXV0sXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBsYW5ndWFnZXM6IFtbXSBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW11dLFxuICAgICAgICBkYXRlUHVibGlzaGVkOiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcygpIH0sXG4gICAgICAgICksXG4gICAgICAgIGxpbWl0UmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgICAgICBleHBhbmRSZXN1bHRzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGFwcGx5UmVsYXRlZFdvcmRzOiBbZmFsc2VdLFxuICAgICAgICAgICAgYXBwbHlFcXVpdmFsZW50U3ViamVjdHM6IFtmYWxzZV0sXG4gICAgICAgICAgICBmdWxsVGV4dDogW2ZhbHNlXSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hPcHRpb25zID0gQURWQU5DRURfU0VBUkNIX09QVElPTlM7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRmllbGRNYXAgPSBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaFF1YWxpZmllck1hcCA9IEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQO1xuXG4gICAgZ2V0IHF1ZXJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5xdWVyaWVzO1xuICAgIH1cbiAgICBnZXQgdHlwZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy50eXBlcztcbiAgICB9XG4gICAgZ2V0IGNvbGxlY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuY29sbGVjdGlvbnM7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5sYW5ndWFnZXM7XG4gICAgfVxuICAgIGdldCBmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZVB1Ymxpc2hlZC5jb250cm9scy5mcm9tO1xuICAgIH1cbiAgICBnZXQgdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlUHVibGlzaGVkLmNvbnRyb2xzLnRvO1xuICAgIH1cbiAgICBnZXQgcGVlclJldmlld2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMubGltaXRSZXN1bHRzLmNvbnRyb2xzLnBlZXJSZXZpZXdlZDtcbiAgICB9XG4gICAgZ2V0IGZ1bGxUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5mdWxsVGV4dDtcbiAgICB9XG4gICAgZ2V0IGFwcGx5UmVsYXRlZFdvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5hcHBseVJlbGF0ZWRXb3JkcztcbiAgICB9XG4gICAgZ2V0IGFwcGx5RXF1aXZhbGVudFN1YmplY3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBxdWVyeSB0byBgcXVlcmllc2AgYEZvcm1BcnJheWAuIFRoaXMgRm9ybUdyb3VwIGhhcyBhbiBhZGRpdGlvbmFsIGBib29sZWFuYCBjb250cm9sLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZGRRdWVyeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICBib29sZWFuOiBbQURWQU5DRURfU0VBUkNIX09QVElPTlMuYm9vbGVhblswXSBhcyBBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb25dLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmV4dGVybmFsRmllbGRzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5sb2NhbEZpZWxkc1swXSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHF1YWxpZmllcjogW1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5xdWFsaWZpZXJzW1xuICAgICAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMubG9jYWxGaWVsZHNbMF1cbiAgICAgICAgICAgICAgICAgICAgXVswXSBhcyBBZHZhbmNlZFNlYXJjaFF1YWxpZmllck9wdGlvbixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3luY1VwRmllbGRBbmRRdWFsaWZpZXIodGhpcy5xdWVyaWVzLmF0KC0xKSwgdGhpcy5jb25maWcuc2NvcGUpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlUXVlcnkgPSAoaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5yZW1vdmVBdChpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGEgbG9jYWwgYWR2YW5jZWQgc2VhcmNoLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkb0xvY2FsQWR2YW5jZWRTZWFyY2ggPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9BZHZhbmNlZFNlYXJjaCh7XG4gICAgICAgICAgICBsb2NhbEFkdmFuY2VkU2VhcmNoOiB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFJlc291cmNlVHlwZXM6IHRoaXMudHlwZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2xsZWN0aW9uczogdGhpcy5jb2xsZWN0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBhcHByb3ByaWF0ZSBxdWVyeSBwYXJhbXMgYmVmb3JlIHBlcmZvcm1pbmcgYW4gZXh0ZXJuYWwgYWR2YW5jZWQgc2VhcmNoLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkb0V4dGVybmFsQWR2YW5jZWRTZWFyY2ggPSAoKSA9PiB7XG4gICAgICAgIC8vIENvbXBhcmVzICdmcm9tJyBhbmQgJ3RvJyB0byBlbnN1cmUgJ3RvJyBpcyBncmVhdGVyIHRoYW4gLyBlcXVhbCB0byAnZnJvbScsIHN3YXBzIHRoZW0gaWYgbm90XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmZyb20udmFsdWVcbiAgICAgICAgICAgID8gcGFyc2VJbnQodGhpcy5mcm9tLnZhbHVlKSA8PSBwYXJzZUludCh0aGlzLnRvLnZhbHVlKVxuICAgICAgICAgICAgICAgID8gdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICAgICAgOiB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICAvLyBDb21wYXJlcyAnZnJvbScgYW5kICd0bycgdG8gZW5zdXJlICd0bycgaXMgZ3JlYXRlciB0aGFuIC8gZXF1YWwgdG8gJ2Zyb20nLCBzd2FwcyB0aGVtIGlmIG5vdFxuICAgICAgICBjb25zdCB0byA9IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgID8gcGFyc2VJbnQodGhpcy50by52YWx1ZSkgPj0gcGFyc2VJbnQodGhpcy5mcm9tLnZhbHVlKVxuICAgICAgICAgICAgICAgID8gdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICB0aGlzLmRvQWR2YW5jZWRTZWFyY2goe1xuICAgICAgICAgICAgZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaDoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2gsXG4gICAgICAgICAgICAgICAgZGF0ZVB1Ymxpc2hlZDogeyBmcm9tLCB0byB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTGFuZ3VhZ2VzOiB0aGlzLmxhbmd1YWdlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBsaW1pdFJlc3VsdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgcGVlclJldmlld2VkOiB0aGlzLnBlZXJSZXZpZXdlZC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGV4cGFuZFJlc3VsdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlSZWxhdGVkV29yZHM6IHRoaXMuYXBwbHlSZWxhdGVkV29yZHMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiB0aGlzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmdWxsVGV4dDogdGhpcy5mdWxsVGV4dC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlcmUgaXMgYSBxdWVyeSB0byB1c2UsIGdhdGhlcnMgYWxsIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMgbmVlZGVkLCB0aGVuIHBlcmZvcm1zIGFuIGFkdmFuY2VkIHNlYXJjaCB2aWEgYHJvdXRlci5uYXZpZ2F0ZSgpYC5cbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IHF1ZXJ5UGFyYW1zIGJhc2Ugc2V0IG9mIHF1ZXJ5IHBhcmFtcyB0byBuYXZpZ2F0ZSB3aXRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBkb0FkdmFuY2VkU2VhcmNoID0gKHVwZGF0ZWRQcm9wczogUGFydGlhbDxTZWFyY2hDb25maWc+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBEb24ndCBwZXJmb3JtIGEgc2VhcmNoIHVubGVzcyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcXVlcnlcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LmludmFsaWQgJiZcbiAgICAgICAgICAgICF0aGlzLnF1ZXJpZXMudmFsdWUuc29tZSgodikgPT4gISF2LnF1ZXJ5KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBhIHNlYXJjaCB1bmxlc3MgdGhlIGRhdGUgZm9ybSBpcyB2YWxpZFxuICAgICAgICBpZiAodGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZVB1Ymxpc2hlZC5pbnZhbGlkKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5hZHZhbmNlZFNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgLi4udXBkYXRlZFByb3BzLFxuICAgICAgICAgICAgYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3M6IHRoaXMucXVlcmllcy52YWx1ZSBhcyBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93W10sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuc2hvdygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldHVwRm9ybSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLmNsZWFyKCk7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIGF0IGxlYXN0IHR3byBxdWVyaWVzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG4gICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcblxuICAgICAgICAvLyBFbnN1cmUgdmFsaWRhdGlvbiB0b29sdGlwIGNsb3NlcyB3aGVuIHVzZXMgZW50ZXJzIGEgcXVlcnlcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzXG4gICAgICAgICAgICAgICAgLmF0KDApXG4gICAgICAgICAgICAgICAgLmNvbnRyb2xzLnF1ZXJ5LnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5pbnB1dFRvb2x0aXApKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gKHRoaXMuaW5wdXRUb29sdGlwLmRpc2FibGVkID0gdHJ1ZSkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIG5vIGBxe05VTX1gIHVzZSBgcWAgZm9yIGZpcnN0IHF1ZXJ5XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LnNldFZhbHVlKHRoaXMuY29uZmlnLnEpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLmFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzLmZvckVhY2goKHF1ZXJ5Um93LCBpKSA9PiB7XG4gICAgICAgICAgICAvLyBBZGQgYSBxdWVyeSBmb3JtIGNvbnRyb2wgZm9yIGV2ZXJ5IHF7bnVtfSBrZXkgYWZ0ZXIgdGhlIGZpcnN0LlxuICAgICAgICAgICAgbGV0IHF1ZXJ5Q29udHJvbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sID0gdGhpcy5xdWVyaWVzLmF0KGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sID0gdGhpcy5xdWVyaWVzLmF0KC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWVyeSB2YWx1ZS5cbiAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5xdWVyeS5zZXRWYWx1ZShxdWVyeVJvdy5xdWVyeSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgZmllbGQgdmFsdWUsIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmIChxdWVyeVJvdy5maWVsZCkgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnNldFZhbHVlKHF1ZXJ5Um93LmZpZWxkKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYWR2YW5jZWRTZWFyY2hPcHRpb25zLmV4dGVybmFsRmllbGRzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxvY2FsRmllbGRzWzBdLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVhbGlmaWVyIHZhbHVlLCBpZiBhdmFpbGFibGUgYW5kIGEgbG9jYWwgc2VhcmNoLlxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnICYmIHF1ZXJ5Um93LnF1YWxpZmllcilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKHF1ZXJ5Um93LnF1YWxpZmllcik7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9vbGVhbiwgaWYgYXZhaWxhYmxlIGFuZCBub3QgdGhlIGZpcnN0IHF1ZXJ5LlxuICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgcXVlcnlSb3cuYm9vbGVhbilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuYm9vbGVhbi5zZXRWYWx1ZShxdWVyeVJvdy5ib29sZWFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgdGhpcy50eXBlcy5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkUmVzb3VyY2VUeXBlcyk7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guc2VsZWN0ZWRDb2xsZWN0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3RlZExhbmd1YWdlcyBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW10sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wZWVyUmV2aWV3ZWQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5saW1pdFJlc3VsdHMucGVlclJldmlld2VkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSZWxhdGVkV29yZHMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmFwcGx5UmVsYXRlZFdvcmRzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZnVsbFRleHQuc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmZ1bGxUZXh0KTtcbiAgICAgICAgICAgIHRoaXMuZnJvbS5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmRhdGVQdWJsaXNoZWQuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnRvLnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZGF0ZVB1Ymxpc2hlZC50byk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGZvcm1cbiAgICBkYXRhLXRlc3RpZD1cImFkdmFuY2VkU2VhcmNoRm9ybVwiXG4gICAgKHN1Ym1pdCk9XCJjb25maWcuc2NvcGUgPT09ICdsb2NhbCcgPyBkb0xvY2FsQWR2YW5jZWRTZWFyY2goKSA6IGRvRXh0ZXJuYWxBZHZhbmNlZFNlYXJjaCgpXCJcbiAgICBbZm9ybUdyb3VwXT1cImFkdmFuY2VkU2VhcmNoRm9ybVwiXG4gICAgY2xhc3M9XCJhZHYtc2VhcmNoLXdyYXBwZXJcIlxuPlxuICAgIDxoMz5BZHZhbmNlZCBTZWFyY2g8L2gzPlxuICAgIDwhLS0gUXVlcmllcyAtLT5cbiAgICBAZm9yIChxdWVyeSBvZiBxdWVyaWVzLmNvbnRyb2xzOyB0cmFjayAkaW5kZXg7IGxldCBxdWVyeUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZHYtc2VhcmNoLXJvd1wiIFtmb3JtR3JvdXBdPVwicXVlcnlcIj5cbiAgICAgICAgICAgIDwhLS0gQm9vbGVhbiBvcGVyYXRvciAtLT5cbiAgICAgICAgICAgIDwhLS0gQWRkIGJvb2xlYW4gZm9yIGVhY2ggcm93IGV4Y2VwdCBmb3IgZmlyc3QgLS0+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidib29sZWFuJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJvb2xlYW4gb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmJvb2xlYW47IHRyYWNrIGJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImJvb2xlYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYm9vbGVhbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gRmllbGQgLS0+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZmllbGQnICsgcXVlcnlJbmRleFwiIGNsYXNzPVwiaGlkZGVuXCI+RmllbGQge3sgcXVlcnlJbmRleCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCInZmllbGQnICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZHZhbmNlZFNlYXJjaE9wdGlvbnMuZXh0ZXJuYWxGaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5sb2NhbEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJmaWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFkdmFuY2VkU2VhcmNoRmllbGRNYXBbZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFF1YWxpZmllcnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCBzZWFyY2hlcyAtLT5cbiAgICAgICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ3F1YWxpZmllcicgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICA+TWF0Y2ggQ3JpdGVyaWEge3sgcXVlcnlJbmRleCB9fTwvbGFiZWxcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVhbGlmaWVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICRhbnkgYmVjYXVzZSBhIGZpZWxkIGNhbiB0ZWNobmljYWxseSBiZSBsb2NhbCBvciBleHRlcm5hbCwgdGhvdWdoIHRoaXMgYmxvY2sgaXMgc2NvcGVkIHN0cmljdGx5IHRvIGxvY2FsIGZpZWxkcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllciBvZiAkYW55KGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5xdWFsaWZpZXJzKVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkuY29udHJvbHMuZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHF1YWxpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSAkaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwicXVhbGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXggKyAnLW9wdGlvbicgKyBvcHRpb25JbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJGFueShhZHZhbmNlZFNlYXJjaFF1YWxpZmllck1hcClbcXVhbGlmaWVyXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gUXVlcnkgLS0+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVlcnknICsgcXVlcnlJbmRleFwiIGNsYXNzPVwiaGlkZGVuXCI+UXVlcnkge3sgcXVlcnlJbmRleCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVlcnktaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCIncXVlcnknICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3F1ZXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRmlsbCBvdXQgdGhpcyBmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2Fib3ZlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpc1N1Ym1pdHRlZCAmJiBxdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LmludmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW52YWxpZElucHV0RGVzY1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghJGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVF1ZXJ5KHF1ZXJ5SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2NhbmNlbFJvdycgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiYWRkUXVlcnkoKVwiXG4gICAgICAgIGlkPVwiYWRkUXVlcnlCdG5cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImFkZFF1ZXJ5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInF1ZXJpZXMubGVuZ3RoID4gMTFcIlxuICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb25cIj4gYWRkIDwvc3Bhbj5cbiAgICAgICAgQWRkIGEgcm93XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBPVEhFUiBPUFRJT05TIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJvdGhlci1vcHRpb25zXCI+XG4gICAgICAgIDwhLS0gTE9DQUwgLS0+XG4gICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICA8IS0tIFR5cGUgLS0+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVzb3VyY2VUeXBlXCI+XG4gICAgICAgICAgICAgICAgPGg0PlJlc291cmNlIFR5cGU8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ1Jlc291cmNlIFR5cGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLmF2YWlsYWJsZVJlc291cmNlVHlwZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJ0eXBlcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRLZXlzQ2hhbmdlKT1cInR5cGVzLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ29sbGVjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkNvbGxlY3Rpb248L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NvbGxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLmF2YWlsYWJsZUNvbGxlY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwiY29sbGVjdGlvbnMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJjb2xsZWN0aW9ucy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLSBFWFRFUk5BTCAtLT5cbiAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdleHRlcm5hbCcpIHtcbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImxpbWl0UmVzdWx0c1wiIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxoND5Gb3IgRmV3ZXIgUmVzdWx0cyBUcnk8L2g0PlxuICAgICAgICAgICAgICAgIDwhLS0gUGVlciByZXZpZXdlZCAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIGZvcj1cInBlZXJSZXZpZXdlZFwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicGVlclJldmlld2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidwZWVyUmV2aWV3ZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicGVlclJldmlld2VkXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1oYmxsLWNoZWNrYm94IFtpc0NoZWNrZWRdPVwicGVlclJldmlld2VkLnZhbHVlXCI+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCI+UGVlciByZXZpZXdlZCBqb3VybmFsIGFydGljbGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImV4cGFuZFJlc3VsdHNcIiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Rm9yIE1vcmUgUmVzdWx0cyBUcnk8L2g0PlxuICAgICAgICAgICAgICAgIDwhLS0gQXBwbHkgcmVsYXRlZCB3b3JkcyAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIGZvcj1cImFwcGx5UmVsYXRlZFdvcmRzXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBseVJlbGF0ZWRXb3Jkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYXBwbHlSZWxhdGVkV29yZHMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXBwbHlSZWxhdGVkV29yZHNcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJhcHBseVJlbGF0ZWRXb3Jkcy52YWx1ZVwiPjwvbGliLWhibGwtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtdGV4dFwiPkFwcGx5IHJlbGF0ZWQgd29yZHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8IS0tIEFwcGx5IGVxdWl2YWxlbnQgc3ViamVjdHMgLS0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBmb3I9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2FwcGx5RXF1aXZhbGVudFN1YmplY3RzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1oYmxsLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNDaGVja2VkXT1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLWhibGwtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtdGV4dFwiPkFwcGx5IGVxdWl2YWxlbnQgc3ViamVjdHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8IS0tIEZ1bGwgdGV4dCAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIGZvcj1cImZ1bGxUZXh0XCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJmdWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZnVsbFRleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZnVsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJmdWxsVGV4dC52YWx1ZVwiPjwvbGliLWhibGwtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+SW5jbHVkZSByZXN1bHRzIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG88L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkYXRlT3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxoND5EYXRlIFB1Ymxpc2hlZDwvaDQ+XG4gICAgICAgICAgICAgICAgPGxpYi1kYXRlLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgIFtmcm9tXT1cImZyb20udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdG9dPVwidG8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoZnJvbUNoYW5nZSk9XCJmcm9tLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAodG9DaGFuZ2UpPVwidG8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvbGliLWRhdGUtcmFuZ2U+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gTGFuZ3VhZ2UgLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoND5MYW5ndWFnZTwvaDQ+XG4gICAgICAgICAgICAgICAgPGxpYi1oYmxsLW11bHRpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2xhbmd1YWdlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmF2YWlsYWJsZUxhbmd1YWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwibGFuZ3VhZ2VzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJsYW5ndWFnZXMuc2V0VmFsdWUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gbGliSGJsbFBpbGxCdG4gW2NvbG9yXT1cIidibHVlJ1wiIHR5cGU9XCJzdWJtaXRcIiBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiPlxuICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuIl19
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export const ADVANCED_SEARCH_QUALIFIER_MAP = {
|
|
2
|
+
contains: 'contains',
|
|
3
|
+
begins_with: 'begins with',
|
|
4
|
+
exact: 'is (exact)',
|
|
5
|
+
index: 'browse value',
|
|
6
|
+
subject_lc: 'LC browse',
|
|
7
|
+
subject_expanded: 'expanded browse',
|
|
8
|
+
};
|
|
9
|
+
export const ADVANCED_SEARCH_FIELD_MAP = {
|
|
10
|
+
abstract: 'Abstract',
|
|
11
|
+
allText: 'All Text',
|
|
12
|
+
any: 'Any Field',
|
|
13
|
+
callNumber: 'Call Number',
|
|
14
|
+
contributor: 'Contributor',
|
|
15
|
+
creator: 'Author/Creator',
|
|
16
|
+
genre: 'Genre',
|
|
17
|
+
isbn: 'ISBN',
|
|
18
|
+
issn: 'ISSN',
|
|
19
|
+
series: 'Series',
|
|
20
|
+
source: 'Source',
|
|
21
|
+
subject: 'Subject',
|
|
22
|
+
title: 'Title',
|
|
23
|
+
};
|
|
24
|
+
export const PRIMARY_BLUE = 'rgba(63, 112, 176, 1)';
|
|
25
|
+
export const PRIMARY_BLUE_HOVER = 'hsl(214, 48%, 60%, 1)';
|
|
26
|
+
export const PRIMARY_LIGHT_BLUE = 'rgba(223, 233, 247, 1)';
|
|
27
|
+
export const PRIMARY_PURPLE = '#8772A6';
|
|
28
|
+
export const PRIMARY_PURPLE_HOVER = '#7C659F';
|
|
29
|
+
export const DESTRUCTIVE_RED = 'hsl(5, 47%, 47%, 1)';
|
|
30
|
+
export const DESTRUCTIVE_RED_HOVER = 'hsl(5, 47%, 50%, 1)';
|
|
31
|
+
export const SECONDARY_TEXT_GRAY = 'rgba(112, 112, 112, 1)';
|
|
32
|
+
export const LIGHT_GRAY = 'rgba(230, 230, 230, 1)';
|
|
33
|
+
export const DROP_SHADOW_DARK_BLUE = 'rgba(51, 62, 77, 0.16)';
|
|
34
|
+
export const TEXT_SEMIBOLD = '600';
|
|
35
|
+
export const TEXT_BOLD = '700';
|
|
36
|
+
export const ANIMATION_LENGTH_STD = '0.15s';
|
|
37
|
+
export const LINE_HEIGHT_STD = '1.4';
|
|
38
|
+
export const CONTEXTUAL_SELECTOR_HEIGHT = '4.5rem';
|
|
39
|
+
export const CONTENT_MAX_WIDTH = '75rem';
|
|
40
|
+
export const CONTENT_PADDING = '5.4rem';
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHO0lBQ3pDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLEtBQUssRUFBRSxZQUFZO0lBQ25CLEtBQUssRUFBRSxjQUFjO0lBQ3JCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLGdCQUFnQixFQUFFLGlCQUFpQjtDQUN0QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDckMsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixLQUFLLEVBQUUsT0FBTztJQUNkLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztDQUNqQixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDO0FBQzFELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyx3QkFBd0IsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztBQUM1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLFFBQVEsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBBRFZBTkNFRF9TRUFSQ0hfUVVBTElGSUVSX01BUCA9IHtcbiAgICBjb250YWluczogJ2NvbnRhaW5zJyxcbiAgICBiZWdpbnNfd2l0aDogJ2JlZ2lucyB3aXRoJyxcbiAgICBleGFjdDogJ2lzIChleGFjdCknLFxuICAgIGluZGV4OiAnYnJvd3NlIHZhbHVlJyxcbiAgICBzdWJqZWN0X2xjOiAnTEMgYnJvd3NlJyxcbiAgICBzdWJqZWN0X2V4cGFuZGVkOiAnZXhwYW5kZWQgYnJvd3NlJyxcbn07XG5cbmV4cG9ydCBjb25zdCBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQID0ge1xuICAgIGFic3RyYWN0OiAnQWJzdHJhY3QnLFxuICAgIGFsbFRleHQ6ICdBbGwgVGV4dCcsXG4gICAgYW55OiAnQW55IEZpZWxkJyxcbiAgICBjYWxsTnVtYmVyOiAnQ2FsbCBOdW1iZXInLFxuICAgIGNvbnRyaWJ1dG9yOiAnQ29udHJpYnV0b3InLFxuICAgIGNyZWF0b3I6ICdBdXRob3IvQ3JlYXRvcicsXG4gICAgZ2VucmU6ICdHZW5yZScsXG4gICAgaXNibjogJ0lTQk4nLFxuICAgIGlzc246ICdJU1NOJyxcbiAgICBzZXJpZXM6ICdTZXJpZXMnLFxuICAgIHNvdXJjZTogJ1NvdXJjZScsXG4gICAgc3ViamVjdDogJ1N1YmplY3QnLFxuICAgIHRpdGxlOiAnVGl0bGUnLFxufTtcbmV4cG9ydCBjb25zdCBQUklNQVJZX0JMVUUgPSAncmdiYSg2MywgMTEyLCAxNzYsIDEpJztcbmV4cG9ydCBjb25zdCBQUklNQVJZX0JMVUVfSE9WRVIgPSAnaHNsKDIxNCwgNDglLCA2MCUsIDEpJztcbmV4cG9ydCBjb25zdCBQUklNQVJZX0xJR0hUX0JMVUUgPSAncmdiYSgyMjMsIDIzMywgMjQ3LCAxKSc7XG5leHBvcnQgY29uc3QgUFJJTUFSWV9QVVJQTEUgPSAnIzg3NzJBNic7XG5leHBvcnQgY29uc3QgUFJJTUFSWV9QVVJQTEVfSE9WRVIgPSAnIzdDNjU5Ric7XG5leHBvcnQgY29uc3QgREVTVFJVQ1RJVkVfUkVEID0gJ2hzbCg1LCA0NyUsIDQ3JSwgMSknO1xuZXhwb3J0IGNvbnN0IERFU1RSVUNUSVZFX1JFRF9IT1ZFUiA9ICdoc2woNSwgNDclLCA1MCUsIDEpJztcbmV4cG9ydCBjb25zdCBTRUNPTkRBUllfVEVYVF9HUkFZID0gJ3JnYmEoMTEyLCAxMTIsIDExMiwgMSknO1xuZXhwb3J0IGNvbnN0IExJR0hUX0dSQVkgPSAncmdiYSgyMzAsIDIzMCwgMjMwLCAxKSc7XG5leHBvcnQgY29uc3QgRFJPUF9TSEFET1dfREFSS19CTFVFID0gJ3JnYmEoNTEsIDYyLCA3NywgMC4xNiknO1xuZXhwb3J0IGNvbnN0IFRFWFRfU0VNSUJPTEQgPSAnNjAwJztcbmV4cG9ydCBjb25zdCBURVhUX0JPTEQgPSAnNzAwJztcbmV4cG9ydCBjb25zdCBBTklNQVRJT05fTEVOR1RIX1NURCA9ICcwLjE1cyc7XG5leHBvcnQgY29uc3QgTElORV9IRUlHSFRfU1REID0gJzEuNCc7XG5leHBvcnQgY29uc3QgQ09OVEVYVFVBTF9TRUxFQ1RPUl9IRUlHSFQgPSAnNC41cmVtJztcbmV4cG9ydCBjb25zdCBDT05URU5UX01BWF9XSURUSCA9ICc3NXJlbSc7XG5leHBvcnQgY29uc3QgQ09OVEVOVF9QQURESU5HID0gJzUuNHJlbSc7XG4iXX0=
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
|
|
2
|
+
import { NonNullableFormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { libHbllFadeInOut } from '../../animations/animations';
|
|
5
|
+
import { validateDateRangeFields } from '../utils';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/forms";
|
|
8
|
+
export class DateRangeComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.fb = inject(NonNullableFormBuilder);
|
|
11
|
+
/**
|
|
12
|
+
* Emits `{ from: string, to: string }` object if both values are set to a valid or empty state by the user.
|
|
13
|
+
*/
|
|
14
|
+
this.validDateChange = new EventEmitter();
|
|
15
|
+
this.fromChange = new EventEmitter();
|
|
16
|
+
this.toChange = new EventEmitter();
|
|
17
|
+
this.dateForm = this.fb.group({
|
|
18
|
+
from: ['', [Validators.pattern('^[0-9]{4}$')]],
|
|
19
|
+
to: ['', [Validators.pattern('^[0-9]{4}$')]],
|
|
20
|
+
}, { validators: validateDateRangeFields() });
|
|
21
|
+
this.onFromChange = () => {
|
|
22
|
+
this.onInputChange();
|
|
23
|
+
this.fromChange.emit(this.dateForm.controls.from.value);
|
|
24
|
+
};
|
|
25
|
+
this.onToChange = () => {
|
|
26
|
+
this.onInputChange();
|
|
27
|
+
this.toChange.emit(this.dateForm.controls.to.value);
|
|
28
|
+
};
|
|
29
|
+
this.onInputChange = () => {
|
|
30
|
+
let from = this.dateForm.controls.from.value;
|
|
31
|
+
let to = this.dateForm.controls.to.value;
|
|
32
|
+
if (from && to && this.dateForm.controls.from.valid && this.dateForm.controls.to.valid) {
|
|
33
|
+
// Ensure 'to' contains the larger year. Swap if necessary.
|
|
34
|
+
if (parseInt(from) > parseInt(to)) {
|
|
35
|
+
const swap = from;
|
|
36
|
+
from = to;
|
|
37
|
+
to = swap;
|
|
38
|
+
}
|
|
39
|
+
this.validDateChange.emit({ from, to });
|
|
40
|
+
}
|
|
41
|
+
else if (!from && !to) {
|
|
42
|
+
this.validDateChange.emit({ from, to });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
set from(from) {
|
|
47
|
+
if (from !== this.dateForm.controls.from.value)
|
|
48
|
+
this.dateForm.controls.from.setValue(from);
|
|
49
|
+
}
|
|
50
|
+
set to(to) {
|
|
51
|
+
if (to !== this.dateForm.controls.to.value)
|
|
52
|
+
this.dateForm.controls.to.setValue(to);
|
|
53
|
+
}
|
|
54
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DateRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
55
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: DateRangeComponent, isStandalone: true, selector: "lib-date-range", inputs: { from: "from", to: "to" }, outputs: { validDateChange: "validDateChange", fromChange: "fromChange", toChange: "toChange" }, ngImport: i0, template: "<form id=\"from-to\" data-testid=\"from-to\" [formGroup]=\"dateForm\">\n <label for=\"fromFacet\">Between</label>\n <input\n formControlName=\"from\"\n id=\"fromFacet\"\n name=\"fromFacet\"\n data-testid=\"from\"\n placeholder=\"YYYY\"\n inputmode=\"numeric\"\n minlength=\"4\"\n maxlength=\"4\"\n (input)=\"onFromChange()\"\n [class.error]=\"\n dateForm.errors?.['fromInvalid'] || dateForm.controls.from.errors?.['pattern']\n \"\n />\n <label for=\"toFacet\">and</label>\n <input\n formControlName=\"to\"\n id=\"toFacet\"\n name=\"toFacet\"\n data-testid=\"to\"\n placeholder=\"YYYY\"\n inputmode=\"numeric\"\n minlength=\"4\"\n maxlength=\"4\"\n (input)=\"onToChange()\"\n [class.error]=\"dateForm.errors?.['toInvalid'] || dateForm.controls.to.errors?.['pattern']\"\n />\n</form>\n", styles: ["input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}input:focus{border-color:#3a6093}#from-to{margin-top:.6rem;margin-bottom:.8rem}#from-to label{margin-right:.7em}#from-to label:not(:first-of-type){margin-left:.7em}#from-to input{font-size:inherit;width:3.5em}#from-to input.error{border-color:#b04940}@media screen and (min-width: 690px){#from-to{margin-bottom:1.4rem}#from-to label{margin-right:.65em}#from-to label:not(:first-of-type){margin-left:.65em}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], animations: [libHbllFadeInOut], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DateRangeComponent, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{ selector: 'lib-date-range', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, ReactiveFormsModule], animations: [libHbllFadeInOut], template: "<form id=\"from-to\" data-testid=\"from-to\" [formGroup]=\"dateForm\">\n <label for=\"fromFacet\">Between</label>\n <input\n formControlName=\"from\"\n id=\"fromFacet\"\n name=\"fromFacet\"\n data-testid=\"from\"\n placeholder=\"YYYY\"\n inputmode=\"numeric\"\n minlength=\"4\"\n maxlength=\"4\"\n (input)=\"onFromChange()\"\n [class.error]=\"\n dateForm.errors?.['fromInvalid'] || dateForm.controls.from.errors?.['pattern']\n \"\n />\n <label for=\"toFacet\">and</label>\n <input\n formControlName=\"to\"\n id=\"toFacet\"\n name=\"toFacet\"\n data-testid=\"to\"\n placeholder=\"YYYY\"\n inputmode=\"numeric\"\n minlength=\"4\"\n maxlength=\"4\"\n (input)=\"onToChange()\"\n [class.error]=\"dateForm.errors?.['toInvalid'] || dateForm.controls.to.errors?.['pattern']\"\n />\n</form>\n", styles: ["input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}input:focus{border-color:#3a6093}#from-to{margin-top:.6rem;margin-bottom:.8rem}#from-to label{margin-right:.7em}#from-to label:not(:first-of-type){margin-left:.7em}#from-to input{font-size:inherit;width:3.5em}#from-to input.error{border-color:#b04940}@media screen and (min-width: 690px){#from-to{margin-bottom:1.4rem}#from-to label{margin-right:.65em}#from-to label:not(:first-of-type){margin-left:.65em}}\n"] }]
|
|
60
|
+
}], propDecorators: { validDateChange: [{
|
|
61
|
+
type: Output
|
|
62
|
+
}], fromChange: [{
|
|
63
|
+
type: Output
|
|
64
|
+
}], toChange: [{
|
|
65
|
+
type: Output
|
|
66
|
+
}], from: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], to: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}] } });
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc3Mtc2VhcmNoLWJhci9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0FBV25ELE1BQU0sT0FBTyxrQkFBa0I7SUFUL0I7UUFVcUIsT0FBRSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JEOztXQUVHO1FBQ08sb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBZ0MsQ0FBQztRQUNuRSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN4QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN0QyxhQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQzlCO1lBQ0ksSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFD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akIsTUFBTTtnQkFRTSxJQUFJO3NCQUFoQixLQUFLO2dCQUdPLEVBQUU7c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgbGliSGJsbEZhZGVJbk91dCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcyB9IGZyb20gJy4uL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItZGF0ZS1yYW5nZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtcmFuZ2UuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICAgIGFuaW1hdGlvbnM6IFtsaWJIYmxsRmFkZUluT3V0XSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIC8qKlxuICAgICAqIEVtaXRzIGB7IGZyb206IHN0cmluZywgdG86IHN0cmluZyB9YCBvYmplY3QgaWYgYm90aCB2YWx1ZXMgYXJlIHNldCB0byBhIHZhbGlkIG9yIGVtcHR5IHN0YXRlIGJ5IHRoZSB1c2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB2YWxpZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0+KCk7XG4gICAgQE91dHB1dCgpIGZyb21DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICBAT3V0cHV0KCkgdG9DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICBwcm90ZWN0ZWQgZGF0ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKFxuICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiBbJycsIFtWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XXs0fSQnKV1dLFxuICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMucGF0dGVybignXlswLTldezR9JCcpXV0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgdmFsaWRhdG9yczogdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMoKSB9LFxuICAgICk7XG4gICAgQElucHV0KCkgc2V0IGZyb20oZnJvbTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmcm9tICE9PSB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzLmZyb20udmFsdWUpIHRoaXMuZGF0ZUZvcm0uY29udHJvbHMuZnJvbS5zZXRWYWx1ZShmcm9tKTtcbiAgICB9XG4gICAgQElucHV0KCkgc2V0IHRvKHRvOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRvICE9PSB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzLnRvLnZhbHVlKSB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzLnRvLnNldFZhbHVlKHRvKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG9uRnJvbUNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlKCk7XG4gICAgICAgIHRoaXMuZnJvbUNoYW5nZS5lbWl0KHRoaXMuZGF0ZUZvcm0uY29udHJvbHMuZnJvbS52YWx1ZSk7XG4gICAgfTtcbiAgICBwcm90ZWN0ZWQgb25Ub0NoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlKCk7XG4gICAgICAgIHRoaXMudG9DaGFuZ2UuZW1pdCh0aGlzLmRhdGVGb3JtLmNvbnRyb2xzLnRvLnZhbHVlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbklucHV0Q2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMuZGF0ZUZvcm0uY29udHJvbHMuZnJvbS52YWx1ZTtcbiAgICAgICAgbGV0IHRvID0gdGhpcy5kYXRlRm9ybS5jb250cm9scy50by52YWx1ZTtcbiAgICAgICAgaWYgKGZyb20gJiYgdG8gJiYgdGhpcy5kYXRlRm9ybS5jb250cm9scy5mcm9tLnZhbGlkICYmIHRoaXMuZGF0ZUZvcm0uY29udHJvbHMudG8udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSAndG8nIGNvbnRhaW5zIHRoZSBsYXJnZXIgeWVhci4gU3dhcCBpZiBuZWNlc3NhcnkuXG4gICAgICAgICAgICBpZiAocGFyc2VJbnQoZnJvbSkgPiBwYXJzZUludCh0bykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzd2FwID0gZnJvbTtcbiAgICAgICAgICAgICAgICBmcm9tID0gdG87XG4gICAgICAgICAgICAgICAgdG8gPSBzd2FwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YWxpZERhdGVDaGFuZ2UuZW1pdCh7IGZyb20sIHRvIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFmcm9tICYmICF0bykge1xuICAgICAgICAgICAgdGhpcy52YWxpZERhdGVDaGFuZ2UuZW1pdCh7IGZyb20sIHRvIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsIjxmb3JtIGlkPVwiZnJvbS10b1wiIGRhdGEtdGVzdGlkPVwiZnJvbS10b1wiIFtmb3JtR3JvdXBdPVwiZGF0ZUZvcm1cIj5cbiAgICA8bGFiZWwgZm9yPVwiZnJvbUZhY2V0XCI+QmV0d2VlbjwvbGFiZWw+XG4gICAgPGlucHV0XG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZyb21cIlxuICAgICAgICBpZD1cImZyb21GYWNldFwiXG4gICAgICAgIG5hbWU9XCJmcm9tRmFjZXRcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImZyb21cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIllZWVlcIlxuICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgbWlubGVuZ3RoPVwiNFwiXG4gICAgICAgIG1heGxlbmd0aD1cIjRcIlxuICAgICAgICAoaW5wdXQpPVwib25Gcm9tQ2hhbmdlKClcIlxuICAgICAgICBbY2xhc3MuZXJyb3JdPVwiXG4gICAgICAgICAgICBkYXRlRm9ybS5lcnJvcnM/LlsnZnJvbUludmFsaWQnXSB8fCBkYXRlRm9ybS5jb250cm9scy5mcm9tLmVycm9ycz8uWydwYXR0ZXJuJ11cbiAgICAgICAgXCJcbiAgICAvPlxuICAgIDxsYWJlbCBmb3I9XCJ0b0ZhY2V0XCI+YW5kPC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidG9cIlxuICAgICAgICBpZD1cInRvRmFjZXRcIlxuICAgICAgICBuYW1lPVwidG9GYWNldFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwidG9cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIllZWVlcIlxuICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgbWlubGVuZ3RoPVwiNFwiXG4gICAgICAgIG1heGxlbmd0aD1cIjRcIlxuICAgICAgICAoaW5wdXQpPVwib25Ub0NoYW5nZSgpXCJcbiAgICAgICAgW2NsYXNzLmVycm9yXT1cImRhdGVGb3JtLmVycm9ycz8uWyd0b0ludmFsaWQnXSB8fCBkYXRlRm9ybS5jb250cm9scy50by5lcnJvcnM/LlsncGF0dGVybiddXCJcbiAgICAvPlxuPC9mb3JtPlxuIl19
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import { ADVANCED_SEARCH_OPTIONS, } from '../ss-search-bar.component';
|
|
3
|
+
import { ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_QUALIFIER_MAP } from '../constants';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class SsAdvancedQueriesPipe {
|
|
6
|
+
transform(queryRows) {
|
|
7
|
+
return queryRows
|
|
8
|
+
.map((row, i) => {
|
|
9
|
+
const b = i !== 0 ? row.boolean || ADVANCED_SEARCH_OPTIONS.boolean[0] : '';
|
|
10
|
+
const f = row.field ??
|
|
11
|
+
ADVANCED_SEARCH_OPTIONS.localFields[0];
|
|
12
|
+
const o = row.qualifier ?? ADVANCED_SEARCH_OPTIONS.qualifiers[f][0];
|
|
13
|
+
return `${b ? b + ' ' : ''}${ADVANCED_SEARCH_FIELD_MAP[f]} ${ADVANCED_SEARCH_QUALIFIER_MAP[o]} <b>${row.query}</b>`;
|
|
14
|
+
})
|
|
15
|
+
.join(' ');
|
|
16
|
+
}
|
|
17
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: SsAdvancedQueriesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
18
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: SsAdvancedQueriesPipe, isStandalone: true, name: "ssAdvancedQueries" }); }
|
|
19
|
+
}
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: SsAdvancedQueriesPipe, decorators: [{
|
|
21
|
+
type: Pipe,
|
|
22
|
+
args: [{
|
|
23
|
+
name: 'ssAdvancedQueries',
|
|
24
|
+
standalone: true,
|
|
25
|
+
}]
|
|
26
|
+
}] });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtcXVlcmllcy5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvcGlwZXMvYWR2YW5jZWQtcXVlcmllcy5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFDSCx1QkFBdUIsR0FHMUIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBTXhGLE1BQU0sT0FBTyxxQkFBcUI7SUFDOUIsU0FBUyxDQUFDLFNBQW1DO1FBQ3pDLE9BQU8sU0FBUzthQUNYLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxDQUFDLEdBQ0YsR0FBRyxDQUFDLEtBQXdDO2dCQUM1Qyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFvQyxDQUFDO1lBQy9FLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLElBQUksdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FDdEIseUJBQXlCLENBQUMsQ0FBQyxDQUMvQixJQUFJLDZCQUE2QixDQUFDLENBQStDLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUM7UUFDN0csQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7OEdBZFEscUJBQXFCOzRHQUFyQixxQkFBcUI7OzJGQUFyQixxQkFBcUI7a0JBSmpDLElBQUk7bUJBQUM7b0JBQ0YsSUFBSSxFQUFFLG1CQUFtQjtvQkFDekIsVUFBVSxFQUFFLElBQUk7aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUyxcbiAgICBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hRdWVyeVJvdyxcbn0gZnJvbSAnLi4vc3Mtc2VhcmNoLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQURWQU5DRURfU0VBUkNIX0ZJRUxEX01BUCwgQURWQU5DRURfU0VBUkNIX1FVQUxJRklFUl9NQVAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5AUGlwZSh7XG4gICAgbmFtZTogJ3NzQWR2YW5jZWRRdWVyaWVzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTc0FkdmFuY2VkUXVlcmllc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICB0cmFuc2Zvcm0ocXVlcnlSb3dzOiBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93W10pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcXVlcnlSb3dzXG4gICAgICAgICAgICAubWFwKChyb3csIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gaSAhPT0gMCA/IHJvdy5ib29sZWFuIHx8IEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmJvb2xlYW5bMF0gOiAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBmOiBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb24gPVxuICAgICAgICAgICAgICAgICAgICAocm93LmZpZWxkIGFzIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbikgPz9cbiAgICAgICAgICAgICAgICAgICAgKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmxvY2FsRmllbGRzWzBdIGFzIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IHJvdy5xdWFsaWZpZXIgPz8gQURWQU5DRURfU0VBUkNIX09QVElPTlMucXVhbGlmaWVyc1tmXVswXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YiA/IGIgKyAnICcgOiAnJ30ke1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQW2ZdXG4gICAgICAgICAgICAgICAgfSAke0FEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQW28gYXMga2V5b2YgdHlwZW9mIEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQXX0gPGI+JHtyb3cucXVlcnl9PC9iPmA7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG59XG4iXX0=
|