@sarasanalytics-com/design-system 0.0.148 → 0.0.150
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 -24
- package/esm2022/interfaces/avatar-interface.mjs +1 -1
- package/esm2022/interfaces/button-interface.mjs +1 -1
- package/esm2022/interfaces/card-carousel-interface.mjs +1 -1
- package/esm2022/interfaces/chip-interface.mjs +1 -1
- package/esm2022/interfaces/form-layout.interface.mjs +1 -1
- package/esm2022/interfaces/grid-interface.mjs +1 -1
- package/esm2022/interfaces/guide-card-interface.mjs +1 -1
- package/esm2022/interfaces/header-interface.mjs +1 -1
- package/esm2022/interfaces/icon-interface.mjs +1 -1
- package/esm2022/interfaces/layout-section-interface.mjs +1 -1
- package/esm2022/interfaces/left-nav-interface.mjs +1 -1
- package/esm2022/interfaces/menu.interface.mjs +1 -1
- package/esm2022/interfaces/message-banner.mjs +1 -1
- package/esm2022/interfaces/option-interface.mjs +1 -1
- package/esm2022/interfaces/scrolling-card-interface.mjs +1 -1
- package/esm2022/interfaces/select-interface.mjs +1 -1
- package/esm2022/interfaces/status-dot.interface.mjs +1 -1
- package/esm2022/interfaces/tab-interface.mjs +1 -1
- package/esm2022/interfaces/toast-interface.mjs +1 -1
- package/esm2022/interfaces/typography-animation-interface.mjs +1 -1
- package/esm2022/lib/accordion/accordion.component.mjs +3 -3
- package/esm2022/lib/avatar/avatar.component.mjs +3 -3
- package/esm2022/lib/button/button.component.mjs +3 -3
- package/esm2022/lib/calendar-header/calendar-header.component.mjs +3 -3
- package/esm2022/lib/card/card-body/card-body.component.mjs +1 -1
- package/esm2022/lib/card/card-custom-header/card-custom-header.component.mjs +1 -1
- package/esm2022/lib/card/card-footer-actions/card-footer-actions.component.mjs +3 -3
- package/esm2022/lib/card/card-icon/card-icon.component.mjs +1 -1
- package/esm2022/lib/card/card-title-actions/card-title-actions.component.mjs +1 -1
- package/esm2022/lib/card/card.component.mjs +3 -3
- package/esm2022/lib/card/checkbox-card/checkbox-card.component.mjs +3 -3
- package/esm2022/lib/card/guide-card/guide-card.component.mjs +3 -3
- package/esm2022/lib/card/menu-card/menu-card.component.mjs +3 -3
- package/esm2022/lib/card/thumbnail-card/thumbnail-card.component.mjs +3 -3
- package/esm2022/lib/card-carousel/card-carousel.component.mjs +3 -3
- package/esm2022/lib/categories-nav/categories-nav.component.mjs +3 -3
- package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/chips/chips.component.mjs +3 -3
- package/esm2022/lib/component-library.component.mjs +9 -9
- package/esm2022/lib/component-library.service.mjs +1 -1
- package/esm2022/lib/dashboard-loader/dashboard-loader.component.mjs +1 -1
- package/esm2022/lib/data-grid/data-grid.component.mjs +3 -3
- package/esm2022/lib/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog.component.mjs +3 -3
- package/esm2022/lib/dropdown/category-dropdown/category-dropdown.component.mjs +241 -0
- package/esm2022/lib/dropdown/ng-select/ng-select.component.mjs +111 -0
- package/esm2022/lib/filter/filter.component.mjs +3 -3
- package/esm2022/lib/form-input/form-input.component.mjs +4 -5
- package/esm2022/lib/form-select/form-select.component.mjs +3 -3
- package/esm2022/lib/grid-cell/grid-cell.component.mjs +10 -10
- package/esm2022/lib/header/header.component.mjs +3 -3
- package/esm2022/lib/icon/icon.component.mjs +3 -3
- package/esm2022/lib/icon/icon.service.mjs +1 -1
- package/esm2022/lib/layout-section/layout-section.component.mjs +3 -3
- package/esm2022/lib/left-nav/left-nav.component.mjs +3 -3
- package/esm2022/lib/list/list.component.mjs +3 -3
- package/esm2022/lib/menu/menu-list/menu-item.component.mjs +3 -3
- package/esm2022/lib/menu/menu.component.mjs +3 -3
- package/esm2022/lib/menu/menu.directive.mjs +1 -1
- package/esm2022/lib/message-banner/message-banner.component.mjs +3 -3
- package/esm2022/lib/message-banner-v2/message-banner-v2.component.mjs +3 -3
- package/esm2022/lib/mini-card/mini-card.component.mjs +3 -3
- package/esm2022/lib/page-layout/page-layout.component.mjs +3 -3
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder-demo.component.mjs +45 -45
- package/esm2022/lib/query-builder/query-builder.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder.service.mjs +1 -1
- package/esm2022/lib/query-builder-formly/query-builder-formly.component.mjs +191 -0
- package/esm2022/lib/query-builder-textarea/query-builder-textarea-demo.component.mjs +39 -39
- package/esm2022/lib/query-builder-textarea/query-builder-textarea.component.mjs +3 -3
- package/esm2022/lib/radio-button/radio-button.component.mjs +3 -3
- package/esm2022/lib/scrolling-cards/scrolling-cards.component.mjs +3 -3
- package/esm2022/lib/skeleton/skeleton-base.component.mjs +1 -1
- package/esm2022/lib/skeleton/skeleton-container.component.mjs +9 -9
- package/esm2022/lib/skeleton/skeleton-loader.component.mjs +193 -193
- package/esm2022/lib/skeleton/skeleton-presets.mjs +1 -1
- package/esm2022/lib/skeleton/skeleton-shapes.component.mjs +1 -1
- package/esm2022/lib/spinner/spinner.component.mjs +1 -1
- package/esm2022/lib/status-dot/status-dot.component.mjs +17 -17
- package/esm2022/lib/stepper/stepper.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs.component.mjs +3 -3
- package/esm2022/lib/toast/toast.component.mjs +3 -3
- package/esm2022/lib/tool-tip/tool-tip.component.mjs +3 -3
- package/esm2022/lib/typography-animation/typography-animation.component.mjs +3 -3
- package/esm2022/public-api.mjs +4 -1
- package/esm2022/utils/validators.mjs +1 -1
- package/fesm2022/sarasanalytics-com-design-system.mjs +892 -411
- package/fesm2022/sarasanalytics-com-design-system.mjs.map +1 -1
- package/lib/dropdown/category-dropdown/category-dropdown.component.d.ts +40 -0
- package/lib/dropdown/ng-select/ng-select.component.d.ts +20 -0
- package/lib/query-builder-formly/query-builder-formly.component.d.ts +81 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
- package/styles/styles.css +432 -460
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { Component, computed, effect, ElementRef, HostListener, inject, signal, ViewChild } from '@angular/core';
|
|
2
|
+
import { isObservable, Subject, Subscription } from 'rxjs';
|
|
3
|
+
import { takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
6
|
+
import { FormlyModule } from '@ngx-formly/core';
|
|
7
|
+
import { FieldType } from '@ngx-formly/core';
|
|
8
|
+
import { IconComponent } from '../../icon/icon.component';
|
|
9
|
+
import { IconService } from '../../icon/icon.service';
|
|
10
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
11
|
+
import { MatInputModule } from '@angular/material/input';
|
|
12
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
13
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
14
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
15
|
+
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
16
|
+
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
17
|
+
import { MatNativeDateModule } from '@angular/material/core';
|
|
18
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
19
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
20
|
+
import { first as _first } from 'lodash';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@angular/material/form-field";
|
|
23
|
+
import * as i2 from "@angular/material/input";
|
|
24
|
+
import * as i3 from "@angular/material/tooltip";
|
|
25
|
+
export class CategoryDropdownComponent extends FieldType {
|
|
26
|
+
get bindLabel() { return this.props['bindLabel'] || 'label'; }
|
|
27
|
+
get bindValue() { return this.props['bindValue'] || 'value'; }
|
|
28
|
+
get bindAttributes() { return this.props['bindAttributes'] || 'attributes'; }
|
|
29
|
+
constructor(cdr, renderer) {
|
|
30
|
+
super();
|
|
31
|
+
this.cdr = cdr;
|
|
32
|
+
this.renderer = renderer;
|
|
33
|
+
this._categories = signal([]);
|
|
34
|
+
this.destroy$ = new Subject();
|
|
35
|
+
this.subscription = new Subscription();
|
|
36
|
+
this.selectedCategory = signal(undefined);
|
|
37
|
+
this.selectedAttributes = signal([]);
|
|
38
|
+
this.searchTerm = signal('');
|
|
39
|
+
this.isOpen = signal(false);
|
|
40
|
+
this.userSelectedCategory = signal(undefined); // To hold the user's explicit selection
|
|
41
|
+
this.el = inject(ElementRef);
|
|
42
|
+
this.filteredAttributes = computed(() => {
|
|
43
|
+
const category = this.selectedCategory();
|
|
44
|
+
const term = this.searchTerm().toLowerCase();
|
|
45
|
+
if (!category) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return (category[this.bindAttributes] || []).filter((val) => (val[this.bindLabel] || '').toLowerCase().includes(term));
|
|
49
|
+
});
|
|
50
|
+
this.filteredCategories = computed(() => {
|
|
51
|
+
const term = this.searchTerm().toLowerCase();
|
|
52
|
+
const categories = this._categories();
|
|
53
|
+
if (!term) {
|
|
54
|
+
return categories;
|
|
55
|
+
}
|
|
56
|
+
return categories.filter(category => (category[this.bindAttributes] || []).some((val) => (val[this.bindLabel] || '').toLowerCase().includes(term)));
|
|
57
|
+
});
|
|
58
|
+
effect(() => {
|
|
59
|
+
const filtered = this.filteredCategories();
|
|
60
|
+
const term = this.searchTerm();
|
|
61
|
+
if (term && filtered.length > 0) {
|
|
62
|
+
this.selectedCategory.set(_first(filtered));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// If attributes exist, stick with their category
|
|
66
|
+
const attrCategory = this.getSelectedAttributesCategory();
|
|
67
|
+
if (attrCategory) {
|
|
68
|
+
this.selectedCategory.set(attrCategory);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Else fallback to user-selected or first
|
|
72
|
+
if (this.userSelectedCategory()) {
|
|
73
|
+
this.selectedCategory.set(this.userSelectedCategory());
|
|
74
|
+
}
|
|
75
|
+
else if (this._categories().length > 0) {
|
|
76
|
+
this.selectedCategory.set(_first(this._categories()));
|
|
77
|
+
}
|
|
78
|
+
}, { allowSignalWrites: true });
|
|
79
|
+
}
|
|
80
|
+
ngOnInit() {
|
|
81
|
+
if (this.props?.['multiple']) {
|
|
82
|
+
const initialValue = this.formControl.value;
|
|
83
|
+
this.selectedAttributes.set(Array.isArray(initialValue) ? initialValue : []);
|
|
84
|
+
}
|
|
85
|
+
if (isObservable(this.props.options)) {
|
|
86
|
+
this.subscription.add(this.props.options.pipe(takeUntil(this.destroy$)).subscribe(options => {
|
|
87
|
+
this._categories.set(Array.isArray(options) ? options : []);
|
|
88
|
+
if (this._categories().length > 0 && !this.userSelectedCategory()) {
|
|
89
|
+
this.selectedCategory.set(this._categories()[0]);
|
|
90
|
+
}
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this._categories.set(Array.isArray(this.props.options) ? this.props.options : []);
|
|
95
|
+
if (this._categories().length > 0 && !this.userSelectedCategory()) {
|
|
96
|
+
this.selectedCategory.set(this._categories()[0]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
onClick(event) {
|
|
101
|
+
if (!this.el.nativeElement.contains(event.target)) {
|
|
102
|
+
this.isOpen.set(false);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
toggleDropdown() {
|
|
106
|
+
const isOpening = !this.isOpen();
|
|
107
|
+
this.isOpen.set(isOpening);
|
|
108
|
+
if (isOpening) {
|
|
109
|
+
this.searchTerm.set('');
|
|
110
|
+
if (this.searchInput) {
|
|
111
|
+
this.searchInput.nativeElement.value = '';
|
|
112
|
+
}
|
|
113
|
+
this.cdr.detectChanges();
|
|
114
|
+
if (this.categoryContainer && this.dropdownPanel) {
|
|
115
|
+
const containerWidth = this.categoryContainer.nativeElement.offsetWidth;
|
|
116
|
+
const offset = this.props?.['panelWidthOffset'] ?? 160; // fallback if undefined
|
|
117
|
+
// Use explicit pixel width to avoid reflows caused by fit-content
|
|
118
|
+
const panelWidthPx = containerWidth + offset;
|
|
119
|
+
this.renderer.setStyle(this.dropdownPanel.nativeElement, 'min-width', `${panelWidthPx}px`);
|
|
120
|
+
this.renderer.setStyle(this.dropdownPanel.nativeElement, 'width', `${panelWidthPx}px`);
|
|
121
|
+
}
|
|
122
|
+
// 🔑 Sync selectedAttributes from formControl on every open
|
|
123
|
+
if (this.props?.['multiple']) {
|
|
124
|
+
const currentValue = this.formControl.value || [];
|
|
125
|
+
this.selectedAttributes.set(Array.isArray(currentValue) ? currentValue : []);
|
|
126
|
+
}
|
|
127
|
+
else if (this.formControl.value) {
|
|
128
|
+
this.selectedAttributes.set([this.formControl.value]);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.selectedAttributes.set([]);
|
|
132
|
+
}
|
|
133
|
+
// 👇 Now this works, because selectedAttributes isn’t empty anymore
|
|
134
|
+
const attrCategory = this.getSelectedAttributesCategory();
|
|
135
|
+
if (attrCategory) {
|
|
136
|
+
this.selectedCategory.set(attrCategory);
|
|
137
|
+
}
|
|
138
|
+
else if (this.userSelectedCategory()) {
|
|
139
|
+
this.selectedCategory.set(this.userSelectedCategory());
|
|
140
|
+
}
|
|
141
|
+
else if (this._categories().length > 0) {
|
|
142
|
+
this.selectedCategory.set(this._categories()[0]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
selectCategory(category) {
|
|
147
|
+
this.selectedCategory.set(category);
|
|
148
|
+
// Only update userSelectedCategory if there are NO attributes selected
|
|
149
|
+
if (this.selectedAttributes().length === 0) {
|
|
150
|
+
this.userSelectedCategory.set(category);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
toggleValue(val) {
|
|
154
|
+
this.selectedAttributes.update(attributes => {
|
|
155
|
+
const index = attributes.findIndex(item => item[this.bindValue] === val[this.bindValue]);
|
|
156
|
+
if (index > -1) {
|
|
157
|
+
attributes.splice(index, 1);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const category = this.selectedCategory();
|
|
161
|
+
const newValue = { ...val, categoryId: category[this.bindValue], categoryLabel: category[this.bindLabel] };
|
|
162
|
+
attributes.push(newValue);
|
|
163
|
+
}
|
|
164
|
+
this.formControl.setValue([...attributes]);
|
|
165
|
+
return [...attributes];
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
getSelectedAttributesCategory() {
|
|
169
|
+
const attrs = this.selectedAttributes();
|
|
170
|
+
if (attrs.length > 0) {
|
|
171
|
+
// always prefer category of last selected attribute
|
|
172
|
+
const lastAttr = attrs[attrs.length - 1];
|
|
173
|
+
return this._categories().find(c => c[this.bindValue] === lastAttr.categoryId);
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
isItemSelected(val) {
|
|
178
|
+
return this.selectedAttributes().some(item => item[this.bindValue] === val[this.bindValue]);
|
|
179
|
+
}
|
|
180
|
+
removeValue(val) {
|
|
181
|
+
this.selectedAttributes.update(attributes => {
|
|
182
|
+
const newAttributes = attributes.filter(item => item[this.bindValue] !== val[this.bindValue]);
|
|
183
|
+
this.formControl.setValue(newAttributes);
|
|
184
|
+
return newAttributes;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
selectSingleValue(val) {
|
|
188
|
+
const category = this.selectedCategory();
|
|
189
|
+
// const newValue = { ...val, categoryId: category[this.bindValue], categoryLabel: category[this.bindLabel] };
|
|
190
|
+
// this.formControl.setValue(newValue);
|
|
191
|
+
this.formControl.setValue(val);
|
|
192
|
+
this.isOpen.set(false);
|
|
193
|
+
}
|
|
194
|
+
onSearch(event) {
|
|
195
|
+
const value = event.target.value;
|
|
196
|
+
this.searchTerm.set(value);
|
|
197
|
+
}
|
|
198
|
+
clearSearch(event) {
|
|
199
|
+
this.searchTerm.set('');
|
|
200
|
+
this.searchInput.nativeElement.value = '';
|
|
201
|
+
event.stopPropagation();
|
|
202
|
+
}
|
|
203
|
+
ngOnDestroy() {
|
|
204
|
+
this.subscription.unsubscribe();
|
|
205
|
+
this.destroy$.next();
|
|
206
|
+
this.destroy$.complete();
|
|
207
|
+
}
|
|
208
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: CategoryDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
209
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: CategoryDropdownComponent, isStandalone: true, selector: "sa-category-dropdown", host: { listeners: { "document:click": "onClick($event)" } }, providers: [IconService], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "categoryContainer", first: true, predicate: ["categoryContainer"], descendants: true }, { propertyName: "dropdownPanel", first: true, predicate: ["dropdownPanel"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"custom-category-dropdown relative\" (click)=\"toggleDropdown()\">\n <!-- Dropdown Trigger / Display -->\n <div #categoryContainer class=\"custom-category-container\" [class.open]=\"isOpen()\">\n <div class=\"custom-category-attribute-container\">\n @if(props?.['multiple']){\n @if (selectedAttributes().length > 0) {\n @for (item of selectedAttributes(); track item[bindValue]) {\n <div class=\"custom-category-attribute custom-category-custom-chip\" (click)=\"$event.stopPropagation()\">\n <span class=\"custom-category-attribute-label\">{{ item[bindLabel] }}</span>\n <span class=\"custom-category-attribute-icon right\">\n <sa-icon icon=\"closeOutlined\" (click)=\"removeValue(item)\" size=\"11\"></sa-icon>\n </span>\n </div>\n }\n } @else {\n <span class=\"placeholder\">Select items</span>\n }\n } @else {\n @if(formControl.value) {\n <span class=\"custom-category-attribute-label\">{{ formControl.value[bindLabel] }}</span>\n } @else {\n <span class=\"placeholder\">Select item</span>\n }\n }\n </div>\n <div class=\"custom-category-arrow-wrapper\">\n <sa-icon icon=\"upDownChevronOutlined\" size=\"11\"></sa-icon>\n </div>\n </div>\n\n <!-- Dropdown Panel -->\n @if (isOpen()) {\n <div #dropdownPanel class=\"dropdown-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-container mat-form-field-density-5\">\n <mat-form-field [appearance]=\"props['appearance'] || 'outline'\" class=\"w-100\">\n <sa-icon icon=\"searchIcon\" size=\"20\" matPrefix></sa-icon>\n <input #searchInput matInput type=\"text\" name=\"menu-search-bar\" class=\"search-input\"\n (keyup)=\"onSearch($event)\" [placeholder]=\"props?.['searchPlaceholder'] || 'Search'\" />\n <sa-icon class=\"pointer\" icon=\"closeOutlined\" size=\"11\" matSuffix (click)=\"clearSearch($event)\"></sa-icon>\n </mat-form-field>\n </div>\n\n @if (filteredCategories().length > 0) {\n <div class=\"two-panel-dropdown\">\n <!-- Left Panel: Categories -->\n <div class=\"category-panel\">\n @for (cat of filteredCategories(); track cat[bindValue]) {\n <div class=\"category-item\" [class.active]=\"cat[bindValue] === selectedCategory()?.[bindValue]\"\n (click)=\"selectCategory(cat); $event.stopPropagation()\">\n <span class=\"category-label\">{{ cat[bindLabel] }}\n @if(props?.['showAttributesCount']){\n <span class=\"attributes-count\">({{ cat?.[bindAttributes]?.length }})</span>\n }\n </span>\n </div>\n }\n </div>\n <div class=\"dropdown-divider\"></div>\n\n <!-- Right Panel: Attributes -->\n <div class=\"attributes-panel\">\n @if(filteredAttributes().length > 0) {\n @for (val of filteredAttributes(); track val[bindValue]) {\n <div class=\"attribute-item pointer\"\n [class.active]=\"props?.['multiple'] ? isItemSelected(val) : formControl.value?.[bindValue] === val[bindValue]\" (click)=\"props?.['multiple'] ? toggleValue(val) : selectSingleValue(val); $event.stopPropagation()\">\n @if(props?.['multiple']){\n <label class=\"custom-checkbox-container\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [checked]=\"isItemSelected(val)\" (change)=\"toggleValue(val)\">\n <span class=\"checkmark\"></span>\n <span class=\"attribute-label\">{{ val[bindLabel] }}</span>\n </label>\n }\n @else{\n <label class=\"custom-checkbox-container\">\n <span class=\"attribute-label\">{{ val[bindLabel] }}</span>\n @if(val?.tooltip || val?.description){\n <span class=\"tooltip-container\">\n <sa-icon [icon]=\"props?.['tooltipIcon'] || 'infoCircleOutlined'\" customClass=\"info-icon\"\n [matTooltip]=\"val?.tooltip || val?.description\" matTooltipClass=\"custom-tooltip\"\n class=\"tooltip-icon\"></sa-icon>\n </span>\n }\n </label>\n }\n </div>\n }\n }@else {\n <div class=\"p-4 text-center text-gray-500 w-full\">\n No items found.\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"p-4 text-center text-gray-500 w-full\">\n No items found.\n </div>\n }\n </div>\n }\n</div>", styles: [".custom-category-container{display:flex;align-items:center;justify-content:space-between;border-radius:var(--small-4px, 4px);padding:.5rem .75rem;min-height:2.438rem;cursor:pointer;border:1px solid var(--grey-100, #EAECF0)}.custom-category-container.open{border-color:var(--primary-500)}.custom-category-attribute-container{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding-right:1.5rem}.custom-category-attribute{display:flex;align-items:center;background-color:#e5e7eb;border-radius:9999px;padding:.25rem .75rem;color:#374151;font-size:.875rem;font-weight:500}.custom-category-attribute-icon.right{margin-left:.5rem;cursor:pointer}.placeholder{color:var(--text-low-emphasis, #9B98A3);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}.custom-checkbox-container input{opacity:0;position:absolute;width:0;height:0}.checkmark{height:18px;width:18px;background-color:#f3f4f6;border:1px solid #d1d5db;border-radius:4px;position:relative;margin-right:8px}.custom-checkbox-container input:checked~.checkmark{background-color:#3b82f6;border-color:#3b82f6}.checkmark:after{content:\"\";position:absolute;display:none}.custom-checkbox-container input:checked~.checkmark:after{display:block}.custom-checkbox-container .checkmark:after{left:6px;top:2px;width:5px;height:10px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}::ng-deep .custom-category-dropdown .search-input-container .mat-mdc-form-field{width:-webkit-fill-available}.custom-category-dropdown .two-panel-dropdown{display:flex;min-height:250px;max-height:400px;background-color:#fff;overflow:hidden;top:calc(100% + 4px);gap:var(--medium-20px, 20px)}::ng-deep .custom-category-dropdown .search-input-container .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding:var(--small-2px, 2px) var(--small-12px, 12px)}.custom-category-dropdown .dropdown-divider{border-right:1px solid var(--grey-100, #EAECF0)}.custom-category-dropdown .category-label{color:var(--text-highemphasis, #1C1B20);text-align:left;font-family:var(--font-family, Roboto);font-size:var(--small-12px, 12px);font-style:normal;font-weight:400;line-height:var(--small-16px, 16px)}.custom-category-dropdown .attribute-label{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}.custom-category-dropdown .category-item.active{border-radius:var(--small-4px, 4px);background:var(--primary-500)}.custom-category-dropdown .category-item.active .category-label{color:var(--text-white, #FFF);text-align:center;font-family:var(--font-family, Roboto);font-size:var(--small-12px, 12px);font-style:normal;font-weight:500;line-height:var(--small-16px, 16px);letter-spacing:.5px}.custom-category-dropdown .category-item:not(.active):hover{border-radius:var(--small-4px, 4px);background-color:var(--primary-50)}.custom-category-dropdown .attribute-item:hover{border-radius:var(--small-4px, 4px);background-color:var(--primary-50)}.custom-category-dropdown .attribute-item.active{border-radius:var(--small-4px, 4px);background:var(--primary-500)}.custom-category-dropdown .attribute-item.active .attribute-label{color:var(--text-white, #FFF);font-weight:500}.custom-category-dropdown .category-panel{flex:2;overflow-y:auto;display:flex;flex-direction:column;gap:var(--small-8px, 8px)}.custom-category-dropdown .category-item{display:flex;padding:var(--small-8px, 8px);align-items:center;gap:var(--small-8px, 8px);align-self:stretch;border-radius:var(--small-4px, 4px);background:var(--structural-white);cursor:pointer}.custom-category-dropdown .attributes-panel{flex:2;overflow-y:auto;display:flex;flex-direction:column;align-items:flex-start;gap:var(--medium-20px, 20px);align-self:stretch}.custom-category-dropdown .attribute-item{display:flex;padding:var(--small-8px, 8px) var(--small-8px, 8px);align-items:center;gap:var(--Small-4px, 4px)}.custom-checkbox-container{display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none;gap:var(--small-4px, 4px)}.tooltip-icon{display:flex;align-items:center}::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border-color:var(--primary-500)}::ng-deep .custom-category-dropdown .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing{border-top-left-radius:0;border-top-right-radius:var(--small-4px, 4px);border-bottom-right-radius:var(--small-4px, 4px);border-bottom-left-radius:0}::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:var(--grey-100)}::ng-deep .custom-category-dropdown .active .tooltip-container .info-icon{color:var(--structural-white)}.custom-category-dropdown .dropdown-panel{display:flex;padding:var(--small-16px, 16px) var(--medium-20px, 20px) var(--small-16px, 16px) var(--small-12px, 12px);flex-direction:column;gap:var(--small-10px, 10px);border-radius:var(--small-8px, 8px);background:var(--structural-white);width:fit-content;max-height:400px;box-shadow:0 1px 2px #0000004d,0 1px 2px #0000004d,0 2px 6px 2px #00000026;margin-top:0;box-sizing:border-box;position:absolute;z-index:1000;-webkit-overflow-scrolling:touch}.custom-category-container .custom-category-attribute-label{color:var(--text-highemphasis);font-family:var(--font-family-roboto);font-size:var(--small-14px);font-style:normal;font-weight:400;line-height:var(--medium-20px);letter-spacing:.25px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: IconComponent, selector: "sa-icon", inputs: ["img", "icon", "size", "color", "iconPath", "iconUrl", "customClass", "href", "hrefTarget", "iconPosition"], outputs: ["onClickEvent"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSelectModule }] }); }
|
|
210
|
+
}
|
|
211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: CategoryDropdownComponent, decorators: [{
|
|
212
|
+
type: Component,
|
|
213
|
+
args: [{ selector: 'sa-category-dropdown', standalone: true, imports: [CommonModule,
|
|
214
|
+
ReactiveFormsModule,
|
|
215
|
+
FormsModule,
|
|
216
|
+
FormlyModule,
|
|
217
|
+
IconComponent,
|
|
218
|
+
MatFormFieldModule,
|
|
219
|
+
MatInputModule,
|
|
220
|
+
MatIconModule,
|
|
221
|
+
MatButtonModule,
|
|
222
|
+
MatTooltipModule,
|
|
223
|
+
MatButtonToggleModule,
|
|
224
|
+
MatDatepickerModule,
|
|
225
|
+
MatNativeDateModule,
|
|
226
|
+
MatCheckboxModule,
|
|
227
|
+
MatSelectModule], providers: [IconService], template: "<div class=\"custom-category-dropdown relative\" (click)=\"toggleDropdown()\">\n <!-- Dropdown Trigger / Display -->\n <div #categoryContainer class=\"custom-category-container\" [class.open]=\"isOpen()\">\n <div class=\"custom-category-attribute-container\">\n @if(props?.['multiple']){\n @if (selectedAttributes().length > 0) {\n @for (item of selectedAttributes(); track item[bindValue]) {\n <div class=\"custom-category-attribute custom-category-custom-chip\" (click)=\"$event.stopPropagation()\">\n <span class=\"custom-category-attribute-label\">{{ item[bindLabel] }}</span>\n <span class=\"custom-category-attribute-icon right\">\n <sa-icon icon=\"closeOutlined\" (click)=\"removeValue(item)\" size=\"11\"></sa-icon>\n </span>\n </div>\n }\n } @else {\n <span class=\"placeholder\">Select items</span>\n }\n } @else {\n @if(formControl.value) {\n <span class=\"custom-category-attribute-label\">{{ formControl.value[bindLabel] }}</span>\n } @else {\n <span class=\"placeholder\">Select item</span>\n }\n }\n </div>\n <div class=\"custom-category-arrow-wrapper\">\n <sa-icon icon=\"upDownChevronOutlined\" size=\"11\"></sa-icon>\n </div>\n </div>\n\n <!-- Dropdown Panel -->\n @if (isOpen()) {\n <div #dropdownPanel class=\"dropdown-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-container mat-form-field-density-5\">\n <mat-form-field [appearance]=\"props['appearance'] || 'outline'\" class=\"w-100\">\n <sa-icon icon=\"searchIcon\" size=\"20\" matPrefix></sa-icon>\n <input #searchInput matInput type=\"text\" name=\"menu-search-bar\" class=\"search-input\"\n (keyup)=\"onSearch($event)\" [placeholder]=\"props?.['searchPlaceholder'] || 'Search'\" />\n <sa-icon class=\"pointer\" icon=\"closeOutlined\" size=\"11\" matSuffix (click)=\"clearSearch($event)\"></sa-icon>\n </mat-form-field>\n </div>\n\n @if (filteredCategories().length > 0) {\n <div class=\"two-panel-dropdown\">\n <!-- Left Panel: Categories -->\n <div class=\"category-panel\">\n @for (cat of filteredCategories(); track cat[bindValue]) {\n <div class=\"category-item\" [class.active]=\"cat[bindValue] === selectedCategory()?.[bindValue]\"\n (click)=\"selectCategory(cat); $event.stopPropagation()\">\n <span class=\"category-label\">{{ cat[bindLabel] }}\n @if(props?.['showAttributesCount']){\n <span class=\"attributes-count\">({{ cat?.[bindAttributes]?.length }})</span>\n }\n </span>\n </div>\n }\n </div>\n <div class=\"dropdown-divider\"></div>\n\n <!-- Right Panel: Attributes -->\n <div class=\"attributes-panel\">\n @if(filteredAttributes().length > 0) {\n @for (val of filteredAttributes(); track val[bindValue]) {\n <div class=\"attribute-item pointer\"\n [class.active]=\"props?.['multiple'] ? isItemSelected(val) : formControl.value?.[bindValue] === val[bindValue]\" (click)=\"props?.['multiple'] ? toggleValue(val) : selectSingleValue(val); $event.stopPropagation()\">\n @if(props?.['multiple']){\n <label class=\"custom-checkbox-container\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [checked]=\"isItemSelected(val)\" (change)=\"toggleValue(val)\">\n <span class=\"checkmark\"></span>\n <span class=\"attribute-label\">{{ val[bindLabel] }}</span>\n </label>\n }\n @else{\n <label class=\"custom-checkbox-container\">\n <span class=\"attribute-label\">{{ val[bindLabel] }}</span>\n @if(val?.tooltip || val?.description){\n <span class=\"tooltip-container\">\n <sa-icon [icon]=\"props?.['tooltipIcon'] || 'infoCircleOutlined'\" customClass=\"info-icon\"\n [matTooltip]=\"val?.tooltip || val?.description\" matTooltipClass=\"custom-tooltip\"\n class=\"tooltip-icon\"></sa-icon>\n </span>\n }\n </label>\n }\n </div>\n }\n }@else {\n <div class=\"p-4 text-center text-gray-500 w-full\">\n No items found.\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"p-4 text-center text-gray-500 w-full\">\n No items found.\n </div>\n }\n </div>\n }\n</div>", styles: [".custom-category-container{display:flex;align-items:center;justify-content:space-between;border-radius:var(--small-4px, 4px);padding:.5rem .75rem;min-height:2.438rem;cursor:pointer;border:1px solid var(--grey-100, #EAECF0)}.custom-category-container.open{border-color:var(--primary-500)}.custom-category-attribute-container{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;padding-right:1.5rem}.custom-category-attribute{display:flex;align-items:center;background-color:#e5e7eb;border-radius:9999px;padding:.25rem .75rem;color:#374151;font-size:.875rem;font-weight:500}.custom-category-attribute-icon.right{margin-left:.5rem;cursor:pointer}.placeholder{color:var(--text-low-emphasis, #9B98A3);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}.custom-checkbox-container input{opacity:0;position:absolute;width:0;height:0}.checkmark{height:18px;width:18px;background-color:#f3f4f6;border:1px solid #d1d5db;border-radius:4px;position:relative;margin-right:8px}.custom-checkbox-container input:checked~.checkmark{background-color:#3b82f6;border-color:#3b82f6}.checkmark:after{content:\"\";position:absolute;display:none}.custom-checkbox-container input:checked~.checkmark:after{display:block}.custom-checkbox-container .checkmark:after{left:6px;top:2px;width:5px;height:10px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}::ng-deep .custom-category-dropdown .search-input-container .mat-mdc-form-field{width:-webkit-fill-available}.custom-category-dropdown .two-panel-dropdown{display:flex;min-height:250px;max-height:400px;background-color:#fff;overflow:hidden;top:calc(100% + 4px);gap:var(--medium-20px, 20px)}::ng-deep .custom-category-dropdown .search-input-container .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding:var(--small-2px, 2px) var(--small-12px, 12px)}.custom-category-dropdown .dropdown-divider{border-right:1px solid var(--grey-100, #EAECF0)}.custom-category-dropdown .category-label{color:var(--text-highemphasis, #1C1B20);text-align:left;font-family:var(--font-family, Roboto);font-size:var(--small-12px, 12px);font-style:normal;font-weight:400;line-height:var(--small-16px, 16px)}.custom-category-dropdown .attribute-label{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}.custom-category-dropdown .category-item.active{border-radius:var(--small-4px, 4px);background:var(--primary-500)}.custom-category-dropdown .category-item.active .category-label{color:var(--text-white, #FFF);text-align:center;font-family:var(--font-family, Roboto);font-size:var(--small-12px, 12px);font-style:normal;font-weight:500;line-height:var(--small-16px, 16px);letter-spacing:.5px}.custom-category-dropdown .category-item:not(.active):hover{border-radius:var(--small-4px, 4px);background-color:var(--primary-50)}.custom-category-dropdown .attribute-item:hover{border-radius:var(--small-4px, 4px);background-color:var(--primary-50)}.custom-category-dropdown .attribute-item.active{border-radius:var(--small-4px, 4px);background:var(--primary-500)}.custom-category-dropdown .attribute-item.active .attribute-label{color:var(--text-white, #FFF);font-weight:500}.custom-category-dropdown .category-panel{flex:2;overflow-y:auto;display:flex;flex-direction:column;gap:var(--small-8px, 8px)}.custom-category-dropdown .category-item{display:flex;padding:var(--small-8px, 8px);align-items:center;gap:var(--small-8px, 8px);align-self:stretch;border-radius:var(--small-4px, 4px);background:var(--structural-white);cursor:pointer}.custom-category-dropdown .attributes-panel{flex:2;overflow-y:auto;display:flex;flex-direction:column;align-items:flex-start;gap:var(--medium-20px, 20px);align-self:stretch}.custom-category-dropdown .attribute-item{display:flex;padding:var(--small-8px, 8px) var(--small-8px, 8px);align-items:center;gap:var(--Small-4px, 4px)}.custom-checkbox-container{display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none;gap:var(--small-4px, 4px)}.tooltip-icon{display:flex;align-items:center}::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border-color:var(--primary-500)}::ng-deep .custom-category-dropdown .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing{border-top-left-radius:0;border-top-right-radius:var(--small-4px, 4px);border-bottom-right-radius:var(--small-4px, 4px);border-bottom-left-radius:0}::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,::ng-deep .custom-category-dropdown .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:var(--grey-100)}::ng-deep .custom-category-dropdown .active .tooltip-container .info-icon{color:var(--structural-white)}.custom-category-dropdown .dropdown-panel{display:flex;padding:var(--small-16px, 16px) var(--medium-20px, 20px) var(--small-16px, 16px) var(--small-12px, 12px);flex-direction:column;gap:var(--small-10px, 10px);border-radius:var(--small-8px, 8px);background:var(--structural-white);width:fit-content;max-height:400px;box-shadow:0 1px 2px #0000004d,0 1px 2px #0000004d,0 2px 6px 2px #00000026;margin-top:0;box-sizing:border-box;position:absolute;z-index:1000;-webkit-overflow-scrolling:touch}.custom-category-container .custom-category-attribute-label{color:var(--text-highemphasis);font-family:var(--font-family-roboto);font-size:var(--small-14px);font-style:normal;font-weight:400;line-height:var(--medium-20px);letter-spacing:.25px}\n"] }]
|
|
228
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }], propDecorators: { searchInput: [{
|
|
229
|
+
type: ViewChild,
|
|
230
|
+
args: ['searchInput']
|
|
231
|
+
}], categoryContainer: [{
|
|
232
|
+
type: ViewChild,
|
|
233
|
+
args: ['categoryContainer']
|
|
234
|
+
}], dropdownPanel: [{
|
|
235
|
+
type: ViewChild,
|
|
236
|
+
args: ['dropdownPanel']
|
|
237
|
+
}], onClick: [{
|
|
238
|
+
type: HostListener,
|
|
239
|
+
args: ['document:click', ['$event']]
|
|
240
|
+
}] } });
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9kcm9wZG93bi9jYXRlZ29yeS1kcm9wZG93bi9jYXRlZ29yeS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL2Ryb3Bkb3duL2NhdGVnb3J5LWRyb3Bkb3duL2NhdGVnb3J5LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQWdDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEssT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5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LFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgc2lnbmFsLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZSwgRmllbGRUeXBlQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXROYXRpdmVEYXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQge2ZpcnN0IGFzIF9maXJzdH0gZnJvbSAnbG9kYXNoJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2EtY2F0ZWdvcnktZHJvcGRvd24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRm9ybWx5TW9kdWxlLFxuICAgIEljb25Db21wb25lbnQsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLFxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgTWF0TmF0aXZlRGF0ZU1vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtJY29uU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXRlZ29yeS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jYXRlZ29yeS1kcm9wZG93bi5jb21wb25lbnQuY3NzJ1xufSlcblxuZXhwb3J0IGNsYXNzIENhdGVnb3J5RHJvcGRvd25Db21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZ2V0IGJpbmRMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wcm9wc1snYmluZExhYmVsJ10gfHwgJ2xhYmVsJzsgfVxuICBnZXQgYmluZFZhbHVlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnByb3BzWydiaW5kVmFsdWUnXSB8fCAndmFsdWUnOyB9XG4gIGdldCBiaW5kQXR0cmlidXRlcygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wcm9wc1snYmluZEF0dHJpYnV0ZXMnXSB8fCAnYXR0cmlidXRlcyc7IH1cbiAgX2NhdGVnb3JpZXMgPSBzaWduYWw8YW55W10+KFtdKTtcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgc2VsZWN0ZWRDYXRlZ29yeSA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHNlbGVjdGVkQXR0cmlidXRlcyA9IHNpZ25hbDxhbnlbXT4oW10pO1xuICBzZWFyY2hUZXJtID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICB1c2VyU2VsZWN0ZWRDYXRlZ29yeSA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7IC8vIFRvIGhvbGQgdGhlIHVzZXIncyBleHBsaWNpdCBzZWxlY3Rpb25cblxuICBwcml2YXRlIGVsOiBFbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHNlYXJjaElucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdjYXRlZ29yeUNvbnRhaW5lcicpIGNhdGVnb3J5Q29udGFpbmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93blBhbmVsJykgZHJvcGRvd25QYW5lbDogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKCk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZENhdGVnb3JpZXMoKTtcbiAgICAgIGNvbnN0IHRlcm0gPSB0aGlzLnNlYXJjaFRlcm0oKTtcbiAgICBcbiAgICAgIGlmICh0ZXJtICYmIGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5LnNldChfZmlyc3QoZmlsdGVyZWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIFxuICAgICAgLy8gSWYgYXR0cmlidXRlcyBleGlzdCwgc3RpY2sgd2l0aCB0aGVpciBjYXRlZ29yeVxuICAgICAgY29uc3QgYXR0ckNhdGVnb3J5ID0gdGhpcy5nZXRTZWxlY3RlZEF0dHJpYnV0ZXNDYXRlZ29yeSgpO1xuICAgICAgaWYgKGF0dHJDYXRlZ29yeSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkuc2V0KGF0dHJDYXRlZ29yeSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBcbiAgICAgIC8vIEVsc2UgZmFsbGJhY2sgdG8gdXNlci1zZWxlY3RlZCBvciBmaXJzdFxuICAgICAgaWYgKHRoaXMudXNlclNlbGVjdGVkQ2F0ZWdvcnkoKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkuc2V0KHRoaXMudXNlclNlbGVjdGVkQ2F0ZWdvcnkoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2NhdGVnb3JpZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeS5zZXQoX2ZpcnN0KHRoaXMuX2NhdGVnb3JpZXMoKSkpO1xuICAgICAgfVxuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcz8uWydtdWx0aXBsZSddKSB7XG4gICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEF0dHJpYnV0ZXMuc2V0KEFycmF5LmlzQXJyYXkoaW5pdGlhbFZhbHVlKSA/IGluaXRpYWxWYWx1ZSA6IFtdKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYnNlcnZhYmxlKHRoaXMucHJvcHMub3B0aW9ucykpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnByb3BzLm9wdGlvbnMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgdGhpcy5fY2F0ZWdvcmllcy5zZXQoQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbXSk7XG4gICAgICAgIGlmICh0aGlzLl9jYXRlZ29yaWVzKCkubGVuZ3RoID4gMCAmJiAhdGhpcy51c2VyU2VsZWN0ZWRDYXRlZ29yeSgpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5LnNldCh0aGlzLl9jYXRlZ29yaWVzKClbMF0pO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NhdGVnb3JpZXMuc2V0KEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5vcHRpb25zKSA/IHRoaXMucHJvcHMub3B0aW9ucyA6IFtdKTtcbiAgICAgIGlmICh0aGlzLl9jYXRlZ29yaWVzKCkubGVuZ3RoID4gMCAmJiAhdGhpcy51c2VyU2VsZWN0ZWRDYXRlZ29yeSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeS5zZXQodGhpcy5fY2F0ZWdvcmllcygpWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKCkge1xuICAgIGNvbnN0IGlzT3BlbmluZyA9ICF0aGlzLmlzT3BlbigpO1xuICAgIHRoaXMuaXNPcGVuLnNldChpc09wZW5pbmcpO1xuICBcbiAgICBpZiAoaXNPcGVuaW5nKSB7XG4gICAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcbiAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICBcbiAgICAgIGlmICh0aGlzLmNhdGVnb3J5Q29udGFpbmVyICYmIHRoaXMuZHJvcGRvd25QYW5lbCkge1xuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuY2F0ZWdvcnlDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5wcm9wcz8uWydwYW5lbFdpZHRoT2Zmc2V0J10gPz8gMTYwOyAvLyBmYWxsYmFjayBpZiB1bmRlZmluZWRcblxuICAgICAgICAvLyBVc2UgZXhwbGljaXQgcGl4ZWwgd2lkdGggdG8gYXZvaWQgcmVmbG93cyBjYXVzZWQgYnkgZml0LWNvbnRlbnRcbiAgICAgICAgY29uc3QgcGFuZWxXaWR0aFB4ID0gY29udGFpbmVyV2lkdGggKyBvZmZzZXQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93blBhbmVsLm5hdGl2ZUVsZW1lbnQsICdtaW4td2lkdGgnLCBgJHtwYW5lbFdpZHRoUHh9cHhgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duUGFuZWwubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgYCR7cGFuZWxXaWR0aFB4fXB4YCk7XG4gICAgICB9XG4gIFxuICAgICAgLy8g8J+UkSBTeW5jIHNlbGVjdGVkQXR0cmlidXRlcyBmcm9tIGZvcm1Db250cm9sIG9uIGV2ZXJ5IG9wZW5cbiAgICAgIGlmICh0aGlzLnByb3BzPy5bJ211bHRpcGxlJ10pIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSB8fCBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEF0dHJpYnV0ZXMuc2V0KEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IFtdKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQXR0cmlidXRlcy5zZXQoW3RoaXMuZm9ybUNvbnRyb2wudmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRyaWJ1dGVzLnNldChbXSk7XG4gICAgICB9XG4gIFxuICAgICAgLy8g8J+RhyBOb3cgdGhpcyB3b3JrcywgYmVjYXVzZSBzZWxlY3RlZEF0dHJpYnV0ZXMgaXNu4oCZdCBlbXB0eSBhbnltb3JlXG4gICAgICBjb25zdCBhdHRyQ2F0ZWdvcnkgPSB0aGlzLmdldFNlbGVjdGVkQXR0cmlidXRlc0NhdGVnb3J5KCk7XG4gICAgICBpZiAoYXR0ckNhdGVnb3J5KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeS5zZXQoYXR0ckNhdGVnb3J5KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VyU2VsZWN0ZWRDYXRlZ29yeSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeS5zZXQodGhpcy51c2VyU2VsZWN0ZWRDYXRlZ29yeSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2F0ZWdvcmllcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5LnNldCh0aGlzLl9jYXRlZ29yaWVzKClbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNlbGVjdENhdGVnb3J5KGNhdGVnb3J5OiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkuc2V0KGNhdGVnb3J5KTtcbiAgICAvLyBPbmx5IHVwZGF0ZSB1c2VyU2VsZWN0ZWRDYXRlZ29yeSBpZiB0aGVyZSBhcmUgTk8gYXR0cmlidXRlcyBzZWxlY3RlZFxuICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0cmlidXRlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51c2VyU2VsZWN0ZWRDYXRlZ29yeS5zZXQoY2F0ZWdvcnkpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEF0dHJpYnV0ZXMudXBkYXRlKGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBhdHRyaWJ1dGVzLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bdGhpcy5iaW5kVmFsdWVdID09PSB2YWxbdGhpcy5iaW5kVmFsdWVdKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNhdGVnb3J5ID0gdGhpcy5zZWxlY3RlZENhdGVnb3J5KCk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0geyAuLi52YWwsIGNhdGVnb3J5SWQ6IGNhdGVnb3J5W3RoaXMuYmluZFZhbHVlXSwgY2F0ZWdvcnlMYWJlbDogY2F0ZWdvcnlbdGhpcy5iaW5kTGFiZWxdIH07XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKFsuLi5hdHRyaWJ1dGVzXSk7XG4gICAgICByZXR1cm4gWy4uLmF0dHJpYnV0ZXNdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEF0dHJpYnV0ZXNDYXRlZ29yeSgpOiBhbnkge1xuICAgIGNvbnN0IGF0dHJzID0gdGhpcy5zZWxlY3RlZEF0dHJpYnV0ZXMoKTtcbiAgICBpZiAoYXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gYWx3YXlzIHByZWZlciBjYXRlZ29yeSBvZiBsYXN0IHNlbGVjdGVkIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgbGFzdEF0dHIgPSBhdHRyc1thdHRycy5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiB0aGlzLl9jYXRlZ29yaWVzKCkuZmluZChjID0+IGNbdGhpcy5iaW5kVmFsdWVdID09PSBsYXN0QXR0ci5jYXRlZ29yeUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQXR0cmlidXRlcygpLnNvbWUoaXRlbSA9PiBpdGVtW3RoaXMuYmluZFZhbHVlXSA9PT0gdmFsW3RoaXMuYmluZFZhbHVlXSk7XG4gIH1cblxuICByZW1vdmVWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRBdHRyaWJ1dGVzLnVwZGF0ZShhdHRyaWJ1dGVzID0+IHtcbiAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmZpbHRlcihpdGVtID0+IGl0ZW1bdGhpcy5iaW5kVmFsdWVdICE9PSB2YWxbdGhpcy5iaW5kVmFsdWVdKTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUobmV3QXR0cmlidXRlcyk7XG4gICAgICByZXR1cm4gbmV3QXR0cmlidXRlcztcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdFNpbmdsZVZhbHVlKHZhbDogYW55KSB7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkoKTtcbiAgICAvLyBjb25zdCBuZXdWYWx1ZSA9IHsgLi4udmFsLCBjYXRlZ29yeUlkOiBjYXRlZ29yeVt0aGlzLmJpbmRWYWx1ZV0sIGNhdGVnb3J5TGFiZWw6IGNhdGVnb3J5W3RoaXMuYmluZExhYmVsXSB9O1xuICAgIC8vIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsKTtcbiAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICB9XG5cbiAgb25TZWFyY2goZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQodmFsdWUpO1xuICB9XG5cbiAgY2xlYXJTZWFyY2goZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGZpbHRlcmVkQXR0cmlidXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjYXRlZ29yeSA9IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSgpO1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLnNlYXJjaFRlcm0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFjYXRlZ29yeSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiAoY2F0ZWdvcnlbdGhpcy5iaW5kQXR0cmlidXRlc10gfHwgW10pLmZpbHRlcigodmFsOiBhbnkpID0+ICh2YWxbdGhpcy5iaW5kTGFiZWxdIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKTtcbiAgfSk7XG5cbiAgZmlsdGVyZWRDYXRlZ29yaWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLnNlYXJjaFRlcm0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLl9jYXRlZ29yaWVzKCk7XG4gICAgaWYgKCF0ZXJtKSB7XG4gICAgICByZXR1cm4gY2F0ZWdvcmllcztcbiAgICB9XG4gICAgcmV0dXJuIGNhdGVnb3JpZXMuZmlsdGVyKGNhdGVnb3J5ID0+XG4gICAgICAoY2F0ZWdvcnlbdGhpcy5iaW5kQXR0cmlidXRlc10gfHwgW10pLnNvbWUoKHZhbDogYW55KSA9PiAodmFsW3RoaXMuYmluZExhYmVsXSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICApO1xuICB9KTtcbn0iLCI8ZGl2IGNsYXNzPVwiY3VzdG9tLWNhdGVnb3J5LWRyb3Bkb3duIHJlbGF0aXZlXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIj5cbiAgICA8IS0tIERyb3Bkb3duIFRyaWdnZXIgLyBEaXNwbGF5IC0tPlxuICAgIDxkaXYgI2NhdGVnb3J5Q29udGFpbmVyIGNsYXNzPVwiY3VzdG9tLWNhdGVnb3J5LWNvbnRhaW5lclwiIFtjbGFzcy5vcGVuXT1cImlzT3BlbigpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY2F0ZWdvcnktYXR0cmlidXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgQGlmKHByb3BzPy5bJ211bHRpcGxlJ10pe1xuICAgICAgICAgICAgQGlmIChzZWxlY3RlZEF0dHJpYnV0ZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlbGVjdGVkQXR0cmlidXRlcygpOyB0cmFjayBpdGVtW2JpbmRWYWx1ZV0pIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY2F0ZWdvcnktYXR0cmlidXRlIGN1c3RvbS1jYXRlZ29yeS1jdXN0b20tY2hpcFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1jYXRlZ29yeS1hdHRyaWJ1dGUtbGFiZWxcIj57eyBpdGVtW2JpbmRMYWJlbF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b20tY2F0ZWdvcnktYXR0cmlidXRlLWljb24gcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNhLWljb24gaWNvbj1cImNsb3NlT3V0bGluZWRcIiAoY2xpY2spPVwicmVtb3ZlVmFsdWUoaXRlbSlcIiBzaXplPVwiMTFcIj48L3NhLWljb24+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXJcIj5TZWxlY3QgaXRlbXM8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZihmb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b20tY2F0ZWdvcnktYXR0cmlidXRlLWxhYmVsXCI+e3sgZm9ybUNvbnRyb2wudmFsdWVbYmluZExhYmVsXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlclwiPlNlbGVjdCBpdGVtPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jYXRlZ29yeS1hcnJvdy13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c2EtaWNvbiBpY29uPVwidXBEb3duQ2hldnJvbk91dGxpbmVkXCIgc2l6ZT1cIjExXCI+PC9zYS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRHJvcGRvd24gUGFuZWwgLS0+XG4gICAgQGlmIChpc09wZW4oKSkge1xuICAgIDxkaXYgI2Ryb3Bkb3duUGFuZWwgY2xhc3M9XCJkcm9wZG93bi1wYW5lbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC1jb250YWluZXIgbWF0LWZvcm0tZmllbGQtZGVuc2l0eS01XCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2FwcGVhcmFuY2VdPVwicHJvcHNbJ2FwcGVhcmFuY2UnXSB8fCAnb3V0bGluZSdcIiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgPHNhLWljb24gaWNvbj1cInNlYXJjaEljb25cIiBzaXplPVwiMjBcIiBtYXRQcmVmaXg+PC9zYS1pY29uPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoSW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwibWVudS1zZWFyY2gtYmFyXCIgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25TZWFyY2goJGV2ZW50KVwiIFtwbGFjZWhvbGRlcl09XCJwcm9wcz8uWydzZWFyY2hQbGFjZWhvbGRlciddIHx8ICdTZWFyY2gnXCIgLz5cbiAgICAgICAgICAgICAgICA8c2EtaWNvbiBjbGFzcz1cInBvaW50ZXJcIiBpY29uPVwiY2xvc2VPdXRsaW5lZFwiIHNpemU9XCIxMVwiIG1hdFN1ZmZpeCAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiPjwvc2EtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRDYXRlZ29yaWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidHdvLXBhbmVsLWRyb3Bkb3duXCI+XG4gICAgICAgICAgICA8IS0tIExlZnQgUGFuZWw6IENhdGVnb3JpZXMgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktcGFuZWxcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjYXQgb2YgZmlsdGVyZWRDYXRlZ29yaWVzKCk7IHRyYWNrIGNhdFtiaW5kVmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWl0ZW1cIiBbY2xhc3MuYWN0aXZlXT1cImNhdFtiaW5kVmFsdWVdID09PSBzZWxlY3RlZENhdGVnb3J5KCk/LltiaW5kVmFsdWVdXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5KGNhdCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LWxhYmVsXCI+e3sgY2F0W2JpbmRMYWJlbF0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihwcm9wcz8uWydzaG93QXR0cmlidXRlc0NvdW50J10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGVzLWNvdW50XCI+KHt7IGNhdD8uW2JpbmRBdHRyaWJ1dGVzXT8ubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBSaWdodCBQYW5lbDogQXR0cmlidXRlcyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRyaWJ1dGVzLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgQGlmKGZpbHRlcmVkQXR0cmlidXRlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBAZm9yICh2YWwgb2YgZmlsdGVyZWRBdHRyaWJ1dGVzKCk7IHRyYWNrIHZhbFtiaW5kVmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dHJpYnV0ZS1pdGVtIHBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInByb3BzPy5bJ211bHRpcGxlJ10gPyBpc0l0ZW1TZWxlY3RlZCh2YWwpIDogZm9ybUNvbnRyb2wudmFsdWU/LltiaW5kVmFsdWVdID09PSB2YWxbYmluZFZhbHVlXVwiIChjbGljayk9XCJwcm9wcz8uWydtdWx0aXBsZSddID8gdG9nZ2xlVmFsdWUodmFsKSA6IHNlbGVjdFNpbmdsZVZhbHVlKHZhbCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYocHJvcHM/LlsnbXVsdGlwbGUnXSl7XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1jb250YWluZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQodmFsKVwiIChjaGFuZ2UpPVwidG9nZ2xlVmFsdWUodmFsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0dHJpYnV0ZS1sYWJlbFwiPnt7IHZhbFtiaW5kTGFiZWxdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBlbHNle1xuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0dHJpYnV0ZS1sYWJlbFwiPnt7IHZhbFtiaW5kTGFiZWxdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHZhbD8udG9vbHRpcCB8fCB2YWw/LmRlc2NyaXB0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2EtaWNvbiBbaWNvbl09XCJwcm9wcz8uWyd0b29sdGlwSWNvbiddIHx8ICdpbmZvQ2lyY2xlT3V0bGluZWQnXCIgY3VzdG9tQ2xhc3M9XCJpbmZvLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJ2YWw/LnRvb2x0aXAgfHwgdmFsPy5kZXNjcmlwdGlvblwiIG1hdFRvb2x0aXBDbGFzcz1cImN1c3RvbS10b29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sdGlwLWljb25cIj48L3NhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00IHRleHQtY2VudGVyIHRleHQtZ3JheS01MDAgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIE5vIGl0ZW1zIGZvdW5kLlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTQgdGV4dC1jZW50ZXIgdGV4dC1ncmF5LTUwMCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIE5vIGl0ZW1zIGZvdW5kLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
4
|
+
import { FormlyModule } from '@ngx-formly/core';
|
|
5
|
+
import { FieldType } from '@ngx-formly/core';
|
|
6
|
+
import { NgSelectModule } from '@ng-select/ng-select';
|
|
7
|
+
import { IconComponent } from '../../icon/icon.component';
|
|
8
|
+
import { IconService } from '../../icon/icon.service';
|
|
9
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
10
|
+
import { MatInputModule } from '@angular/material/input';
|
|
11
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
12
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
13
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
14
|
+
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
15
|
+
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
16
|
+
import { MatNativeDateModule } from '@angular/material/core';
|
|
17
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "@angular/common";
|
|
20
|
+
import * as i2 from "@angular/forms";
|
|
21
|
+
import * as i3 from "@ng-select/ng-select";
|
|
22
|
+
import * as i4 from "@angular/material/form-field";
|
|
23
|
+
import * as i5 from "@angular/material/input";
|
|
24
|
+
export class NgSelectComponent extends FieldType {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
this.searchValue = '';
|
|
28
|
+
this.expandedSummary = false;
|
|
29
|
+
}
|
|
30
|
+
onSearch(event) {
|
|
31
|
+
const searchValue = this.searchValue.trim().toLowerCase();
|
|
32
|
+
const bindLabel = this.props.bindLabel || 'label';
|
|
33
|
+
if (!searchValue) {
|
|
34
|
+
this.filteredOptions = [...(this.field.props?.options || [])];
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this.filteredOptions = (this.field.props?.options || []).filter(opt => {
|
|
38
|
+
const label = opt?.[bindLabel] ?? '';
|
|
39
|
+
return String(label).toLowerCase().includes(searchValue);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
ngOnInit() {
|
|
43
|
+
this._options = this.props.options;
|
|
44
|
+
this.filteredOptions = [...(this.props.options || [])];
|
|
45
|
+
// If a default value is provided in props and the form control has no value yet, set it
|
|
46
|
+
const defaultVal = this.props?.defaultValue;
|
|
47
|
+
if ((this.formControl.value === null || this.formControl.value === undefined) && defaultVal !== undefined) {
|
|
48
|
+
this.formControl.setValue(defaultVal);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
ngDoCheck() {
|
|
52
|
+
if (this.props.options !== this._options) {
|
|
53
|
+
this._options = this.props.options;
|
|
54
|
+
this.filteredOptions = [...(this._options || [])];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// (Optional) Select/Deselect all helpers
|
|
58
|
+
allSelected() {
|
|
59
|
+
return this.props?.selectedValues.length === this.field.props?.options.length;
|
|
60
|
+
}
|
|
61
|
+
toggleSelectAll() {
|
|
62
|
+
const bindValue = this.props.bindValue || 'value';
|
|
63
|
+
if (this.allSelected()) {
|
|
64
|
+
this.props.selectedValues = [];
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.props.selectedValues = (this.field.props?.options || []).map(o => o[bindValue]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
clearRemaining(items, clear) {
|
|
71
|
+
// remove only the items after the first two
|
|
72
|
+
items.slice(2).forEach(item => clear(item));
|
|
73
|
+
}
|
|
74
|
+
toggleSummary() {
|
|
75
|
+
this.expandedSummary = !this.expandedSummary;
|
|
76
|
+
}
|
|
77
|
+
// This method will stop the event from bubbling up
|
|
78
|
+
stopBackspacePropagation(event) {
|
|
79
|
+
if (event.key === 'Backspace' || event.keyCode === 8) {
|
|
80
|
+
event.stopPropagation();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
clearSearch(event) {
|
|
84
|
+
this.searchValue = '';
|
|
85
|
+
event.stopPropagation();
|
|
86
|
+
this.filteredOptions = [...this.field.props?.options];
|
|
87
|
+
}
|
|
88
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: NgSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
89
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: NgSelectComponent, isStandalone: true, selector: "sa-ng-select", providers: [IconService], usesInheritance: true, ngImport: i0, template: "<ng-select \n[items]=\"filteredOptions\" \n[multiple]=\"props?.multiple || false\" \n[bindLabel]=\"props?.bindLabel || 'label'\"\n[closeOnSelect]=\"props?.closeOnselect || true\" \n[bindValue]=\"props?.bindValue || 'value'\"\n[placeholder]=\"props?.placeholder || 'Select Options'\" \n[searchable]=\"false\" \n[formControl]=\"formControl\"\n[clearable]=\"props?.isClearable\" \n[appearance]=\"props['appearance'] || 'outline'\" \nclass=\"ng-select-custom\">\n\n <ng-template ng-header-tmp>\n <div class=\"search-input-container mat-form-field-density-5\">\n <mat-form-field [appearance]=\"props['appearance'] || 'outline'\" class=\"w-100\">\n <sa-icon icon=\"searchIcon\" size=\"20\" matPrefix></sa-icon>\n <input matInput type=\"text\" name=\"menu-search-bar\" class=\"search-input\" (keyup)=\"onSearch($event)\"\n (keydown)=\"stopBackspacePropagation($event)\" [placeholder]=\"props?.searchPlaceholder || 'Search'\"\n [(ngModel)]=\"searchValue\" />\n <sa-icon icon=\"closeOutlined\" class=\"pointer\" size=\"15\" matSuffix\n (click)=\"clearSearch($event)\"></sa-icon>\n </mat-form-field>\n </div>\n </ng-template>\n\n <!-- Option template with a checkbox in front of each row -->\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <div class=\"option-row\">\n @if(props?.multiple){\n <input type=\"checkbox\" [checked]=\"item$.selected\" tabindex=\"-1\" />\n }\n <span class=\"option-label\">{{ item[props.bindLabel || 'label'] }}</span>\n\n </div>\n </ng-template>\n\n <!-- Selected items chip template (optional) -->\n <ng-template ng-multi-label-tmp let-items=\"items\" let-clear=\"clear\">\n <div class=\"chips ng-values-list\">\n\n <!-- If collapsed: show only first 2 + summary -->\n <ng-container *ngIf=\"!expandedSummary\">\n @for (s of items.slice(0, 2); track s[props.bindValue || 'value']) {\n <div class=\"ng-value\">\n <span class=\"ng-value-label\">{{ s[props.bindLabel || 'label'] }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(s)\"><sa-icon icon=\"closeOutlined\"\n size=\"11\"></sa-icon></span>\n </div>\n }\n\n @if (items.length > 2) {\n <div class=\"ng-value summary-chip pointer\" (click)=\"toggleSummary()\">\n <span class=\"ng-value-label\">+{{ items.length - 2 }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clearRemaining(items, clear)\"><sa-icon\n icon=\"closeOutlined\" size=\"11\"></sa-icon></span>\n </div>\n }\n </ng-container>\n\n <!-- If expanded: show all items -->\n <ng-container *ngIf=\"expandedSummary\">\n @for (s of items; track s[props.bindValue || 'value']) {\n <div class=\"ng-value\">\n <span class=\"ng-value-label\">{{ s[props.bindLabel || 'label'] }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(s)\"><sa-icon icon=\"closeOutlined\"\n size=\"11\"></sa-icon></span>\n </div>\n }\n <!-- Collapse button -->\n <div class=\"ng-value summary-chip pointer\" (click)=\"toggleSummary()\">\n <sa-icon class=\"ng-value-label\" icon=\"leftChevronOutlined\"></sa-icon>\n </div>\n </ng-container>\n\n </div>\n </ng-template>\n\n @if(props?.footer){\n <ng-template ng-footer-tmp>\n <div class=\"dropdown-footer\">{{props?.footer?.description}}</div>\n </ng-template>\n }\n\n <ng-template ng-notfound-tmp>\n <div class=\"no-results\">\n @if (searchValue?.length > 0) {\n {{ \"\u274C No items match \\\"{{ searchValue }}\\\"\" || props?.searchNotFoundText}}\n } @else {\n {{ \"\u26A0\uFE0F No options available\" || props?.notFoundText}}\n }\n </div>\n </ng-template>\n\n <ng-template ng-loadingtext-tmp>\n <div class=\"loading\">\u23F3 Loading options...</div>\n </ng-template>\n</ng-select>", styles: ["::ng-deep .ng-select-custom .search-input-container .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding:var(--small-2px, 2px) var(--small-12px, 12px)}.ng-select-custom .ng-values-list{display:flex;flex-wrap:wrap;gap:var(--small-8px, 8px)}::ng-deep .ng-select-custom.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon.right{border-left:none;display:flex;align-items:center;font-size:var(--small-6px, 6px)}::ng-deep .ng-select-custom.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value{border-radius:var(--small-4px, 4px);background:var(--grey-50, #F2F4F7);display:flex;padding:var(--small-2px, 2px) var(--small-8px, 8px);justify-content:center;align-items:center;gap:var(--small-4px, 4px)}.ng-select-custom .option-row{display:flex;width:18.75rem;height:2.5rem;padding:var(--small-12px, 12px);align-items:center;gap:var(--small-8px, 8px);flex-shrink:0}::ng-deep .ng-select-custom .mdc-form-field.mat-internal-form-field{display:flex;gap:var(--small-8px, 8px);align-items:center}::ng-deep .ng-select-custom .mdc-checkbox__ripple{display:none}::ng-deep .ng-select-custom .checkbox-style{display:flex;align-items:center}.ng-select-custom .ng-option input[type=checkbox],.ng-select input[type=checkbox]{accent-color:var(--primary-500);vertical-align:middle;width:var(--small-14px, 14px);height:var(--small-14px, 14px)}::ng-deep .ng-select-custom.ng-select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected{background-color:var(--primary-50)}.option-label{color:var(--text-high-emphasis, #1C1B20);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}::ng-deep .ng-select-custom.ng-select .search-input-container .mat-mdc-form-field{width:-webkit-fill-available}::ng-deep .ng-select-custom .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked{background-color:var(--primary-50)}::ng-deep .ng-select .ng-arrow{display:none!important}::ng-deep .ng-select .ng-arrow-wrapper{width:var(--small-12px, 12px);height:var(--small-12px, 12px);display:flex;align-items:center;justify-content:center}::ng-deep .ng-select .ng-arrow-wrapper:after{content:\"\";display:inline-block;width:var(--small-8px, 8px);height:var(--small-12px, 12px);background:url(/assets/upDownChevronOutlined.svg) no-repeat center;background-size:contain}::ng-deep .ng-select-custom.ng-select.ng-select-focused:not(.ng-select-opened)>.ng-select-container{border-color:var(--primary-500);box-shadow:none}::ng-deep .ng-select-custom.ng-select .no-results{padding:.8rem}::ng-deep .ng-select-custom.ng-select .ng-select-container{padding:0rem var(--small-12px) 0rem var(--small-12px);height:1.875rem;min-height:2.438rem;border:1px solid var(--grey-100, #EAECF0)}::ng-deep .ng-select-custom.ng-select .option-label{color:var(--text-highemphasis, #1C1B20);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}::ng-deep .ng-select-custom.ng-select .ng-value-label{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-family-roboto);font-size:.688rem;font-style:normal;font-weight:500;line-height:var(--small-16px, 16px);letter-spacing:.5px}::ng-deep .ng-select-custom.ng-select .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading,.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch,.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border-color:var(--primary-500)}::ng-deep .ng-select-custom.ng-select .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing{border-top-left-radius:0;border-top-right-radius:var(--small-4px, 4px);border-bottom-right-radius:var(--small-4px, 4px);border-bottom-left-radius:0}::ng-deep .ng-select-custom.ng-select.ng-select-single .ng-value-label{color:var(--text-highemphasis);font-family:var(--font-family-roboto);font-size:var(--small-14px);font-style:normal;font-weight:400;line-height:var(--medium-20px);letter-spacing:.25px}::ng-deep .ng-select-custom.ng-select .ng-select-container .ng-value-container .ng-placeholder{color:var(--text-low-emphasis, #9B98A3);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i3.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i3.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i3.NgMultiLabelTemplateDirective, selector: "[ng-multi-label-tmp]" }, { kind: "directive", type: i3.NgHeaderTemplateDirective, selector: "[ng-header-tmp]" }, { kind: "directive", type: i3.NgFooterTemplateDirective, selector: "[ng-footer-tmp]" }, { kind: "directive", type: i3.NgNotFoundTemplateDirective, selector: "[ng-notfound-tmp]" }, { kind: "directive", type: i3.NgLoadingTextTemplateDirective, selector: "[ng-loadingtext-tmp]" }, { kind: "component", type: IconComponent, selector: "sa-icon", inputs: ["img", "icon", "size", "color", "iconPath", "iconUrl", "customClass", "href", "hrefTarget", "iconPosition"], outputs: ["onClickEvent"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatCheckboxModule }] }); }
|
|
90
|
+
}
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: NgSelectComponent, decorators: [{
|
|
92
|
+
type: Component,
|
|
93
|
+
args: [{ selector: 'sa-ng-select', standalone: true, imports: [
|
|
94
|
+
CommonModule,
|
|
95
|
+
ReactiveFormsModule,
|
|
96
|
+
FormsModule,
|
|
97
|
+
FormlyModule,
|
|
98
|
+
NgSelectModule,
|
|
99
|
+
IconComponent,
|
|
100
|
+
MatFormFieldModule,
|
|
101
|
+
MatInputModule,
|
|
102
|
+
MatIconModule,
|
|
103
|
+
MatButtonModule,
|
|
104
|
+
MatTooltipModule,
|
|
105
|
+
MatButtonToggleModule,
|
|
106
|
+
MatDatepickerModule,
|
|
107
|
+
MatNativeDateModule,
|
|
108
|
+
MatCheckboxModule,
|
|
109
|
+
], providers: [IconService], template: "<ng-select \n[items]=\"filteredOptions\" \n[multiple]=\"props?.multiple || false\" \n[bindLabel]=\"props?.bindLabel || 'label'\"\n[closeOnSelect]=\"props?.closeOnselect || true\" \n[bindValue]=\"props?.bindValue || 'value'\"\n[placeholder]=\"props?.placeholder || 'Select Options'\" \n[searchable]=\"false\" \n[formControl]=\"formControl\"\n[clearable]=\"props?.isClearable\" \n[appearance]=\"props['appearance'] || 'outline'\" \nclass=\"ng-select-custom\">\n\n <ng-template ng-header-tmp>\n <div class=\"search-input-container mat-form-field-density-5\">\n <mat-form-field [appearance]=\"props['appearance'] || 'outline'\" class=\"w-100\">\n <sa-icon icon=\"searchIcon\" size=\"20\" matPrefix></sa-icon>\n <input matInput type=\"text\" name=\"menu-search-bar\" class=\"search-input\" (keyup)=\"onSearch($event)\"\n (keydown)=\"stopBackspacePropagation($event)\" [placeholder]=\"props?.searchPlaceholder || 'Search'\"\n [(ngModel)]=\"searchValue\" />\n <sa-icon icon=\"closeOutlined\" class=\"pointer\" size=\"15\" matSuffix\n (click)=\"clearSearch($event)\"></sa-icon>\n </mat-form-field>\n </div>\n </ng-template>\n\n <!-- Option template with a checkbox in front of each row -->\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\n <div class=\"option-row\">\n @if(props?.multiple){\n <input type=\"checkbox\" [checked]=\"item$.selected\" tabindex=\"-1\" />\n }\n <span class=\"option-label\">{{ item[props.bindLabel || 'label'] }}</span>\n\n </div>\n </ng-template>\n\n <!-- Selected items chip template (optional) -->\n <ng-template ng-multi-label-tmp let-items=\"items\" let-clear=\"clear\">\n <div class=\"chips ng-values-list\">\n\n <!-- If collapsed: show only first 2 + summary -->\n <ng-container *ngIf=\"!expandedSummary\">\n @for (s of items.slice(0, 2); track s[props.bindValue || 'value']) {\n <div class=\"ng-value\">\n <span class=\"ng-value-label\">{{ s[props.bindLabel || 'label'] }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(s)\"><sa-icon icon=\"closeOutlined\"\n size=\"11\"></sa-icon></span>\n </div>\n }\n\n @if (items.length > 2) {\n <div class=\"ng-value summary-chip pointer\" (click)=\"toggleSummary()\">\n <span class=\"ng-value-label\">+{{ items.length - 2 }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clearRemaining(items, clear)\"><sa-icon\n icon=\"closeOutlined\" size=\"11\"></sa-icon></span>\n </div>\n }\n </ng-container>\n\n <!-- If expanded: show all items -->\n <ng-container *ngIf=\"expandedSummary\">\n @for (s of items; track s[props.bindValue || 'value']) {\n <div class=\"ng-value\">\n <span class=\"ng-value-label\">{{ s[props.bindLabel || 'label'] }}</span>\n <span class=\"ng-value-icon right\" (click)=\"clear(s)\"><sa-icon icon=\"closeOutlined\"\n size=\"11\"></sa-icon></span>\n </div>\n }\n <!-- Collapse button -->\n <div class=\"ng-value summary-chip pointer\" (click)=\"toggleSummary()\">\n <sa-icon class=\"ng-value-label\" icon=\"leftChevronOutlined\"></sa-icon>\n </div>\n </ng-container>\n\n </div>\n </ng-template>\n\n @if(props?.footer){\n <ng-template ng-footer-tmp>\n <div class=\"dropdown-footer\">{{props?.footer?.description}}</div>\n </ng-template>\n }\n\n <ng-template ng-notfound-tmp>\n <div class=\"no-results\">\n @if (searchValue?.length > 0) {\n {{ \"\u274C No items match \\\"{{ searchValue }}\\\"\" || props?.searchNotFoundText}}\n } @else {\n {{ \"\u26A0\uFE0F No options available\" || props?.notFoundText}}\n }\n </div>\n </ng-template>\n\n <ng-template ng-loadingtext-tmp>\n <div class=\"loading\">\u23F3 Loading options...</div>\n </ng-template>\n</ng-select>", styles: ["::ng-deep .ng-select-custom .search-input-container .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding:var(--small-2px, 2px) var(--small-12px, 12px)}.ng-select-custom .ng-values-list{display:flex;flex-wrap:wrap;gap:var(--small-8px, 8px)}::ng-deep .ng-select-custom.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon.right{border-left:none;display:flex;align-items:center;font-size:var(--small-6px, 6px)}::ng-deep .ng-select-custom.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value{border-radius:var(--small-4px, 4px);background:var(--grey-50, #F2F4F7);display:flex;padding:var(--small-2px, 2px) var(--small-8px, 8px);justify-content:center;align-items:center;gap:var(--small-4px, 4px)}.ng-select-custom .option-row{display:flex;width:18.75rem;height:2.5rem;padding:var(--small-12px, 12px);align-items:center;gap:var(--small-8px, 8px);flex-shrink:0}::ng-deep .ng-select-custom .mdc-form-field.mat-internal-form-field{display:flex;gap:var(--small-8px, 8px);align-items:center}::ng-deep .ng-select-custom .mdc-checkbox__ripple{display:none}::ng-deep .ng-select-custom .checkbox-style{display:flex;align-items:center}.ng-select-custom .ng-option input[type=checkbox],.ng-select input[type=checkbox]{accent-color:var(--primary-500);vertical-align:middle;width:var(--small-14px, 14px);height:var(--small-14px, 14px)}::ng-deep .ng-select-custom.ng-select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected{background-color:var(--primary-50)}.option-label{color:var(--text-high-emphasis, #1C1B20);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}::ng-deep .ng-select-custom.ng-select .search-input-container .mat-mdc-form-field{width:-webkit-fill-available}::ng-deep .ng-select-custom .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked{background-color:var(--primary-50)}::ng-deep .ng-select .ng-arrow{display:none!important}::ng-deep .ng-select .ng-arrow-wrapper{width:var(--small-12px, 12px);height:var(--small-12px, 12px);display:flex;align-items:center;justify-content:center}::ng-deep .ng-select .ng-arrow-wrapper:after{content:\"\";display:inline-block;width:var(--small-8px, 8px);height:var(--small-12px, 12px);background:url(/assets/upDownChevronOutlined.svg) no-repeat center;background-size:contain}::ng-deep .ng-select-custom.ng-select.ng-select-focused:not(.ng-select-opened)>.ng-select-container{border-color:var(--primary-500);box-shadow:none}::ng-deep .ng-select-custom.ng-select .no-results{padding:.8rem}::ng-deep .ng-select-custom.ng-select .ng-select-container{padding:0rem var(--small-12px) 0rem var(--small-12px);height:1.875rem;min-height:2.438rem;border:1px solid var(--grey-100, #EAECF0)}::ng-deep .ng-select-custom.ng-select .option-label{color:var(--text-highemphasis, #1C1B20);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}::ng-deep .ng-select-custom.ng-select .ng-value-label{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-family-roboto);font-size:.688rem;font-style:normal;font-weight:500;line-height:var(--small-16px, 16px);letter-spacing:.5px}::ng-deep .ng-select-custom.ng-select .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading,.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch,.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border-color:var(--primary-500)}::ng-deep .ng-select-custom.ng-select .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing{border-top-left-radius:0;border-top-right-radius:var(--small-4px, 4px);border-bottom-right-radius:var(--small-4px, 4px);border-bottom-left-radius:0}::ng-deep .ng-select-custom.ng-select.ng-select-single .ng-value-label{color:var(--text-highemphasis);font-family:var(--font-family-roboto);font-size:var(--small-14px);font-style:normal;font-weight:400;line-height:var(--medium-20px);letter-spacing:.25px}::ng-deep .ng-select-custom.ng-select .ng-select-container .ng-value-container .ng-placeholder{color:var(--text-low-emphasis, #9B98A3);font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px}\n"] }]
|
|
110
|
+
}] });
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudC1saWJyYXJ5L3NyYy9saWIvZHJvcGRvd24vbmctc2VsZWN0L25nLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL2Ryb3Bkb3duL25nLXNlbGVjdC9uZy1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlD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LDJlQUNsQixjQUFjLDBXQUNkLGFBQWEsOEJBQ2IsZUFBZSw4QkFDZixnQkFBZ0IsOEJBQ2hCLHFCQUFxQiw4QkFDckIsbUJBQW1CLDhCQUNuQixtQkFBbUIsOEJBQ25CLGlCQUFpQjs7MkZBTVIsaUJBQWlCO2tCQXhCN0IsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixpQkFBaUI7cUJBQ2xCLGFBQ1UsQ0FBQyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERvQ2hlY2sgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1seU1vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlLCBGaWVsZFR5cGVDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IE5nU2VsZWN0TW9kdWxlIH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9pY29uL2ljb24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NhLW5nLXNlbGVjdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGb3JtbHlNb2R1bGUsXG4gICAgTmdTZWxlY3RNb2R1bGUsXG4gICAgSWNvbkNvbXBvbmVudCxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBNYXROYXRpdmVEYXRlTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtJY29uU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbmctc2VsZWN0LmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIE5nU2VsZWN0Q29tcG9uZW50IGV4dGVuZHMgRmllbGRUeXBlPEZpZWxkVHlwZUNvbmZpZzxhbnk+PiBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICBmaWx0ZXJlZE9wdGlvbnM6IGFueVtdO1xuICBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnM6IGFueVtdO1xuXG4gIG9uU2VhcmNoKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBiaW5kTGFiZWwgPSB0aGlzLnByb3BzLmJpbmRMYWJlbCB8fCAnbGFiZWwnO1xuICBcbiAgICBpZiAoIXNlYXJjaFZhbHVlKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IFsuLi4odGhpcy5maWVsZC5wcm9wcz8ub3B0aW9ucyB8fCBbXSldO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSAodGhpcy5maWVsZC5wcm9wcz8ub3B0aW9ucyB8fCBbXSkuZmlsdGVyKG9wdCA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IG9wdD8uW2JpbmRMYWJlbF0gPz8gJyc7XG4gICAgICByZXR1cm4gU3RyaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX29wdGlvbnMgPSB0aGlzLnByb3BzLm9wdGlvbnM7XG4gICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbLi4uKHRoaXMucHJvcHMub3B0aW9ucyB8fCBbXSldO1xuXG4gICAgLy8gSWYgYSBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkIGluIHByb3BzIGFuZCB0aGUgZm9ybSBjb250cm9sIGhhcyBubyB2YWx1ZSB5ZXQsIHNldCBpdFxuICAgIGNvbnN0IGRlZmF1bHRWYWwgPSB0aGlzLnByb3BzPy5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKCh0aGlzLmZvcm1Db250cm9sLnZhbHVlID09PSBudWxsIHx8IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCkgJiYgZGVmYXVsdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKGRlZmF1bHRWYWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zICE9PSB0aGlzLl9vcHRpb25zKSB7XG4gICAgICB0aGlzLl9vcHRpb25zID0gdGhpcy5wcm9wcy5vcHRpb25zO1xuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbLi4uKHRoaXMuX29wdGlvbnMgfHwgW10pXTtcbiAgICB9XG4gIH1cblxuICBcblxuICAvLyAoT3B0aW9uYWwpIFNlbGVjdC9EZXNlbGVjdCBhbGwgaGVscGVyc1xuICBhbGxTZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcz8uc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID09PSB0aGlzLmZpZWxkLnByb3BzPy5vcHRpb25zLmxlbmd0aDtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICBjb25zdCBiaW5kVmFsdWUgPSB0aGlzLnByb3BzLmJpbmRWYWx1ZSB8fCAndmFsdWUnO1xuICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMucHJvcHMuc2VsZWN0ZWRWYWx1ZXMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlcyA9ICh0aGlzLmZpZWxkLnByb3BzPy5vcHRpb25zIHx8IFtdKS5tYXAobyA9PiBvW2JpbmRWYWx1ZV0pO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyUmVtYWluaW5nKGl0ZW1zOiBhbnlbXSwgY2xlYXI6IChpdGVtOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyByZW1vdmUgb25seSB0aGUgaXRlbXMgYWZ0ZXIgdGhlIGZpcnN0IHR3b1xuICAgIGl0ZW1zLnNsaWNlKDIpLmZvckVhY2goaXRlbSA9PiBjbGVhcihpdGVtKSk7XG4gIH1cbiAgZXhwYW5kZWRTdW1tYXJ5ID0gZmFsc2U7XG5cbiAgdG9nZ2xlU3VtbWFyeSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkU3VtbWFyeSA9ICF0aGlzLmV4cGFuZGVkU3VtbWFyeTtcbiAgfVxuXG4gIC8vIFRoaXMgbWV0aG9kIHdpbGwgc3RvcCB0aGUgZXZlbnQgZnJvbSBidWJibGluZyB1cFxuICBzdG9wQmFja3NwYWNlUHJvcGFnYXRpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fCBldmVudC5rZXlDb2RlID09PSA4KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclNlYXJjaChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbLi4udGhpcy5maWVsZC5wcm9wcz8ub3B0aW9uc107XG4gIH1cbn1cbiIsIjxuZy1zZWxlY3QgXG5baXRlbXNdPVwiZmlsdGVyZWRPcHRpb25zXCIgXG5bbXVsdGlwbGVdPVwicHJvcHM/Lm11bHRpcGxlIHx8IGZhbHNlXCIgXG5bYmluZExhYmVsXT1cInByb3BzPy5iaW5kTGFiZWwgfHwgJ2xhYmVsJ1wiXG5bY2xvc2VPblNlbGVjdF09XCJwcm9wcz8uY2xvc2VPbnNlbGVjdCB8fCB0cnVlXCIgXG5bYmluZFZhbHVlXT1cInByb3BzPy5iaW5kVmFsdWUgfHwgJ3ZhbHVlJ1wiXG5bcGxhY2Vob2xkZXJdPVwicHJvcHM/LnBsYWNlaG9sZGVyIHx8ICdTZWxlY3QgT3B0aW9ucydcIiBcbltzZWFyY2hhYmxlXT1cImZhbHNlXCIgXG5bZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuW2NsZWFyYWJsZV09XCJwcm9wcz8uaXNDbGVhcmFibGVcIiBcblthcHBlYXJhbmNlXT1cInByb3BzWydhcHBlYXJhbmNlJ10gfHwgJ291dGxpbmUnXCIgXG5jbGFzcz1cIm5nLXNlbGVjdC1jdXN0b21cIj5cblxuICAgIDxuZy10ZW1wbGF0ZSBuZy1oZWFkZXItdG1wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0LWNvbnRhaW5lciBtYXQtZm9ybS1maWVsZC1kZW5zaXR5LTVcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJwcm9wc1snYXBwZWFyYW5jZSddIHx8ICdvdXRsaW5lJ1wiIGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICA8c2EtaWNvbiBpY29uPVwic2VhcmNoSWNvblwiIHNpemU9XCIyMFwiIG1hdFByZWZpeD48L3NhLWljb24+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm1lbnUtc2VhcmNoLWJhclwiIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKGtleXVwKT1cIm9uU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJzdG9wQmFja3NwYWNlUHJvcGFnYXRpb24oJGV2ZW50KVwiIFtwbGFjZWhvbGRlcl09XCJwcm9wcz8uc2VhcmNoUGxhY2Vob2xkZXIgfHwgJ1NlYXJjaCdcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCIgLz5cbiAgICAgICAgICAgICAgICA8c2EtaWNvbiBpY29uPVwiY2xvc2VPdXRsaW5lZFwiIGNsYXNzPVwicG9pbnRlclwiIHNpemU9XCIxNVwiIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiPjwvc2EtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIE9wdGlvbiB0ZW1wbGF0ZSB3aXRoIGEgY2hlY2tib3ggaW4gZnJvbnQgb2YgZWFjaCByb3cgLS0+XG4gICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWl0ZW0kPVwiaXRlbSRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1yb3dcIj5cbiAgICAgICAgICAgIEBpZihwcm9wcz8ubXVsdGlwbGUpe1xuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIml0ZW0kLnNlbGVjdGVkXCIgdGFiaW5kZXg9XCItMVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiPnt7IGl0ZW1bcHJvcHMuYmluZExhYmVsIHx8ICdsYWJlbCddIH19PC9zcGFuPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFNlbGVjdGVkIGl0ZW1zIGNoaXAgdGVtcGxhdGUgKG9wdGlvbmFsKSAtLT5cbiAgICA8bmctdGVtcGxhdGUgbmctbXVsdGktbGFiZWwtdG1wIGxldC1pdGVtcz1cIml0ZW1zXCIgbGV0LWNsZWFyPVwiY2xlYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBzIG5nLXZhbHVlcy1saXN0XCI+XG5cbiAgICAgICAgICAgIDwhLS0gSWYgY29sbGFwc2VkOiBzaG93IG9ubHkgZmlyc3QgMiArIHN1bW1hcnkgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWV4cGFuZGVkU3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHMgb2YgaXRlbXMuc2xpY2UoMCwgMik7IHRyYWNrIHNbcHJvcHMuYmluZFZhbHVlIHx8ICd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5nLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmctdmFsdWUtbGFiZWxcIj57eyBzW3Byb3BzLmJpbmRMYWJlbCB8fCAnbGFiZWwnXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1pY29uIHJpZ2h0XCIgKGNsaWNrKT1cImNsZWFyKHMpXCI+PHNhLWljb24gaWNvbj1cImNsb3NlT3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCIxMVwiPjwvc2EtaWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChpdGVtcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5nLXZhbHVlIHN1bW1hcnktY2hpcCBwb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZVN1bW1hcnkoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5nLXZhbHVlLWxhYmVsXCI+K3t7IGl0ZW1zLmxlbmd0aCAtIDIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmctdmFsdWUtaWNvbiByaWdodFwiIChjbGljayk9XCJjbGVhclJlbWFpbmluZyhpdGVtcywgY2xlYXIpXCI+PHNhLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY2xvc2VPdXRsaW5lZFwiIHNpemU9XCIxMVwiPjwvc2EtaWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gSWYgZXhwYW5kZWQ6IHNob3cgYWxsIGl0ZW1zIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGVkU3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHMgb2YgaXRlbXM7IHRyYWNrIHNbcHJvcHMuYmluZFZhbHVlIHx8ICd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5nLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmctdmFsdWUtbGFiZWxcIj57eyBzW3Byb3BzLmJpbmRMYWJlbCB8fCAnbGFiZWwnXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1pY29uIHJpZ2h0XCIgKGNsaWNrKT1cImNsZWFyKHMpXCI+PHNhLWljb24gaWNvbj1cImNsb3NlT3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCIxMVwiPjwvc2EtaWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwhLS0gQ29sbGFwc2UgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZy12YWx1ZSBzdW1tYXJ5LWNoaXAgcG9pbnRlclwiIChjbGljayk9XCJ0b2dnbGVTdW1tYXJ5KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNhLWljb24gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiIGljb249XCJsZWZ0Q2hldnJvbk91dGxpbmVkXCI+PC9zYS1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIEBpZihwcm9wcz8uZm9vdGVyKXtcbiAgICA8bmctdGVtcGxhdGUgbmctZm9vdGVyLXRtcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWZvb3RlclwiPnt7cHJvcHM/LmZvb3Rlcj8uZGVzY3JpcHRpb259fTwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgfVxuXG4gICAgPG5nLXRlbXBsYXRlIG5nLW5vdGZvdW5kLXRtcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXJlc3VsdHNcIj5cbiAgICAgICAgICBAaWYgKHNlYXJjaFZhbHVlPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgIHt7IFwi4p2MIE5vIGl0ZW1zIG1hdGNoIFxcXCJ7eyBzZWFyY2hWYWx1ZSB9fVxcXCJcIiB8fCBwcm9wcz8uc2VhcmNoTm90Rm91bmRUZXh0fX1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIHt7IFwi4pqg77iPIE5vIG9wdGlvbnMgYXZhaWxhYmxlXCIgfHwgcHJvcHM/Lm5vdEZvdW5kVGV4dH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgbmctbG9hZGluZ3RleHQtdG1wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZ1wiPuKPsyBMb2FkaW5nIG9wdGlvbnMuLi48L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy1zZWxlY3Q+Il19
|