ng-zenduit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/lib/breadcrumbs/zendu-breadcrumbs.component.mjs +37 -0
- package/esm2020/lib/card-block/zendu-card-block.component.mjs +21 -0
- package/esm2020/lib/checkbox/zendu-checkbox.component.mjs +44 -0
- package/esm2020/lib/colorpicker/zendu-colorpicker.component.mjs +106 -0
- package/esm2020/lib/column-configuration/columnState.mjs +2 -0
- package/esm2020/lib/column-configuration/zendu-column-configuration.component.mjs +118 -0
- package/esm2020/lib/datepicker/date-picker-day.mjs +2 -0
- package/esm2020/lib/datepicker/date-picker-hint.mjs +2 -0
- package/esm2020/lib/datepicker/datepicker.mjs +9 -0
- package/esm2020/lib/datepicker/zendu-datepicker.component.mjs +434 -0
- package/esm2020/lib/doc-scanner/zendu-doc-scanner.component.mjs +628 -0
- package/esm2020/lib/file-upload/zendu-file-upload.component.mjs +107 -0
- package/esm2020/lib/filter/dateRange.mjs +2 -0
- package/esm2020/lib/filter/filtersConfig.mjs +2 -0
- package/esm2020/lib/filter/numberRange.mjs +2 -0
- package/esm2020/lib/filter/zendu-filter.component.mjs +461 -0
- package/esm2020/lib/icon/zendu-icon.component.mjs +24 -0
- package/esm2020/lib/local.lock.mjs +33 -0
- package/esm2020/lib/location-search/location.address.mjs +2 -0
- package/esm2020/lib/location-search/zendu-location-search.component.mjs +129 -0
- package/esm2020/lib/map/map.types.mjs +2 -0
- package/esm2020/lib/map/zendu-map.component.mjs +129 -0
- package/esm2020/lib/map-preview/zendu-map-preview.component.mjs +30 -0
- package/esm2020/lib/ng-zenduit.module.mjs +158 -0
- package/esm2020/lib/pagination-bar/pageItem.mjs +2 -0
- package/esm2020/lib/pagination-bar/zendu-pagination-bar.component.mjs +71 -0
- package/esm2020/lib/phone-input/zendu-phone-input.component.mjs +141 -0
- package/esm2020/lib/progress/zendu-progress.component.mjs +29 -0
- package/esm2020/lib/radio-button/radio-button.component.mjs +48 -0
- package/esm2020/lib/search-box/zendu-search-box.component.mjs +124 -0
- package/esm2020/lib/select/templates/zendu-select-option.directive.mjs +16 -0
- package/esm2020/lib/select/templates/zendu-select-value.directive.mjs +16 -0
- package/esm2020/lib/select/zendu-select.component.mjs +303 -0
- package/esm2020/lib/services/geoconding.service.mjs +61 -0
- package/esm2020/lib/services/map.service.mjs +181 -0
- package/esm2020/lib/services/opencv.service.mjs +109 -0
- package/esm2020/lib/services/zendu-notify.service.mjs +92 -0
- package/esm2020/lib/sort-header/zendu-sort-header.component.mjs +36 -0
- package/esm2020/lib/spinner/zendu-spinner.component.mjs +11 -0
- package/esm2020/lib/toggle/zendu-toggle.component.mjs +32 -0
- package/esm2020/lib/toggle-slide/zendu-toggle-slide.component.mjs +27 -0
- package/esm2020/lib/util.mjs +93 -0
- package/esm2020/ng-zenduit.mjs +5 -0
- package/esm2020/public-api.mjs +42 -0
- package/fesm2015/ng-zenduit.mjs +3768 -0
- package/fesm2015/ng-zenduit.mjs.map +1 -0
- package/fesm2020/ng-zenduit.mjs +3735 -0
- package/fesm2020/ng-zenduit.mjs.map +1 -0
- package/icons/arrow-down-small.svg +3 -0
- package/icons/arrow-up-small.svg +3 -0
- package/icons/calendar.svg +6 -0
- package/icons/cross.svg +3 -0
- package/icons/date.svg +3 -0
- package/icons/expand.svg +3 -0
- package/icons/filter.svg +3 -0
- package/icons/play.svg +10 -0
- package/icons/redo.svg +3 -0
- package/icons/rotate.svg +3 -0
- package/icons/time.svg +4 -0
- package/icons/undo.svg +3 -0
- package/index.d.ts +5 -0
- package/lib/breadcrumbs/zendu-breadcrumbs.component.d.ts +22 -0
- package/lib/card-block/zendu-card-block.component.d.ts +9 -0
- package/lib/checkbox/zendu-checkbox.component.d.ts +17 -0
- package/lib/colorpicker/zendu-colorpicker.component.d.ts +28 -0
- package/lib/column-configuration/columnState.d.ts +7 -0
- package/lib/column-configuration/zendu-column-configuration.component.d.ts +43 -0
- package/lib/datepicker/date-picker-day.d.ts +8 -0
- package/lib/datepicker/date-picker-hint.d.ts +5 -0
- package/lib/datepicker/datepicker.d.ts +7 -0
- package/lib/datepicker/zendu-datepicker.component.d.ts +94 -0
- package/lib/doc-scanner/zendu-doc-scanner.component.d.ts +82 -0
- package/lib/file-upload/zendu-file-upload.component.d.ts +28 -0
- package/lib/filter/dateRange.d.ts +4 -0
- package/lib/filter/filtersConfig.d.ts +88 -0
- package/lib/filter/numberRange.d.ts +4 -0
- package/lib/filter/zendu-filter.component.d.ts +59 -0
- package/lib/icon/zendu-icon.component.d.ts +10 -0
- package/lib/local.lock.d.ts +8 -0
- package/lib/location-search/location.address.d.ts +12 -0
- package/lib/location-search/zendu-location-search.component.d.ts +32 -0
- package/lib/map/map.types.d.ts +33 -0
- package/lib/map/zendu-map.component.d.ts +23 -0
- package/lib/map-preview/zendu-map-preview.component.d.ts +11 -0
- package/lib/ng-zenduit.module.d.ts +34 -0
- package/lib/pagination-bar/pageItem.d.ts +4 -0
- package/lib/pagination-bar/zendu-pagination-bar.component.d.ts +25 -0
- package/lib/phone-input/zendu-phone-input.component.d.ts +39 -0
- package/lib/progress/zendu-progress.component.d.ts +14 -0
- package/lib/radio-button/radio-button.component.d.ts +18 -0
- package/lib/search-box/zendu-search-box.component.d.ts +26 -0
- package/lib/select/templates/zendu-select-option.directive.d.ts +8 -0
- package/lib/select/templates/zendu-select-value.directive.d.ts +8 -0
- package/lib/select/zendu-select.component.d.ts +107 -0
- package/lib/services/geoconding.service.d.ts +23 -0
- package/lib/services/map.service.d.ts +22 -0
- package/lib/services/opencv.service.d.ts +46 -0
- package/lib/services/zendu-notify.service.d.ts +10 -0
- package/lib/sort-header/zendu-sort-header.component.d.ts +10 -0
- package/lib/spinner/zendu-spinner.component.d.ts +5 -0
- package/lib/toggle/zendu-toggle.component.d.ts +14 -0
- package/lib/toggle-slide/zendu-toggle-slide.component.d.ts +13 -0
- package/lib/util.d.ts +11 -0
- package/package.json +36 -0
- package/public-api.d.ts +38 -0
- package/styles/action-menu.scss +127 -0
- package/styles/all.scss +11 -0
- package/styles/button.scss +188 -0
- package/styles/colors.scss +125 -0
- package/styles/common-form.scss +159 -0
- package/styles/extenal.scss +2 -0
- package/styles/ghost.scss +38 -0
- package/styles/global-restyle.scss +25 -0
- package/styles/page-layout.scss +82 -0
- package/styles/snackbar.scss +91 -0
- package/styles/table.scss +107 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import uniqBy from 'lodash.uniqby';
|
|
3
|
+
import { Util } from '../util';
|
|
4
|
+
import { DATEPICKER_POSITION } from '../datepicker/datepicker';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "../checkbox/zendu-checkbox.component";
|
|
9
|
+
import * as i4 from "../toggle-slide/zendu-toggle-slide.component";
|
|
10
|
+
import * as i5 from "../search-box/zendu-search-box.component";
|
|
11
|
+
import * as i6 from "../datepicker/zendu-datepicker.component";
|
|
12
|
+
import * as i7 from "../radio-button/radio-button.component";
|
|
13
|
+
import * as i8 from "../icon/zendu-icon.component";
|
|
14
|
+
export class ZenduFilterComponent {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.config = { items: [] };
|
|
17
|
+
this.position = 'right';
|
|
18
|
+
this.resetBehavior = 'clear';
|
|
19
|
+
this.filterChange = new EventEmitter();
|
|
20
|
+
this.isVisible = false;
|
|
21
|
+
this.isVisibleChange = new EventEmitter();
|
|
22
|
+
this.customTrigger = false;
|
|
23
|
+
this.searchText = '';
|
|
24
|
+
this.isApplied = false;
|
|
25
|
+
this.lastAppliedFilter = {};
|
|
26
|
+
this.menuLeft = "0px";
|
|
27
|
+
this.menuRight = "0px";
|
|
28
|
+
this.menuTop = "0px";
|
|
29
|
+
this.menuBottom = "0px";
|
|
30
|
+
this.errorMessage = [];
|
|
31
|
+
this.datepickerPosition = DATEPICKER_POSITION;
|
|
32
|
+
}
|
|
33
|
+
ngOnChanges(changes) {
|
|
34
|
+
if (changes.config && changes.config.currentValue) {
|
|
35
|
+
// init values
|
|
36
|
+
for (const item of this.config.items) {
|
|
37
|
+
if (item.type === 'multiselect') {
|
|
38
|
+
item.dataSource = item.dataSource ? this.extractUniqueDataSource(item.dataSource) : [];
|
|
39
|
+
}
|
|
40
|
+
else if (item.type === 'dateRange' && !item.dateRange) {
|
|
41
|
+
item.dateRange = { start: null, end: null };
|
|
42
|
+
}
|
|
43
|
+
else if (item.type === 'numberRange' && !item.numberRange) {
|
|
44
|
+
item.numberRange = {};
|
|
45
|
+
}
|
|
46
|
+
if (typeof item.showTime !== 'boolean') {
|
|
47
|
+
item.showTime = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
this.filterItems();
|
|
51
|
+
this.resetedFilter = this.getFilterObject();
|
|
52
|
+
this.filter = this.getFilterObject();
|
|
53
|
+
this.lastAppliedFilter = Util.clone(this.filter);
|
|
54
|
+
}
|
|
55
|
+
if (changes.filter && changes.filter.currentValue) {
|
|
56
|
+
this.lastAppliedFilter = Util.clone(changes.filter.currentValue);
|
|
57
|
+
this.updateAppliedState();
|
|
58
|
+
}
|
|
59
|
+
if (changes.isVisible && changes.isVisible.currentValue) {
|
|
60
|
+
this.updatePlacement();
|
|
61
|
+
this.focusSearchBox();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
outsideHandling(event) {
|
|
65
|
+
if (!this.isVisible) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const target = event.target;
|
|
69
|
+
if (!document.body.contains(target)) {
|
|
70
|
+
// element not in the DOM
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (this._componentElement.nativeElement.contains(target)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// hide the menu for outside click
|
|
77
|
+
this.hide();
|
|
78
|
+
// restore values
|
|
79
|
+
this.restorePreviousApplied();
|
|
80
|
+
}
|
|
81
|
+
windowSizeHandling() {
|
|
82
|
+
if (!this.isVisible) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.updatePlacement();
|
|
86
|
+
}
|
|
87
|
+
windowScroll() {
|
|
88
|
+
if (!this.isVisible) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.updatePlacement();
|
|
92
|
+
}
|
|
93
|
+
handleMouseScroll(event) {
|
|
94
|
+
if (!this.isVisible) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const target = event.target;
|
|
98
|
+
if (!document.body.contains(target)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (this._componentElement.nativeElement.contains(target) && !target.classList.contains('button-stroked')) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.hide();
|
|
105
|
+
this.restorePreviousApplied();
|
|
106
|
+
}
|
|
107
|
+
onWindowKeyDown(event) {
|
|
108
|
+
if (!this.isVisible) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'PageUp' || event.key === 'PageDown' || event.key === 'Home' || event.key === 'End') {
|
|
112
|
+
const target = event.target;
|
|
113
|
+
if (!document.body.contains(target)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (this._componentElement.nativeElement.contains(target) && !target.classList.contains('button-stroked')) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.hide();
|
|
120
|
+
this.restorePreviousApplied();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
focusSearchBox() {
|
|
124
|
+
this.searchBox.doFocus();
|
|
125
|
+
}
|
|
126
|
+
isMenuIsVisible(item) {
|
|
127
|
+
if (item.filteredDataSource && this.searchText) {
|
|
128
|
+
if (!item.filteredDataSource.length) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
extractUniqueDataSource(array) {
|
|
135
|
+
const items = array.filter(el => {
|
|
136
|
+
return Boolean(typeof el.id === 'number' ? typeof el.id !== undefined : el.id &&
|
|
137
|
+
typeof el.name === 'number' ? typeof el.name !== undefined : el.name);
|
|
138
|
+
});
|
|
139
|
+
return uniqBy(items, (el) => el.id);
|
|
140
|
+
}
|
|
141
|
+
onSelectAll(item) {
|
|
142
|
+
item.dataSource.forEach(d => d.checked = item.isSelectedAll);
|
|
143
|
+
}
|
|
144
|
+
isItemActive(item) {
|
|
145
|
+
if (item.type === 'multiselect') {
|
|
146
|
+
const checkedItems = item.dataSource.filter(el => el.checked);
|
|
147
|
+
item.isSelectedAll = checkedItems.length === item.dataSource.length;
|
|
148
|
+
return checkedItems.length > 0;
|
|
149
|
+
}
|
|
150
|
+
else if (item.type === 'radio') {
|
|
151
|
+
const selectedRadio = item.radioOptions.find(ro => ro.selected);
|
|
152
|
+
return selectedRadio ? true : false;
|
|
153
|
+
}
|
|
154
|
+
else if (item.type === 'numberRange') {
|
|
155
|
+
return Boolean(item.numberRange.from || item.numberRange.to);
|
|
156
|
+
}
|
|
157
|
+
else if (item.type === 'dateRange') {
|
|
158
|
+
return Boolean(item.dateRange.start || item.dateRange.end);
|
|
159
|
+
}
|
|
160
|
+
else if (item.type === 'date') {
|
|
161
|
+
return Boolean(item.date);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
searchTextChanged() {
|
|
168
|
+
this.filterItems();
|
|
169
|
+
}
|
|
170
|
+
filterItems() {
|
|
171
|
+
let filteredItemsCount = 0; // Initialize with 0
|
|
172
|
+
for (const configItem of this.config.items) {
|
|
173
|
+
if (configItem.type === 'multiselect') {
|
|
174
|
+
configItem.filteredDataSource = configItem.dataSource.filter(el => {
|
|
175
|
+
const preparedName = typeof el.name === 'number' ? el.name.toString() : el.name;
|
|
176
|
+
return preparedName.toLowerCase().includes(this.searchText.toLowerCase());
|
|
177
|
+
});
|
|
178
|
+
filteredItemsCount += configItem.filteredDataSource.length; // Increment the count by the length of filteredDataSource
|
|
179
|
+
}
|
|
180
|
+
else if (configItem.type === 'dateRange') {
|
|
181
|
+
if (this.searchText && !Boolean(configItem.dateRange.start || configItem.dateRange.end)) {
|
|
182
|
+
configItem.filteredDataSource = [];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else if (configItem.type === 'numberRange') {
|
|
186
|
+
if (this.searchText && !Boolean(configItem.numberRange.from || configItem.numberRange.to)) {
|
|
187
|
+
configItem.filteredDataSource = [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
this.showNoFilterResult = this.searchText && filteredItemsCount === 0;
|
|
192
|
+
}
|
|
193
|
+
resetFilters() {
|
|
194
|
+
let selectAll = this.resetBehavior === "set_all";
|
|
195
|
+
for (const item of this.config.items) {
|
|
196
|
+
if (item.dataSource) {
|
|
197
|
+
item.isSelectedAll = selectAll;
|
|
198
|
+
for (const dsItem of item.dataSource) {
|
|
199
|
+
dsItem.checked = selectAll;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (item.dateRange) {
|
|
203
|
+
item.dateRange = { start: null, end: null };
|
|
204
|
+
}
|
|
205
|
+
if (item.numberRange) {
|
|
206
|
+
item.numberRange = { from: null, to: null };
|
|
207
|
+
}
|
|
208
|
+
if (item.date) {
|
|
209
|
+
item.date = new Date();
|
|
210
|
+
}
|
|
211
|
+
if (item.type === 'toggle') {
|
|
212
|
+
item.enabled = false;
|
|
213
|
+
}
|
|
214
|
+
if (item.type === 'radio') {
|
|
215
|
+
item.radioOptions.forEach(e => {
|
|
216
|
+
if (e.id === item.selectedRadio) {
|
|
217
|
+
e.selected = true;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
e.selected = false;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
restorePreviousApplied() {
|
|
227
|
+
for (const item of this.config.items) {
|
|
228
|
+
switch (item.type) {
|
|
229
|
+
case 'multiselect':
|
|
230
|
+
if (item.dataSource) {
|
|
231
|
+
const selection = this.lastAppliedFilter[item.key];
|
|
232
|
+
for (const dataItem of item.dataSource) {
|
|
233
|
+
dataItem.checked = selection ? selection.includes(dataItem.id) : false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case 'dateRange':
|
|
238
|
+
item.dateRange = this.lastAppliedFilter[item.key] || { start: null, end: null };
|
|
239
|
+
break;
|
|
240
|
+
case 'numberRange':
|
|
241
|
+
item.numberRange = this.lastAppliedFilter[item.key] || {};
|
|
242
|
+
break;
|
|
243
|
+
case 'toggle':
|
|
244
|
+
item.dateRange = this.lastAppliedFilter[item.key];
|
|
245
|
+
break;
|
|
246
|
+
case 'date':
|
|
247
|
+
item.date = this.lastAppliedFilter[item.key];
|
|
248
|
+
break;
|
|
249
|
+
case 'radio':
|
|
250
|
+
item.selectedRadio = this.lastAppliedFilter[item.key];
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
reset() {
|
|
256
|
+
this.resetFilters();
|
|
257
|
+
this.filter = this.getFilterObject();
|
|
258
|
+
this.resetedFilter = this.getFilterObject();
|
|
259
|
+
}
|
|
260
|
+
apply() {
|
|
261
|
+
this.filter = this.getFilterObject();
|
|
262
|
+
let hasError = false;
|
|
263
|
+
for (const iterator of this.config.items) {
|
|
264
|
+
const itemFlag = this.onCheckValidity(iterator);
|
|
265
|
+
if (!itemFlag) {
|
|
266
|
+
hasError = true;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (hasError) {
|
|
270
|
+
setTimeout(() => this.errorMessage = [], 5000);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.errorMessage = [];
|
|
275
|
+
}
|
|
276
|
+
this.lastAppliedFilter = Util.clone(this.filter);
|
|
277
|
+
this.filterChange.emit(this.filter);
|
|
278
|
+
// update the apply state
|
|
279
|
+
this.updateAppliedState();
|
|
280
|
+
this.hide();
|
|
281
|
+
}
|
|
282
|
+
updateAppliedState() {
|
|
283
|
+
this.isApplied = false;
|
|
284
|
+
if (Object.keys(this.filter).length > 0) {
|
|
285
|
+
if (this.resetedFilter) {
|
|
286
|
+
// Filter was reset, so compare the reset filter object with the current filter
|
|
287
|
+
// When user click on Reset and Then Apply, filter must unhighlighted
|
|
288
|
+
if (JSON.stringify(this.resetedFilter) !== JSON.stringify(this.filter)) {
|
|
289
|
+
this.isApplied = true;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
this.isApplied = true;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
getFilterObject() {
|
|
298
|
+
const filter = {};
|
|
299
|
+
for (const item of this.config.items) {
|
|
300
|
+
switch (item.type) {
|
|
301
|
+
case 'multiselect':
|
|
302
|
+
if (item.dataSource && item.dataSource.length) {
|
|
303
|
+
const checkedIds = item.dataSource
|
|
304
|
+
.filter(i => i.checked)
|
|
305
|
+
.map(i => i.id);
|
|
306
|
+
if (checkedIds.length) {
|
|
307
|
+
filter[item.key] = checkedIds;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
break;
|
|
311
|
+
case 'dateRange':
|
|
312
|
+
if (item.dateRange &&
|
|
313
|
+
item.dateRange.start &&
|
|
314
|
+
item.dateRange.end) {
|
|
315
|
+
filter[item.key] = item.dateRange;
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
case 'numberRange':
|
|
319
|
+
if (item.numberRange &&
|
|
320
|
+
typeof item?.numberRange?.from === 'number' &&
|
|
321
|
+
typeof item?.numberRange?.to === 'number') {
|
|
322
|
+
filter[item.key] = item.numberRange;
|
|
323
|
+
}
|
|
324
|
+
break;
|
|
325
|
+
case 'toggle':
|
|
326
|
+
filter[item.key] = item.enabled || false;
|
|
327
|
+
break;
|
|
328
|
+
case 'date':
|
|
329
|
+
if (item.date) {
|
|
330
|
+
filter[item.key] = item.date;
|
|
331
|
+
}
|
|
332
|
+
break;
|
|
333
|
+
case 'radio':
|
|
334
|
+
filter[item.key] = item.radioOptions.find(ro => ro.selected)?.id;
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return filter;
|
|
339
|
+
}
|
|
340
|
+
hide() {
|
|
341
|
+
this.isVisible = false;
|
|
342
|
+
this.searchText = '';
|
|
343
|
+
this.filterItems();
|
|
344
|
+
this.isVisibleChange.emit(false);
|
|
345
|
+
}
|
|
346
|
+
radioChanged(value, item) {
|
|
347
|
+
item.radioOptions.forEach(opt => opt.selected = opt.id === value);
|
|
348
|
+
}
|
|
349
|
+
toggle() {
|
|
350
|
+
this.isVisible = !this.isVisible;
|
|
351
|
+
this.updatePlacement();
|
|
352
|
+
this.focusSearchBox();
|
|
353
|
+
}
|
|
354
|
+
onCheckValidity(item) {
|
|
355
|
+
if (item.type === 'numberRange') {
|
|
356
|
+
if (typeof item.numberRange.from === 'number' && typeof item.numberRange.to === 'number' && item.numberRange.from >= item.numberRange.to) {
|
|
357
|
+
this.errorMessage.push(`Invalid Number range, Min number should be less than Max number.`);
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (item.type === 'dateRange') {
|
|
362
|
+
if (item.dateRange.start && item.dateRange.end && new Date(item.dateRange.start) >= new Date(item.dateRange.end)) {
|
|
363
|
+
this.errorMessage.push(`Invalid Date range, Start date should be less than End date.`);
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
updatePlacement() {
|
|
370
|
+
const container = this._componentElement.nativeElement;
|
|
371
|
+
const rect = container.getBoundingClientRect();
|
|
372
|
+
const left = rect.left;
|
|
373
|
+
const right = rect.right;
|
|
374
|
+
const top = rect.top;
|
|
375
|
+
const bottom = window.innerHeight - top;
|
|
376
|
+
//Update left-right position
|
|
377
|
+
if (this.position.includes("auto")) {
|
|
378
|
+
const horizontalPosition = this.getHorizontalPosition();
|
|
379
|
+
this.menuRight = horizontalPosition === "left" ? `${window.innerWidth - right}px` : "unset";
|
|
380
|
+
this.menuLeft = horizontalPosition === "right" ? `${left}px` : "unset";
|
|
381
|
+
}
|
|
382
|
+
else if (this.position.includes("left")) {
|
|
383
|
+
this.menuRight = `${window.innerWidth - right}px`;
|
|
384
|
+
this.menuLeft = "unset";
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
this.menuLeft = `${left}px`;
|
|
388
|
+
this.menuRight = "unset";
|
|
389
|
+
}
|
|
390
|
+
//Update top-bottom position
|
|
391
|
+
if (this.position.includes("auto")) {
|
|
392
|
+
const verticalPosition = this.getVerticalPosition();
|
|
393
|
+
this.menuTop = verticalPosition === "bottom" ? `${top + 42}px` : "unset";
|
|
394
|
+
this.menuBottom = verticalPosition === "top" ? `${bottom}px` : "unset";
|
|
395
|
+
}
|
|
396
|
+
else if (this.position.includes("top")) {
|
|
397
|
+
this.menuTop = "unset";
|
|
398
|
+
this.menuBottom = `${bottom + 10}px`;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
this.menuTop = `${top + 55}px`;
|
|
402
|
+
this.menuBottom = "unset";
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
getVerticalPosition() {
|
|
406
|
+
const top = this._componentElement.nativeElement.getBoundingClientRect().top;
|
|
407
|
+
return top > window.innerHeight / 2 ? "top" : "bottom";
|
|
408
|
+
}
|
|
409
|
+
getHorizontalPosition() {
|
|
410
|
+
const left = this._componentElement.nativeElement.getBoundingClientRect().left;
|
|
411
|
+
return left > window.innerWidth / 2 ? "left" : "right";
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
ZenduFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
415
|
+
ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:wheel": "handleMouseScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n\t #mainComponent\n\t click-out=\"isVisible && hide()\">\n\n\t<ng-container *ngIf=\"!customTrigger\">\n\t\t<button (click)=\"toggle()\"\n\t\t\t\tclass=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n\t\t\t<zen-icon [src]=\"imageUrl\"\n\t\t\t\t\t *ngIf=\"imageUrl\"></zen-icon>\n\t\t\t<i class=\"filter-icon material-icons\"\n\t\t\t *ngIf=\"!imageUrl\">filter_list</i>\n\t\t\t<span *ngIf=\"label\">{{ label }}</span>\n\t\t</button>\n\t</ng-container>\n\n\t<ng-content *ngIf=\"customTrigger\"></ng-content>\n\n\t<div [hidden]=\"!isVisible\"\n\t\t class=\"action-menu menu-content\"\n\t\t [class.customTrigger]=\"customTrigger\"\n\t\t [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n\t\t<div class=\"action-menu-header\">\n\t\t\t<zen-search-box [(text)]=\"searchText\"\n\t\t\t\t\t\t\t#searchBox\n\t\t\t\t\t\t\t(textChange)=\"searchTextChanged()\"></zen-search-box>\n\t\t</div>\n\n\t\t<div class=\"action-menu-body items-wrapper\">\n\t\t\t<ng-container *ngIf=\"errorMessage.length\">\n\t\t\t\t<li *ngFor=\"let item of errorMessage\" class=\"error-msg\">{{item}}</li>\n\t\t\t</ng-container>\n\t\t\t\n\t\t\t<div *ngFor=\"let item of config.items\">\n\t\t\t\t<div class=\"menu-item\"\n\t\t\t\t\t *ngIf=\"isMenuIsVisible(item)\">\n\n\t\t\t\t\t<!-- Divider between two filter -->\n\t\t\t\t\t<div *ngIf=\"item.type === 'divider'\">\n\t\t\t\t\t\t<p class=\"filter-divider\"></p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Boolean toggle -->\n\t\t\t\t\t<div *ngIf=\"item.type === 'toggle'\"\n\t\t\t\t\t\t class=\"action-item toggle-row\">\n\t\t\t\t\t\t<div>{{item.title}}</div>\n\t\t\t\t\t\t<zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button class=\"action-item expander-item\"\n\t\t\t\t\t\t\t*ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n\t\t\t\t\t\t\t(click)=\"item.expanded = !item.expanded\"\n\t\t\t\t\t\t\t[ngClass]=\"{'active': isItemActive(item), 'expanded': item.expanded}\">\n\t\t\t\t\t\t<i class=\"material-icons expand-icon\"\n\t\t\t\t\t\t [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n\t\t\t\t\t\t{{item.title}}\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n\t\t\t\t\t\t<div [ngSwitch]=\"item.type\">\n\t\t\t\t\t\t\t<!-- Multiselect -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'multiselect'\">\n\t\t\t\t\t\t\t\t<div class=\"action-item-checkbox ds-item select-all\">\n\t\t\t\t\t\t\t\t\t<zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n\t\t\t\t\t\t\t\t\t\t\t\t [(checked)]=\"item.isSelectedAll\"\n\t\t\t\t\t\t\t\t\t\t\t\t [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n\t\t\t\t\t\t\t\t\t\t\t\t label=\"Select All\"\n\t\t\t\t\t\t\t\t\t\t\t\t (checkedChange)=\"onSelectAll(item)\">\n\t\t\t\t\t\t\t\t\t</zen-checkbox>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div *ngFor=\"let dsItem of item.filteredDataSource\"\n\t\t\t\t\t\t\t\t\t class=\"action-item-checkbox ds-item\">\n\t\t\t\t\t\t\t\t\t<zen-checkbox [(checked)]=\"dsItem.checked\"\n\t\t\t\t\t\t\t\t\t\t\t\t [imageUrl]=\"dsItem.imageUrl\"\n\t\t\t\t\t\t\t\t\t\t\t\t [label]=\"dsItem.name\"></zen-checkbox>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Date range picker -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'dateRange'\">\n\t\t\t\t\t\t\t\t<div class=\"ds-item filter-row\">\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">From:</div>\n\t\t\t\t\t\t\t\t\t<zen-datepicker class=\"width-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[(date)]=\"item.dateRange.start\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[showTime]=\"item.showTime\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\">\n\t\t\t\t\t\t\t\t\t</zen-datepicker>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"ds-item filter-row\">\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">To:</div>\n\t\t\t\t\t\t\t\t\t<zen-datepicker class=\"width-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[(date)]=\"item.dateRange.end\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[showTime]=\"item.showTime\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\">\n\t\t\t\t\t\t\t\t\t</zen-datepicker>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Date picker -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'date'\">\n\t\t\t\t\t\t\t\t<div class=\"ds-item filter-row\">\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">Date:</div>\n\t\t\t\t\t\t\t\t\t<zen-datepicker class=\"width-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[(date)]=\"item.date\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[showTime]=\"item.showTime\">\n\t\t\t\t\t\t\t\t\t</zen-datepicker>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Number range -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'numberRange'\"\n\t\t\t\t\t\t\t\t class=\"filter-row number-range-row\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">Min:</div>\n\t\t\t\t\t\t\t\t\t<input class=\"material-input\"\n\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"item.numberRange.from\"\n\t\t\t\t\t\t\t\t\t\t type=\"number\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">Max:</div>\n\t\t\t\t\t\t\t\t\t<input class=\"material-input\"\n\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"item.numberRange.to\"\n\t\t\t\t\t\t\t\t\t\t type=\"number\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Radio -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'radio'\">\n\t\t\t\t\t\t\t\t<div *ngFor=\"let option of item.radioOptions\"\n\t\t\t\t\t\t\t\t\t class=\"action-item-radio ds-item\"\n\t\t\t\t\t\t\t\t\t [ngClass]=\"{'active': option.selected}\">\n\t\t\t\t\t\t\t\t\t<zen-radio [value]=\"option.id\"\n\t\t\t\t\t\t\t\t\t\t\t [label]=\"option.name\"\n\t\t\t\t\t\t\t\t\t\t\t [name]=\"item.key\"\n\t\t\t\t\t\t\t\t\t\t\t [imageUrl]=\"option.imageUrl\"\n\t\t\t\t\t\t\t\t\t\t\t [selected]=\"option.selected\"\n\t\t\t\t\t\t\t\t\t\t\t (radioChange)=\"radioChanged($event, item)\"\n\t\t\t\t\t\t\t\t\t\t\t [disabled]=\"option.disabled\"></zen-radio>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ng-container>\n\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<span *ngIf=\"showNoFilterResult\"\n\t\t\t\t class=\"no-item\">No Results Found..</span>\n\t\t</div>\n\n\t\t<div class=\"action-menu-footer\">\n\t\t\t<button (click)=\"reset()\"\n\t\t\t\t\tclass=\"button-stroked full-width\">\n\t\t\t\tReset\n\t\t\t</button>\n\t\t\t<button (click)=\"apply()\"\n\t\t\t\t\tclass=\"button-flat full-width\">\n\t\t\t\tApply\n\t\t\t</button>\n\t\t</div>\n\n\t</div>\n</div>", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%}.filters-component .menu-content .items-wrapper .action-item{color:#828282}.filters-component .menu-content .items-wrapper .action-item.expanded,.filters-component .menu-content .items-wrapper .action-item.active{background:#f4f9fd;color:#4f4f4f}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:48px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 16px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 16px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#60636c;font-size:14px;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showDate", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl"], outputs: ["radioChange"] }, { kind: "component", type: i8.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }] });
|
|
416
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, decorators: [{
|
|
417
|
+
type: Component,
|
|
418
|
+
args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n\t #mainComponent\n\t click-out=\"isVisible && hide()\">\n\n\t<ng-container *ngIf=\"!customTrigger\">\n\t\t<button (click)=\"toggle()\"\n\t\t\t\tclass=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n\t\t\t<zen-icon [src]=\"imageUrl\"\n\t\t\t\t\t *ngIf=\"imageUrl\"></zen-icon>\n\t\t\t<i class=\"filter-icon material-icons\"\n\t\t\t *ngIf=\"!imageUrl\">filter_list</i>\n\t\t\t<span *ngIf=\"label\">{{ label }}</span>\n\t\t</button>\n\t</ng-container>\n\n\t<ng-content *ngIf=\"customTrigger\"></ng-content>\n\n\t<div [hidden]=\"!isVisible\"\n\t\t class=\"action-menu menu-content\"\n\t\t [class.customTrigger]=\"customTrigger\"\n\t\t [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n\t\t<div class=\"action-menu-header\">\n\t\t\t<zen-search-box [(text)]=\"searchText\"\n\t\t\t\t\t\t\t#searchBox\n\t\t\t\t\t\t\t(textChange)=\"searchTextChanged()\"></zen-search-box>\n\t\t</div>\n\n\t\t<div class=\"action-menu-body items-wrapper\">\n\t\t\t<ng-container *ngIf=\"errorMessage.length\">\n\t\t\t\t<li *ngFor=\"let item of errorMessage\" class=\"error-msg\">{{item}}</li>\n\t\t\t</ng-container>\n\t\t\t\n\t\t\t<div *ngFor=\"let item of config.items\">\n\t\t\t\t<div class=\"menu-item\"\n\t\t\t\t\t *ngIf=\"isMenuIsVisible(item)\">\n\n\t\t\t\t\t<!-- Divider between two filter -->\n\t\t\t\t\t<div *ngIf=\"item.type === 'divider'\">\n\t\t\t\t\t\t<p class=\"filter-divider\"></p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Boolean toggle -->\n\t\t\t\t\t<div *ngIf=\"item.type === 'toggle'\"\n\t\t\t\t\t\t class=\"action-item toggle-row\">\n\t\t\t\t\t\t<div>{{item.title}}</div>\n\t\t\t\t\t\t<zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button class=\"action-item expander-item\"\n\t\t\t\t\t\t\t*ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n\t\t\t\t\t\t\t(click)=\"item.expanded = !item.expanded\"\n\t\t\t\t\t\t\t[ngClass]=\"{'active': isItemActive(item), 'expanded': item.expanded}\">\n\t\t\t\t\t\t<i class=\"material-icons expand-icon\"\n\t\t\t\t\t\t [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n\t\t\t\t\t\t{{item.title}}\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n\t\t\t\t\t\t<div [ngSwitch]=\"item.type\">\n\t\t\t\t\t\t\t<!-- Multiselect -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'multiselect'\">\n\t\t\t\t\t\t\t\t<div class=\"action-item-checkbox ds-item select-all\">\n\t\t\t\t\t\t\t\t\t<zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n\t\t\t\t\t\t\t\t\t\t\t\t [(checked)]=\"item.isSelectedAll\"\n\t\t\t\t\t\t\t\t\t\t\t\t [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n\t\t\t\t\t\t\t\t\t\t\t\t label=\"Select All\"\n\t\t\t\t\t\t\t\t\t\t\t\t (checkedChange)=\"onSelectAll(item)\">\n\t\t\t\t\t\t\t\t\t</zen-checkbox>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div *ngFor=\"let dsItem of item.filteredDataSource\"\n\t\t\t\t\t\t\t\t\t class=\"action-item-checkbox ds-item\">\n\t\t\t\t\t\t\t\t\t<zen-checkbox [(checked)]=\"dsItem.checked\"\n\t\t\t\t\t\t\t\t\t\t\t\t [imageUrl]=\"dsItem.imageUrl\"\n\t\t\t\t\t\t\t\t\t\t\t\t [label]=\"dsItem.name\"></zen-checkbox>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Date range picker -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'dateRange'\">\n\t\t\t\t\t\t\t\t<div class=\"ds-item filter-row\">\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">From:</div>\n\t\t\t\t\t\t\t\t\t<zen-datepicker class=\"width-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[(date)]=\"item.dateRange.start\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[showTime]=\"item.showTime\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\">\n\t\t\t\t\t\t\t\t\t</zen-datepicker>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"ds-item filter-row\">\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">To:</div>\n\t\t\t\t\t\t\t\t\t<zen-datepicker class=\"width-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[(date)]=\"item.dateRange.end\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[showTime]=\"item.showTime\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\">\n\t\t\t\t\t\t\t\t\t</zen-datepicker>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Date picker -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'date'\">\n\t\t\t\t\t\t\t\t<div class=\"ds-item filter-row\">\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">Date:</div>\n\t\t\t\t\t\t\t\t\t<zen-datepicker class=\"width-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[(date)]=\"item.date\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[showTime]=\"item.showTime\">\n\t\t\t\t\t\t\t\t\t</zen-datepicker>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Number range -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'numberRange'\"\n\t\t\t\t\t\t\t\t class=\"filter-row number-range-row\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">Min:</div>\n\t\t\t\t\t\t\t\t\t<input class=\"material-input\"\n\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"item.numberRange.from\"\n\t\t\t\t\t\t\t\t\t\t type=\"number\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div class=\"lbl\">Max:</div>\n\t\t\t\t\t\t\t\t\t<input class=\"material-input\"\n\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"item.numberRange.to\"\n\t\t\t\t\t\t\t\t\t\t type=\"number\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Radio -->\n\t\t\t\t\t\t\t<div *ngSwitchCase=\"'radio'\">\n\t\t\t\t\t\t\t\t<div *ngFor=\"let option of item.radioOptions\"\n\t\t\t\t\t\t\t\t\t class=\"action-item-radio ds-item\"\n\t\t\t\t\t\t\t\t\t [ngClass]=\"{'active': option.selected}\">\n\t\t\t\t\t\t\t\t\t<zen-radio [value]=\"option.id\"\n\t\t\t\t\t\t\t\t\t\t\t [label]=\"option.name\"\n\t\t\t\t\t\t\t\t\t\t\t [name]=\"item.key\"\n\t\t\t\t\t\t\t\t\t\t\t [imageUrl]=\"option.imageUrl\"\n\t\t\t\t\t\t\t\t\t\t\t [selected]=\"option.selected\"\n\t\t\t\t\t\t\t\t\t\t\t (radioChange)=\"radioChanged($event, item)\"\n\t\t\t\t\t\t\t\t\t\t\t [disabled]=\"option.disabled\"></zen-radio>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ng-container>\n\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<span *ngIf=\"showNoFilterResult\"\n\t\t\t\t class=\"no-item\">No Results Found..</span>\n\t\t</div>\n\n\t\t<div class=\"action-menu-footer\">\n\t\t\t<button (click)=\"reset()\"\n\t\t\t\t\tclass=\"button-stroked full-width\">\n\t\t\t\tReset\n\t\t\t</button>\n\t\t\t<button (click)=\"apply()\"\n\t\t\t\t\tclass=\"button-flat full-width\">\n\t\t\t\tApply\n\t\t\t</button>\n\t\t</div>\n\n\t</div>\n</div>", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%}.filters-component .menu-content .items-wrapper .action-item{color:#828282}.filters-component .menu-content .items-wrapper .action-item.expanded,.filters-component .menu-content .items-wrapper .action-item.active{background:#f4f9fd;color:#4f4f4f}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:48px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 16px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 16px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#60636c;font-size:14px;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.hidden{display:none}\n"] }]
|
|
419
|
+
}], ctorParameters: function () { return []; }, propDecorators: { config: [{
|
|
420
|
+
type: Input
|
|
421
|
+
}], filter: [{
|
|
422
|
+
type: Input
|
|
423
|
+
}], position: [{
|
|
424
|
+
type: Input
|
|
425
|
+
}], resetBehavior: [{
|
|
426
|
+
type: Input
|
|
427
|
+
}], filterChange: [{
|
|
428
|
+
type: Output
|
|
429
|
+
}], isVisible: [{
|
|
430
|
+
type: Input
|
|
431
|
+
}], isVisibleChange: [{
|
|
432
|
+
type: Output
|
|
433
|
+
}], customTrigger: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], imageUrl: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], label: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], searchBox: [{
|
|
440
|
+
type: ViewChild,
|
|
441
|
+
args: ['searchBox', { static: false }]
|
|
442
|
+
}], _componentElement: [{
|
|
443
|
+
type: ViewChild,
|
|
444
|
+
args: ['mainComponent', { static: false }]
|
|
445
|
+
}], outsideHandling: [{
|
|
446
|
+
type: HostListener,
|
|
447
|
+
args: ['window:mousedown', ['$event']]
|
|
448
|
+
}], windowSizeHandling: [{
|
|
449
|
+
type: HostListener,
|
|
450
|
+
args: ['window:resize', ['$event']]
|
|
451
|
+
}], windowScroll: [{
|
|
452
|
+
type: HostListener,
|
|
453
|
+
args: ['window:scroll', ['$event']]
|
|
454
|
+
}], handleMouseScroll: [{
|
|
455
|
+
type: HostListener,
|
|
456
|
+
args: ['window:wheel', ['$event']]
|
|
457
|
+
}], onWindowKeyDown: [{
|
|
458
|
+
type: HostListener,
|
|
459
|
+
args: ['window:keydown', ['$event']]
|
|
460
|
+
}] } });
|
|
461
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEksT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7QUFPL0QsTUFBTSxPQUFPLG9CQUFvQjtJQWdEaEM7UUE5Q1MsV0FBTSxHQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUl0QyxhQUFRLEdBQUcsT0FBTyxDQUFDO1FBRW5CLGtCQUFhLEdBQXdCLE9BQU8sQ0FBQztRQUU1QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFM0MsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVqQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFL0Msa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFNeEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVoQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUk3QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixlQUFV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QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBdUI1QyxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVV6QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVV6QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1CeEMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbHRlcnNDb25maWcsIEZpbHRlcnNDb25maWdJdGVtIH0gZnJvbSAnLi9maWx0ZXJzQ29uZmlnJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoLnVuaXFieSc7XG5pbXBvcnQgeyBaZW5kdVNlYXJjaEJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1ib3gvemVuZHUtc2VhcmNoLWJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgREFURVBJQ0tFUl9QT1NJVElPTiB9IGZyb20gJy4uL2RhdGVwaWNrZXIvZGF0ZXBpY2tlcic7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ3plbi1maWx0ZXInLFxuXHR0ZW1wbGF0ZVVybDogJy4vemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vemVuZHUtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG5cdEBJbnB1dCgpIGNvbmZpZzogRmlsdGVyc0NvbmZpZyA9IHsgaXRlbXM6IFtdIH07XG5cblx0QElucHV0KCkgZmlsdGVyOiBvYmplY3Q7XG5cblx0QElucHV0KCkgcG9zaXRpb24gPSAncmlnaHQnO1xuXG5cdEBJbnB1dCgpIHJlc2V0QmVoYXZpb3I6IFwic2V0X2FsbFwiIHwgXCJjbGVhclwiID0gJ2NsZWFyJztcblxuXHRAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG5cblx0QElucHV0KCkgaXNWaXNpYmxlID0gZmFsc2U7XG5cblx0QE91dHB1dCgpIGlzVmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuXHRASW5wdXQoKSBjdXN0b21UcmlnZ2VyID0gZmFsc2U7XG5cblx0QElucHV0KCkgaW1hZ2VVcmw6IHN0cmluZztcblxuXHRASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuXG5cdHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cblx0cHVibGljIGlzQXBwbGllZCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgbGFzdEFwcGxpZWRGaWx0ZXI6IGFueSA9IHt9O1xuXG5cdHByaXZhdGUgcmVzZXRlZEZpbHRlcjogYW55O1xuXG5cdHB1YmxpYyBtZW51TGVmdCA9IFwiMHB4XCI7XG5cblx0cHVibGljIG1lbnVSaWdodCA9IFwiMHB4XCI7XG5cblx0cHVibGljIG1lbnVUb3AgPSBcIjBweFwiO1xuXG5cdHB1YmxpYyBtZW51Qm90dG9tID0gXCIwcHhcIjtcblxuXHRwdWJsaWMgc2hvd05vRmlsdGVyUmVzdWx0OiBib29sZWFuO1xuXG5cdHB1YmxpYyBlcnJvck1lc3NhZ2U6IHN0cmluZ1tdID0gW11cblxuXHRwdWJsaWMgZGF0ZXBpY2tlclBvc2l0aW9uID0gREFURVBJQ0tFUl9QT1NJVElPTjtcblxuXHRAVmlld0NoaWxkKCdzZWFyY2hCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoQm94OiBaZW5kdVNlYXJjaEJveENvbXBvbmVudDtcblxuXHRAVmlld0NoaWxkKCdtYWluQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIF9jb21wb25lbnRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuXHRjb25zdHJ1Y3RvcigpIHsgfVxuXG5cdHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcblx0XHRpZiAoY2hhbmdlcy5jb25maWcgJiYgY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlKSB7XG5cblx0XHRcdC8vIGluaXQgdmFsdWVzXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcblx0XHRcdFx0aWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuXHRcdFx0XHRcdGl0ZW0uZGF0YVNvdXJjZSA9IGl0ZW0uZGF0YVNvdXJjZSA/IHRoaXMuZXh0cmFjdFVuaXF1ZURhdGFTb3VyY2UoaXRlbS5kYXRhU291cmNlKSA6IFtdO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScgJiYgIWl0ZW0uZGF0ZVJhbmdlKSB7XG5cdFx0XHRcdFx0aXRlbS5kYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblx0XHRcdFx0fSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScgJiYgIWl0ZW0ubnVtYmVyUmFuZ2UpIHtcblx0XHRcdFx0XHRpdGVtLm51bWJlclJhbmdlID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0uc2hvd1RpbWUgIT09ICdib29sZWFuJykge1xuXHRcdFx0XHRcdGl0ZW0uc2hvd1RpbWUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVySXRlbXMoKTtcblxuXHRcdFx0dGhpcy5yZXNldGVkRmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcblx0XHRcdHRoaXMuZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcblx0XHRcdHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKHRoaXMuZmlsdGVyKTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5maWx0ZXIgJiYgY2hhbmdlcy5maWx0ZXIuY3VycmVudFZhbHVlKSB7XG5cdFx0XHR0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZShjaGFuZ2VzLmZpbHRlci5jdXJyZW50VmFsdWUpO1xuXG5cdFx0XHR0aGlzLnVwZGF0ZUFwcGxpZWRTdGF0ZSgpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmlzVmlzaWJsZSAmJiBjaGFuZ2VzLmlzVmlzaWJsZS5jdXJyZW50VmFsdWUpIHtcblx0XHRcdHRoaXMudXBkYXRlUGxhY2VtZW50KCk7XG5cdFx0XHR0aGlzLmZvY3VzU2VhcmNoQm94KCk7XG5cdFx0fVxuXHR9XG5cdFxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcblx0b3V0c2lkZUhhbmRsaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblx0XHRpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuXHRcdFx0Ly8gZWxlbWVudCBub3QgaW4gdGhlIERPTVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBoaWRlIHRoZSBtZW51IGZvciBvdXRzaWRlIGNsaWNrXG5cdFx0dGhpcy5oaWRlKCk7XG5cblx0XHQvLyByZXN0b3JlIHZhbHVlc1xuXHRcdHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG5cdHdpbmRvd1NpemVIYW5kbGluZygpIHtcblx0XHRpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQbGFjZW1lbnQoKTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuXHR3aW5kb3dTY3JvbGwoKSB7XG5cdFx0aWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUGxhY2VtZW50KCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6d2hlZWwnLCBbJyRldmVudCddKVxuXHRoYW5kbGVNb3VzZVNjcm9sbChldmVudDogV2hlZWxFdmVudCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5pc1Zpc2libGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0aWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRhcmdldCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdidXR0b24tc3Ryb2tlZCcpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5oaWRlKCk7XG5cdFx0dGhpcy5yZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG5cdG9uV2luZG93S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuXHRcdGlmICghdGhpcy5pc1Zpc2libGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldmVudC5rZXkgPT09ICdQYWdlVXAnIHx8IGV2ZW50LmtleSA9PT0gJ1BhZ2VEb3duJyB8fCBldmVudC5rZXkgPT09ICdIb21lJyB8fCBldmVudC5rZXkgPT09ICdFbmQnKSB7XG5cblx0XHRcdGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblx0XHRcdGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0YXJnZXQpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdidXR0b24tc3Ryb2tlZCcpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuaGlkZSgpO1xuXHRcdFx0dGhpcy5yZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvY3VzU2VhcmNoQm94KCkge1xuXHRcdHRoaXMuc2VhcmNoQm94LmRvRm9jdXMoKTtcblx0fVxuXG5cdHB1YmxpYyBpc01lbnVJc1Zpc2libGUoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcblx0XHRpZiAoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgJiYgdGhpcy5zZWFyY2hUZXh0KSB7XG5cdFx0XHRpZiAoIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwcml2YXRlIGV4dHJhY3RVbmlxdWVEYXRhU291cmNlKFxuXHRcdGFycmF5OiB7XG5cdFx0XHRpZDogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdFx0bmFtZTogc3RyaW5nIHwgbnVtYmVyXG5cdFx0fVtdXG5cdCk6IHtcblx0XHRpZDogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdG5hbWU6IHN0cmluZyB8IG51bWJlclxuXHR9W10ge1xuXHRcdGNvbnN0IGl0ZW1zID0gYXJyYXkuZmlsdGVyKGVsID0+IHtcblx0XHRcdHJldHVybiBCb29sZWFuKFxuXHRcdFx0XHR0eXBlb2YgZWwuaWQgPT09ICdudW1iZXInID8gdHlwZW9mIGVsLmlkICE9PSB1bmRlZmluZWQgOiBlbC5pZCAmJlxuXHRcdFx0XHRcdHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJyA/IHR5cGVvZiBlbC5uYW1lICE9PSB1bmRlZmluZWQgOiBlbC5uYW1lXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB1bmlxQnkoaXRlbXMsIChlbCkgPT4gZWwuaWQpO1xuXHR9XG5cblx0cHVibGljIG9uU2VsZWN0QWxsKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG5cdFx0aXRlbS5kYXRhU291cmNlLmZvckVhY2goZCA9PiBkLmNoZWNrZWQgPSBpdGVtLmlzU2VsZWN0ZWRBbGwpO1xuXHR9XG5cblx0cHVibGljIGlzSXRlbUFjdGl2ZShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSk6IGJvb2xlYW4ge1xuXHRcdGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcblx0XHRcdGNvbnN0IGNoZWNrZWRJdGVtcyA9IGl0ZW0uZGF0YVNvdXJjZS5maWx0ZXIoZWwgPT4gZWwuY2hlY2tlZCk7XG5cdFx0XHRpdGVtLmlzU2VsZWN0ZWRBbGwgPSBjaGVja2VkSXRlbXMubGVuZ3RoID09PSBpdGVtLmRhdGFTb3VyY2UubGVuZ3RoXG5cdFx0XHRyZXR1cm4gY2hlY2tlZEl0ZW1zLmxlbmd0aCA+IDA7XG5cdFx0fSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdyYWRpbycpIHtcblx0XHRcdGNvbnN0IHNlbGVjdGVkUmFkaW8gPSBpdGVtLnJhZGlvT3B0aW9ucy5maW5kKHJvID0+IHJvLnNlbGVjdGVkKTtcblx0XHRcdHJldHVybiBzZWxlY3RlZFJhZGlvID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG5cdFx0XHRyZXR1cm4gQm9vbGVhbihpdGVtLm51bWJlclJhbmdlLmZyb20gfHwgaXRlbS5udW1iZXJSYW5nZS50byk7XG5cdFx0fSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG5cdFx0XHRyZXR1cm4gQm9vbGVhbihpdGVtLmRhdGVSYW5nZS5zdGFydCB8fCBpdGVtLmRhdGVSYW5nZS5lbmQpO1xuXHRcdH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZScpIHtcblx0XHRcdHJldHVybiBCb29sZWFuKGl0ZW0uZGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2VhcmNoVGV4dENoYW5nZWQoKSB7XG5cdFx0dGhpcy5maWx0ZXJJdGVtcygpO1xuXHR9XG5cblx0cHVibGljIGZpbHRlckl0ZW1zKCkge1xuXHRcdGxldCBmaWx0ZXJlZEl0ZW1zQ291bnQgPSAwOyAvLyBJbml0aWFsaXplIHdpdGggMFxuXG5cdFx0Zm9yIChjb25zdCBjb25maWdJdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG5cdFx0XHRpZiAoY29uZmlnSXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG5cdFx0XHRcdGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcihlbCA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcHJlcGFyZWROYW1lID0gdHlwZW9mIGVsLm5hbWUgPT09ICdudW1iZXInID8gZWwubmFtZS50b1N0cmluZygpIDogZWwubmFtZTtcblx0XHRcdFx0XHRyZXR1cm4gcHJlcGFyZWROYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRmaWx0ZXJlZEl0ZW1zQ291bnQgKz0gY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoOyAvLyBJbmNyZW1lbnQgdGhlIGNvdW50IGJ5IHRoZSBsZW5ndGggb2YgZmlsdGVyZWREYXRhU291cmNlXG5cdFx0XHR9IGVsc2UgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcblx0XHRcdFx0aWYgKHRoaXMuc2VhcmNoVGV4dCAmJiAhQm9vbGVhbihjb25maWdJdGVtLmRhdGVSYW5nZS5zdGFydCB8fCBjb25maWdJdGVtLmRhdGVSYW5nZS5lbmQpKSB7XG5cdFx0XHRcdFx0Y29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChjb25maWdJdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScpIHtcblx0XHRcdFx0aWYgKHRoaXMuc2VhcmNoVGV4dCAmJiAhQm9vbGVhbihjb25maWdJdGVtLm51bWJlclJhbmdlLmZyb20gfHwgY29uZmlnSXRlbS5udW1iZXJSYW5nZS50bykpIHtcblx0XHRcdFx0XHRjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuc2hvd05vRmlsdGVyUmVzdWx0ID0gdGhpcy5zZWFyY2hUZXh0ICYmIGZpbHRlcmVkSXRlbXNDb3VudCA9PT0gMDtcblxuXHR9XG5cblx0cHJpdmF0ZSByZXNldEZpbHRlcnMoKSB7XG5cdFx0bGV0IHNlbGVjdEFsbCA9IHRoaXMucmVzZXRCZWhhdmlvciA9PT0gXCJzZXRfYWxsXCI7XG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG5cdFx0XHRpZiAoaXRlbS5kYXRhU291cmNlKSB7XG5cdFx0XHRcdGl0ZW0uaXNTZWxlY3RlZEFsbCA9IHNlbGVjdEFsbDtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGRzSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcblx0XHRcdFx0XHRkc0l0ZW0uY2hlY2tlZCA9IHNlbGVjdEFsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbS5kYXRlUmFuZ2UpIHtcblx0XHRcdFx0aXRlbS5kYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW0ubnVtYmVyUmFuZ2UpIHtcblx0XHRcdFx0aXRlbS5udW1iZXJSYW5nZSA9IHsgZnJvbTogbnVsbCwgdG86IG51bGwgfTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW0uZGF0ZSkge1xuXHRcdFx0XHRpdGVtLmRhdGUgPSBuZXcgRGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGl0ZW0udHlwZSA9PT0gJ3RvZ2dsZScpIHtcblx0XHRcdFx0aXRlbS5lbmFibGVkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXRlbS50eXBlID09PSAncmFkaW8nKSB7XG5cdFx0XHRcdGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goZSA9PiB7XG5cdFx0XHRcdFx0aWYgKGUuaWQgPT09IGl0ZW0uc2VsZWN0ZWRSYWRpbykge1xuXHRcdFx0XHRcdFx0ZS5zZWxlY3RlZCA9IHRydWVcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZS5zZWxlY3RlZCA9IGZhbHNlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmVzdG9yZVByZXZpb3VzQXBwbGllZCgpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcblx0XHRcdHN3aXRjaCAoaXRlbS50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ211bHRpc2VsZWN0Jzpcblx0XHRcdFx0XHRpZiAoaXRlbS5kYXRhU291cmNlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBkYXRhSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcblx0XHRcdFx0XHRcdFx0ZGF0YUl0ZW0uY2hlY2tlZCA9IHNlbGVjdGlvbiA/IHNlbGVjdGlvbi5pbmNsdWRlcyhkYXRhSXRlbS5pZCkgOiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RhdGVSYW5nZSc6XG5cdFx0XHRcdFx0aXRlbS5kYXRlUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbnVtYmVyUmFuZ2UnOlxuXHRcdFx0XHRcdGl0ZW0ubnVtYmVyUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7fTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndG9nZ2xlJzpcblx0XHRcdFx0XHRpdGVtLmRhdGVSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdFx0XHRpdGVtLmRhdGUgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncmFkaW8nOlxuXHRcdFx0XHRcdGl0ZW0uc2VsZWN0ZWRSYWRpbyA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyByZXNldCgpIHtcblx0XHR0aGlzLnJlc2V0RmlsdGVycygpO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuXHRcdHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG5cdH1cblxuXHRwdWJsaWMgYXBwbHkoKSB7XG5cdFx0dGhpcy5maWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuXHRcdGxldCBoYXNFcnJvciA9IGZhbHNlO1xuXHRcdGZvciAoY29uc3QgaXRlcmF0b3Igb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1GbGFnID0gdGhpcy5vbkNoZWNrVmFsaWRpdHkoaXRlcmF0b3IpO1xuXHRcdFx0aWYgKCFpdGVtRmxhZykge1xuXHRcdFx0XHRoYXNFcnJvciA9IHRydWVcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGhhc0Vycm9yKSB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXJyb3JNZXNzYWdlID0gW10sIDUwMDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVycm9yTWVzc2FnZSA9IFtdO1xuXHRcdH1cblx0XHR0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZSh0aGlzLmZpbHRlcik7XG5cblx0XHR0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyKTtcblxuXHRcdC8vIHVwZGF0ZSB0aGUgYXBwbHkgc3RhdGVcblx0XHR0aGlzLnVwZGF0ZUFwcGxpZWRTdGF0ZSgpO1xuXG5cdFx0dGhpcy5oaWRlKCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZUFwcGxpZWRTdGF0ZSgpIHtcblx0XHR0aGlzLmlzQXBwbGllZCA9IGZhbHNlO1xuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHRoaXMucmVzZXRlZEZpbHRlcikge1xuXHRcdFx0XHQvLyBGaWx0ZXIgd2FzIHJlc2V0LCBzbyBjb21wYXJlIHRoZSByZXNldCBmaWx0ZXIgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgZmlsdGVyXG5cdFx0XHRcdC8vIFdoZW4gdXNlciBjbGljayBvbiBSZXNldCBhbmQgVGhlbiBBcHBseSwgZmlsdGVyIG11c3QgdW5oaWdobGlnaHRlZFxuXHRcdFx0XHRpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5yZXNldGVkRmlsdGVyKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXIpKSB7XG5cdFx0XHRcdFx0dGhpcy5pc0FwcGxpZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmlzQXBwbGllZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRGaWx0ZXJPYmplY3QoKSB7XG5cdFx0Y29uc3QgZmlsdGVyID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcblx0XHRcdHN3aXRjaCAoaXRlbS50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ211bHRpc2VsZWN0Jzpcblx0XHRcdFx0XHRpZiAoaXRlbS5kYXRhU291cmNlICYmIGl0ZW0uZGF0YVNvdXJjZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2Vcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihpID0+IGkuY2hlY2tlZClcblx0XHRcdFx0XHRcdFx0Lm1hcChpID0+IGkuaWQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoY2hlY2tlZElkcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0ZmlsdGVyW2l0ZW0ua2V5XSA9IGNoZWNrZWRJZHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkYXRlUmFuZ2UnOlxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGl0ZW0uZGF0ZVJhbmdlICYmXG5cdFx0XHRcdFx0XHRpdGVtLmRhdGVSYW5nZS5zdGFydCAmJlxuXHRcdFx0XHRcdFx0aXRlbS5kYXRlUmFuZ2UuZW5kXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlUmFuZ2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdudW1iZXJSYW5nZSc6XG5cdFx0XHRcdFx0aWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy5mcm9tID09PSAnbnVtYmVyJyAmJlxuXHRcdFx0XHRcdFx0dHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy50byA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5udW1iZXJSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd0b2dnbGUnOlxuXHRcdFx0XHRcdGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmVuYWJsZWQgfHwgZmFsc2U7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRcdGlmIChpdGVtLmRhdGUpIHtcblx0XHRcdFx0XHRcdGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyYWRpbyc6XG5cdFx0XHRcdFx0ZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ucmFkaW9PcHRpb25zLmZpbmQocm8gPT4gcm8uc2VsZWN0ZWQpPy5pZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmlsdGVyO1xuXHR9XG5cblx0cHVibGljIGhpZGUoKSB7XG5cdFx0dGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcblx0XHR0aGlzLnNlYXJjaFRleHQgPSAnJztcblx0XHR0aGlzLmZpbHRlckl0ZW1zKCk7XG5cblx0XHR0aGlzLmlzVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcblx0fVxuXG5cdHB1YmxpYyByYWRpb0NoYW5nZWQodmFsdWU6IHN0cmluZywgaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcblx0XHRpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKG9wdCA9PiBvcHQuc2VsZWN0ZWQgPSBvcHQuaWQgPT09IHZhbHVlKTtcblx0fVxuXG5cdHB1YmxpYyB0b2dnbGUoKSB7XG5cdFx0dGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XG5cdFx0dGhpcy51cGRhdGVQbGFjZW1lbnQoKTtcblx0XHR0aGlzLmZvY3VzU2VhcmNoQm94KClcblx0fVxuXG5cdHB1YmxpYyBvbkNoZWNrVmFsaWRpdHkoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcblx0XHRpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG5cdFx0XHRpZiAodHlwZW9mIGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGl0ZW0ubnVtYmVyUmFuZ2UudG8gPT09ICdudW1iZXInICYmIGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSA+PSBpdGVtLm51bWJlclJhbmdlLnRvKSB7XG5cdFx0XHRcdHRoaXMuZXJyb3JNZXNzYWdlLnB1c2goYEludmFsaWQgTnVtYmVyIHJhbmdlLCBNaW4gbnVtYmVyIHNob3VsZCBiZSBsZXNzIHRoYW4gTWF4IG51bWJlci5gKTsgXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcblx0XHRcdGlmIChpdGVtLmRhdGVSYW5nZS5zdGFydCAmJiBpdGVtLmRhdGVSYW5nZS5lbmQgJiYgbmV3IERhdGUoaXRlbS5kYXRlUmFuZ2Uuc3RhcnQpID49IG5ldyBEYXRlKGl0ZW0uZGF0ZVJhbmdlLmVuZCkpIHtcblx0XHRcdFx0dGhpcy5lcnJvck1lc3NhZ2UucHVzaChgSW52YWxpZCBEYXRlIHJhbmdlLCBTdGFydCBkYXRlIHNob3VsZCBiZSBsZXNzIHRoYW4gRW5kIGRhdGUuYCk7IFxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlXG5cdH1cblxuXG5cdHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQoKSB7XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXHRcdGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgbGVmdCA9IHJlY3QubGVmdDtcblx0XHRjb25zdCByaWdodCA9IHJlY3QucmlnaHQ7XG5cdFx0Y29uc3QgdG9wID0gcmVjdC50b3A7XG5cdFx0Y29uc3QgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wO1xuXG5cdFx0Ly9VcGRhdGUgbGVmdC1yaWdodCBwb3NpdGlvbiBcblx0XHRpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcyhcImF1dG9cIikpIHtcblx0XHRcdGNvbnN0IGhvcml6b250YWxQb3NpdGlvbiA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG5cdFx0XHR0aGlzLm1lbnVSaWdodCA9IGhvcml6b250YWxQb3NpdGlvbiA9PT0gXCJsZWZ0XCIgPyBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJpZ2h0fXB4YCA6IFwidW5zZXRcIjtcblx0XHRcdHRoaXMubWVudUxlZnQgPSBob3Jpem9udGFsUG9zaXRpb24gPT09IFwicmlnaHRcIiA/IGAke2xlZnR9cHhgIDogXCJ1bnNldFwiO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcyhcImxlZnRcIikpIHtcblx0XHRcdHRoaXMubWVudVJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGA7XG5cdFx0XHR0aGlzLm1lbnVMZWZ0ID0gXCJ1bnNldFwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1lbnVMZWZ0ID0gYCR7bGVmdH1weGA7XG5cdFx0XHR0aGlzLm1lbnVSaWdodCA9IFwidW5zZXRcIjtcblx0XHR9XG5cblx0XHQvL1VwZGF0ZSB0b3AtYm90dG9tIHBvc2l0aW9uIFxuXHRcdGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKFwiYXV0b1wiKSkge1xuXHRcdFx0Y29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuXHRcdFx0dGhpcy5tZW51VG9wID0gdmVydGljYWxQb3NpdGlvbiA9PT0gXCJib3R0b21cIiA/IGAke3RvcCArIDQyfXB4YCA6IFwidW5zZXRcIjtcblx0XHRcdHRoaXMubWVudUJvdHRvbSA9IHZlcnRpY2FsUG9zaXRpb24gPT09IFwidG9wXCIgPyBgJHtib3R0b219cHhgIDogXCJ1bnNldFwiO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcyhcInRvcFwiKSkge1xuXHRcdFx0dGhpcy5tZW51VG9wID0gXCJ1bnNldFwiO1xuXHRcdFx0dGhpcy5tZW51Qm90dG9tID0gYCR7Ym90dG9tICsgMTB9cHhgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1lbnVUb3AgPSBgJHt0b3AgKyA1NX1weGA7XG5cdFx0XHR0aGlzLm1lbnVCb3R0b20gPSBcInVuc2V0XCI7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRWZXJ0aWNhbFBvc2l0aW9uKCk6IFwiYm90dG9tXCIgfCBcInRvcFwiIHtcblx0XHRjb25zdCB0b3AgPSB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXHRcdHJldHVybiB0b3AgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyID8gXCJ0b3BcIiA6IFwiYm90dG9tXCI7XG5cdH1cblxuXHRwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbigpOiBcInJpZ2h0XCIgfCBcImxlZnRcIiB7XG5cdFx0Y29uc3QgbGVmdCA9IHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdHJldHVybiBsZWZ0ID4gd2luZG93LmlubmVyV2lkdGggLyAyID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXJzLWNvbXBvbmVudFwiXG5cdCAjbWFpbkNvbXBvbmVudFxuXHQgY2xpY2stb3V0PVwiaXNWaXNpYmxlICYmIGhpZGUoKVwiPlxuXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVHJpZ2dlclwiPlxuXHRcdDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCJcblx0XHRcdFx0Y2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmaWx0ZXIge3tpc0FwcGxpZWQgPyAnYXBwbGllZCcgOiAnJ319XCI+XG5cdFx0XHQ8emVuLWljb24gW3NyY109XCJpbWFnZVVybFwiXG5cdFx0XHRcdFx0ICAqbmdJZj1cImltYWdlVXJsXCI+PC96ZW4taWNvbj5cblx0XHRcdDxpIGNsYXNzPVwiZmlsdGVyLWljb24gbWF0ZXJpYWwtaWNvbnNcIlxuXHRcdFx0ICAgKm5nSWY9XCIhaW1hZ2VVcmxcIj5maWx0ZXJfbGlzdDwvaT5cblx0XHRcdDxzcGFuICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB9fTwvc3Bhbj5cblx0XHQ8L2J1dHRvbj5cblx0PC9uZy1jb250YWluZXI+XG5cblx0PG5nLWNvbnRlbnQgKm5nSWY9XCJjdXN0b21UcmlnZ2VyXCI+PC9uZy1jb250ZW50PlxuXG5cdDxkaXYgW2hpZGRlbl09XCIhaXNWaXNpYmxlXCJcblx0XHQgY2xhc3M9XCJhY3Rpb24tbWVudSBtZW51LWNvbnRlbnRcIlxuXHRcdCBbY2xhc3MuY3VzdG9tVHJpZ2dlcl09XCJjdXN0b21UcmlnZ2VyXCJcblx0XHQgW25nU3R5bGVdPVwieyAnbGVmdCc6IG1lbnVMZWZ0LCAncmlnaHQnOiBtZW51UmlnaHQsICd0b3AnOiBtZW51VG9wLCAnYm90dG9tJzogbWVudUJvdHRvbSAgfVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudS1oZWFkZXJcIj5cblx0XHRcdDx6ZW4tc2VhcmNoLWJveCBbKHRleHQpXT1cInNlYXJjaFRleHRcIlxuXHRcdFx0XHRcdFx0XHQjc2VhcmNoQm94XG5cdFx0XHRcdFx0XHRcdCh0ZXh0Q2hhbmdlKT1cInNlYXJjaFRleHRDaGFuZ2VkKClcIj48L3plbi1zZWFyY2gtYm94PlxuXHRcdDwvZGl2PlxuXG5cdFx0PGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWJvZHkgaXRlbXMtd3JhcHBlclwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImVycm9yTWVzc2FnZS5sZW5ndGhcIj5cblx0XHRcdFx0PGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZXJyb3ItbXNnXCI+e3tpdGVtfX08L2xpPlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcblx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29uZmlnLml0ZW1zXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtZW51LWl0ZW1cIlxuXHRcdFx0XHRcdCAqbmdJZj1cImlzTWVudUlzVmlzaWJsZShpdGVtKVwiPlxuXG5cdFx0XHRcdFx0PCEtLSBEaXZpZGVyIGJldHdlZW4gdHdvIGZpbHRlciAtLT5cblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGl2aWRlcidcIj5cblx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiZmlsdGVyLWRpdmlkZXJcIj48L3A+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8IS0tIEJvb2xlYW4gdG9nZ2xlIC0tPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICd0b2dnbGUnXCJcblx0XHRcdFx0XHRcdCBjbGFzcz1cImFjdGlvbi1pdGVtIHRvZ2dsZS1yb3dcIj5cblx0XHRcdFx0XHRcdDxkaXY+e3tpdGVtLnRpdGxlfX08L2Rpdj5cblx0XHRcdFx0XHRcdDx6ZW4tdG9nZ2xlLXNsaWRlIFsoZW5hYmxlZCldPVwiaXRlbS5lbmFibGVkXCI+PC96ZW4tdG9nZ2xlLXNsaWRlPlxuXHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1pdGVtIGV4cGFuZGVyLWl0ZW1cIlxuXHRcdFx0XHRcdFx0XHQqbmdJZj1cIml0ZW0udHlwZSAhPSAndG9nZ2xlJyAmJiBpdGVtLnR5cGUgIT0gJ2RpdmlkZXInICYmICFpdGVtLmRpc2FibGVDb2xsYXBzZVwiXG5cdFx0XHRcdFx0XHRcdChjbGljayk9XCJpdGVtLmV4cGFuZGVkID0gIWl0ZW0uZXhwYW5kZWRcIlxuXHRcdFx0XHRcdFx0XHRbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGlzSXRlbUFjdGl2ZShpdGVtKSwgJ2V4cGFuZGVkJzogaXRlbS5leHBhbmRlZH1cIj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgZXhwYW5kLWljb25cIlxuXHRcdFx0XHRcdFx0ICAgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpdGVtLmV4cGFuZGVkfVwiPmV4cGFuZF9tb3JlPC9pPlxuXHRcdFx0XHRcdFx0e3tpdGVtLnRpdGxlfX1cblx0XHRcdFx0XHQ8L2J1dHRvbj5cblxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkIHx8IGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IFtuZ1N3aXRjaF09XCJpdGVtLnR5cGVcIj5cblx0XHRcdFx0XHRcdFx0PCEtLSBNdWx0aXNlbGVjdCAtLT5cblx0XHRcdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpc2VsZWN0J1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtIHNlbGVjdC1hbGxcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDx6ZW4tY2hlY2tib3ggKm5nSWY9XCJpdGVtLmRhdGFTb3VyY2UubGVuZ3RoID09PSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGhcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBbKGNoZWNrZWQpXT1cIml0ZW0uaXNTZWxlY3RlZEFsbFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFtpbmRldGVybWluYXRlXT1cImlzSXRlbUFjdGl2ZShpdGVtKSAmJiAhaXRlbS5pc1NlbGVjdGVkQWxsXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgbGFiZWw9XCJTZWxlY3QgQWxsXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgKGNoZWNrZWRDaGFuZ2UpPVwib25TZWxlY3RBbGwoaXRlbSlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvemVuLWNoZWNrYm94PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgZHNJdGVtIG9mIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlXCJcblx0XHRcdFx0XHRcdFx0XHRcdCBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFtpbWFnZVVybF09XCJkc0l0ZW0uaW1hZ2VVcmxcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBbbGFiZWxdPVwiZHNJdGVtLm5hbWVcIj48L3plbi1jaGVja2JveD5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0PCEtLSBEYXRlIHJhbmdlIHBpY2tlciAtLT5cblx0XHRcdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVSYW5nZSdcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibGJsXCI+RnJvbTo8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLnN0YXJ0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0W3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvemVuLWRhdGVwaWNrZXI+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxibFwiPlRvOjwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0W3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvemVuLWRhdGVwaWNrZXI+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdDwhLS0gRGF0ZSBwaWNrZXIgLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJsYmxcIj5EYXRlOjwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFsoZGF0ZSldPVwiaXRlbS5kYXRlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0W3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvemVuLWRhdGVwaWNrZXI+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdDwhLS0gTnVtYmVyIHJhbmdlIC0tPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyUmFuZ2UnXCJcblx0XHRcdFx0XHRcdFx0XHQgY2xhc3M9XCJmaWx0ZXItcm93IG51bWJlci1yYW5nZS1yb3dcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxibFwiPk1pbjo8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLmZyb21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgICB0eXBlPVwibnVtYmVyXCIgLz5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxibFwiPk1heDo8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLnRvXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgdHlwZT1cIm51bWJlclwiIC8+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdDwhLS0gUmFkaW8gLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5yYWRpb09wdGlvbnNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBvcHRpb24uc2VsZWN0ZWR9XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8emVuLXJhZGlvIFt2YWx1ZV09XCJvcHRpb24uaWRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIFtsYWJlbF09XCJvcHRpb24ubmFtZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIFtpbWFnZVVybF09XCJvcHRpb24uaW1hZ2VVcmxcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIFtzZWxlY3RlZF09XCJvcHRpb24uc2VsZWN0ZWRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIChyYWRpb0NoYW5nZSk9XCJyYWRpb0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiPjwvemVuLXJhZGlvPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8c3BhbiAqbmdJZj1cInNob3dOb0ZpbHRlclJlc3VsdFwiXG5cdFx0XHRcdCAgY2xhc3M9XCJuby1pdGVtXCI+Tm8gUmVzdWx0cyBGb3VuZC4uPC9zcGFuPlxuXHRcdDwvZGl2PlxuXG5cdFx0PGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWZvb3RlclwiPlxuXHRcdFx0PGJ1dHRvbiAoY2xpY2spPVwicmVzZXQoKVwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmdWxsLXdpZHRoXCI+XG5cdFx0XHRcdFJlc2V0XG5cdFx0XHQ8L2J1dHRvbj5cblx0XHRcdDxidXR0b24gKGNsaWNrKT1cImFwcGx5KClcIlxuXHRcdFx0XHRcdGNsYXNzPVwiYnV0dG9uLWZsYXQgZnVsbC13aWR0aFwiPlxuXHRcdFx0XHRBcHBseVxuXHRcdFx0PC9idXR0b24+XG5cdFx0PC9kaXY+XG5cblx0PC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ZenduIconComponent {
|
|
4
|
+
constructor(_host) {
|
|
5
|
+
this._host = _host;
|
|
6
|
+
}
|
|
7
|
+
ngOnChanges(changes) {
|
|
8
|
+
if (this.src) {
|
|
9
|
+
// apply styles to host
|
|
10
|
+
const host = this._host.nativeElement;
|
|
11
|
+
host.style["mask-image"] = `url(${this.src})`;
|
|
12
|
+
host.style["-webkit-mask-image"] = `url(${this.src})`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
ZenduIconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduIconComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
17
|
+
ZenduIconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduIconComponent, selector: "zen-icon", inputs: { src: "src" }, usesOnChanges: true, ngImport: i0, template: "", styles: [":host{background-color:#000;width:24px;height:24px;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;display:block}\n"] });
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduIconComponent, decorators: [{
|
|
19
|
+
type: Component,
|
|
20
|
+
args: [{ selector: 'zen-icon', template: "", styles: [":host{background-color:#000;width:24px;height:24px;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;display:block}\n"] }]
|
|
21
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { src: [{
|
|
22
|
+
type: Input
|
|
23
|
+
}] } });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy16ZW5kdWl0L3NyYy9saWIvaWNvbi96ZW5kdS1pY29uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9pY29uL3plbmR1LWljb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBNEIsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7QUFPN0csTUFBTSxPQUFPLGtCQUFrQjtJQUk3QixZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO0lBQUksQ0FBQztJQUVuQyxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1osdUJBQXVCO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBNEIsQ0FBQztZQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUN2RDtJQUNILENBQUM7O2dIQWJVLGtCQUFrQjtvR0FBbEIsa0JBQWtCLDZGQ1AvQixFQUFBOzRGRE9hLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxVQUFVO2lHQU1YLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnemVuLWljb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtaWNvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3plbmR1LWljb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdUljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHNyYzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hvc3Q6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3JjKSB7XG4gICAgICAvLyBhcHBseSBzdHlsZXMgdG8gaG9zdFxuICAgICAgY29uc3QgaG9zdCA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGhvc3Quc3R5bGVbXCJtYXNrLWltYWdlXCJdID0gYHVybCgke3RoaXMuc3JjfSlgO1xuICAgICAgaG9zdC5zdHlsZVtcIi13ZWJraXQtbWFzay1pbWFnZVwiXSA9IGB1cmwoJHt0aGlzLnNyY30pYDtcbiAgICB9XG4gIH1cbn1cbiIsIiJdfQ==
|