fx-form-builder-wrapper 2.0.90 → 2.0.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/uploader/uploader.component.mjs +36 -13
- package/fesm2022/fx-form-builder-wrapper.mjs +34 -11
- package/fesm2022/fx-form-builder-wrapper.mjs.map +1 -1
- package/package.json +1 -1
- package/esm2022/lib/components/customize-dropdown/customize-dropdown.component.mjs +0 -317
- package/esm2022/lib/components/multiselect-with-form-fields/customize-dropdown.component.mjs +0 -243
- package/esm2022/lib/components/multiselect-with-form-fields/multiselect-dropdown.component.mjs +0 -166
- package/lib/components/customize-dropdown/customize-dropdown.component.d.ts +0 -60
- package/lib/components/multiselect-with-form-fields/customize-dropdown.component.d.ts +0 -59
- package/lib/components/multiselect-with-form-fields/multiselect-dropdown.component.d.ts +0 -51
package/esm2022/lib/components/multiselect-with-form-fields/customize-dropdown.component.mjs
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component } from '@angular/core';
|
|
3
|
-
import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
5
|
-
import { FxBaseComponent, FxComponent, FxSelectSetting, FxStringSetting, FxValidatorService } from '@instantsys-labs/fx';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
import * as i2 from "../../fx-builder-wrapper.service";
|
|
9
|
-
import * as i3 from "@instantsys-labs/core";
|
|
10
|
-
import * as i4 from "@angular/forms";
|
|
11
|
-
import * as i5 from "@angular/common";
|
|
12
|
-
export class CustomizeDropdownComponent extends FxBaseComponent {
|
|
13
|
-
cdr;
|
|
14
|
-
http;
|
|
15
|
-
fxBuilderWrapperService;
|
|
16
|
-
fxApiService;
|
|
17
|
-
fb;
|
|
18
|
-
eRef;
|
|
19
|
-
destroy$ = new Subject();
|
|
20
|
-
form;
|
|
21
|
-
formObject = {};
|
|
22
|
-
dropdownOpen = false;
|
|
23
|
-
formSubmitted = false;
|
|
24
|
-
findingsOptions = [
|
|
25
|
-
{
|
|
26
|
-
label: 'Proclination',
|
|
27
|
-
value: 'proclination',
|
|
28
|
-
info: 'Forward inclination of teeth',
|
|
29
|
-
selected: false,
|
|
30
|
-
subOptions: [
|
|
31
|
-
{ label: 'Mild', value: 'mild' },
|
|
32
|
-
{ label: 'Moderate', value: 'moderate' },
|
|
33
|
-
{ label: 'Severe', value: 'severe' }
|
|
34
|
-
]
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
label: 'Crowding',
|
|
38
|
-
value: 'crowding',
|
|
39
|
-
selected: false,
|
|
40
|
-
subOptions: [
|
|
41
|
-
{ label: 'Mild', value: 'mild' },
|
|
42
|
-
{ label: 'Moderate', value: 'moderate' },
|
|
43
|
-
{ label: 'Severe', value: 'severe' }
|
|
44
|
-
]
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
label: 'Spacing',
|
|
48
|
-
value: 'spacing',
|
|
49
|
-
selected: false,
|
|
50
|
-
subOptions: [
|
|
51
|
-
{ label: 'Mild', value: 'mild' },
|
|
52
|
-
{ label: 'Moderate', value: 'moderate' },
|
|
53
|
-
{ label: 'Severe', value: 'severe' }
|
|
54
|
-
]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
label: 'Retroclination',
|
|
58
|
-
value: 'retroclination',
|
|
59
|
-
info: 'Backward inclination of teeth',
|
|
60
|
-
selected: false
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
label: 'Rotation',
|
|
64
|
-
value: 'rotation',
|
|
65
|
-
selected: false
|
|
66
|
-
}
|
|
67
|
-
];
|
|
68
|
-
config = {
|
|
69
|
-
displayMode: 'ellipsis',
|
|
70
|
-
placeholderLabel: 'Select Finding'
|
|
71
|
-
};
|
|
72
|
-
constructor(cdr, http, fxBuilderWrapperService, fxApiService, fb, eRef) {
|
|
73
|
-
super(cdr);
|
|
74
|
-
this.cdr = cdr;
|
|
75
|
-
this.http = http;
|
|
76
|
-
this.fxBuilderWrapperService = fxBuilderWrapperService;
|
|
77
|
-
this.fxApiService = fxApiService;
|
|
78
|
-
this.fb = fb;
|
|
79
|
-
this.eRef = eRef;
|
|
80
|
-
this.form = this.fb.group({
|
|
81
|
-
findings: this.fb.array([]) // Initially an empty array
|
|
82
|
-
});
|
|
83
|
-
// Initialize the form array
|
|
84
|
-
this.updateFindingsArray();
|
|
85
|
-
this.onInit.subscribe(() => this._register(this.form));
|
|
86
|
-
}
|
|
87
|
-
ngAfterViewInit() {
|
|
88
|
-
setTimeout(() => {
|
|
89
|
-
const data = [
|
|
90
|
-
{
|
|
91
|
-
"value": "proclination",
|
|
92
|
-
"subSelection": { "label": "Mild", "value": "mild" }
|
|
93
|
-
},
|
|
94
|
-
];
|
|
95
|
-
this.patchExistingValues(data);
|
|
96
|
-
}, 2000);
|
|
97
|
-
}
|
|
98
|
-
updateFindingsArray() {
|
|
99
|
-
const findingsFormArray = this.form.get('findings');
|
|
100
|
-
findingsFormArray.clear();
|
|
101
|
-
this.findingsOptions.forEach((option) => {
|
|
102
|
-
if (option.selected) {
|
|
103
|
-
findingsFormArray.push(this.fb.group({
|
|
104
|
-
value: [option.value],
|
|
105
|
-
subSelection: [option.subSelection]
|
|
106
|
-
}));
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
ngOnInit() {
|
|
111
|
-
this.fxBuilderWrapperService.variables$
|
|
112
|
-
.pipe(takeUntil(this.destroy$))
|
|
113
|
-
.subscribe((variables) => {
|
|
114
|
-
console.log("Variables", variables);
|
|
115
|
-
});
|
|
116
|
-
const serviceUrl = this.fxApiService.getServiceUrl(this.setting('serviceName'));
|
|
117
|
-
this.getOptions(serviceUrl, this.setting('clinicalNotesURL'));
|
|
118
|
-
}
|
|
119
|
-
getOptions(serviceUrl, url) {
|
|
120
|
-
const finalUrl = serviceUrl + url;
|
|
121
|
-
this.http.get(finalUrl).subscribe({
|
|
122
|
-
next: (response) => {
|
|
123
|
-
// Handle API response
|
|
124
|
-
},
|
|
125
|
-
error: (err) => console.error('Error fetching options', err)
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
settings() {
|
|
129
|
-
return [
|
|
130
|
-
new FxSelectSetting({ key: 'displayMode', $title: 'Display Mode', value: 'ellipsis' }, [{ option: 'Ellipsis', value: 'ellipsis' }, { option: 'Compact', value: 'compact' }]),
|
|
131
|
-
new FxStringSetting({ key: 'placeholderLabel', $title: 'Placeholder', value: 'Select Options' }),
|
|
132
|
-
];
|
|
133
|
-
}
|
|
134
|
-
validations() {
|
|
135
|
-
return [FxValidatorService.required];
|
|
136
|
-
}
|
|
137
|
-
/** Dropdown Behavior **/
|
|
138
|
-
toggleDropdown() {
|
|
139
|
-
this.dropdownOpen = !this.dropdownOpen;
|
|
140
|
-
}
|
|
141
|
-
toggleOption(option, event) {
|
|
142
|
-
event.stopPropagation();
|
|
143
|
-
option.selected = !option.selected;
|
|
144
|
-
const index = this.findingsOptions.findIndex(o => o.value === option.value);
|
|
145
|
-
const control = this.form.get('findings').at(index);
|
|
146
|
-
if (option.selected && option.subOptions?.length) {
|
|
147
|
-
control.get('subSelection')?.setValidators(Validators.required);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
control.get('subSelection')?.clearValidators();
|
|
151
|
-
control.get('subSelection')?.setValue(null);
|
|
152
|
-
}
|
|
153
|
-
control.get('subSelection')?.updateValueAndValidity();
|
|
154
|
-
this.cdr.detectChanges();
|
|
155
|
-
}
|
|
156
|
-
/** Form & Label Helpers **/
|
|
157
|
-
get hasSelectedFindings() {
|
|
158
|
-
return this.findingsOptions.some(f => f.selected);
|
|
159
|
-
}
|
|
160
|
-
get selectedFindingsLabel() {
|
|
161
|
-
const selected = this.findingsOptions
|
|
162
|
-
.filter(f => {
|
|
163
|
-
if (f.selected) {
|
|
164
|
-
// If finding has sub-options → only show if a sub-option is selected
|
|
165
|
-
if (f.subOptions?.length) {
|
|
166
|
-
return !!f.subSelection;
|
|
167
|
-
}
|
|
168
|
-
// If no sub-options → always show
|
|
169
|
-
return true;
|
|
170
|
-
}
|
|
171
|
-
return false;
|
|
172
|
-
})
|
|
173
|
-
.map(f => f.label);
|
|
174
|
-
if (selected.length === 0)
|
|
175
|
-
return this.setting('placeholderLabel');
|
|
176
|
-
// Display mode logic (Compact or Ellipsis)
|
|
177
|
-
const maxCount = this.setting('displayMode') === 'compact' ? 2 : 3;
|
|
178
|
-
if (this.setting('displayMode') === 'compact') {
|
|
179
|
-
return selected.length <= maxCount
|
|
180
|
-
? selected.join(', ')
|
|
181
|
-
: `${selected.slice(0, maxCount).join(', ')} +${selected.length - maxCount} more`;
|
|
182
|
-
}
|
|
183
|
-
if (this.setting('displayMode') === 'ellipsis') {
|
|
184
|
-
return selected.length > maxCount
|
|
185
|
-
? `${selected.slice(0, maxCount).join(', ')}, ...`
|
|
186
|
-
: selected.join(', ');
|
|
187
|
-
}
|
|
188
|
-
return selected.join(', ');
|
|
189
|
-
}
|
|
190
|
-
/** Update Findings + Validation **/
|
|
191
|
-
updateFindings() {
|
|
192
|
-
const selected = this.findingsOptions
|
|
193
|
-
.filter(f => {
|
|
194
|
-
if (f.selected) {
|
|
195
|
-
// Only include in final form if:
|
|
196
|
-
// - no subOptions, or
|
|
197
|
-
// - subOptions with valid subSelection
|
|
198
|
-
if (f.subOptions?.length) {
|
|
199
|
-
return !!f.subSelection;
|
|
200
|
-
}
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
return false;
|
|
204
|
-
})
|
|
205
|
-
.map(f => {
|
|
206
|
-
const sub = f.subOptions?.find(s => s.value === f.subSelection) || null;
|
|
207
|
-
return {
|
|
208
|
-
label: f.label,
|
|
209
|
-
value: f.value,
|
|
210
|
-
subSelection: sub ? { label: sub.label, value: sub.value } : null
|
|
211
|
-
};
|
|
212
|
-
});
|
|
213
|
-
// Update reactive form value
|
|
214
|
-
this.form.patchValue({ findings: selected }, { emitEvent: false });
|
|
215
|
-
// Validation logic remains same
|
|
216
|
-
const invalidItems = this.findingsOptions.filter(f => f.selected && f.subOptions && !f.subSelection);
|
|
217
|
-
this.form.get('findings')?.setErrors(invalidItems.length > 0 ? { missingSubSelection: true } : null);
|
|
218
|
-
}
|
|
219
|
-
patchExistingValues(data) {
|
|
220
|
-
const formArray = this.form.get('findings');
|
|
221
|
-
formArray.clear();
|
|
222
|
-
this.findingsOptions.forEach(opt => {
|
|
223
|
-
const match = data.find(x => x.value === opt.value);
|
|
224
|
-
opt.selected = !!match;
|
|
225
|
-
opt.subSelection = match?.subSelection?.value || null;
|
|
226
|
-
if (opt.selected) {
|
|
227
|
-
formArray.push(this.fb.group({
|
|
228
|
-
value: [opt.value],
|
|
229
|
-
subSelection: [opt.subSelection]
|
|
230
|
-
}));
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
this.cdr.detectChanges();
|
|
234
|
-
this.updateFindings();
|
|
235
|
-
}
|
|
236
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomizeDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.FxBuilderWrapperService }, { token: i3.ApiServiceRegistry }, { token: i4.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
237
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomizeDropdownComponent, isStandalone: true, selector: "lib-customize-dropdown", usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"container\">\r\n <form [formGroup]=\"form\" class=\"relative\">\r\n <!-- Header -->\r\n <div #dropdownWrapper class=\"relative w-80\">\r\n <button type=\"button\"\r\n class=\"w-full border border-gray-300 rounded-md px-3 py-2 flex justify-between items-center bg-white text-gray-700 hover:border-blue-400\"\r\n (click)=\"toggleDropdown()\">\r\n <span *ngIf=\"hasSelectedFindings; else placeholder\">\r\n {{ selectedFindingsLabel }}\r\n </span>\r\n <ng-template #placeholder>\r\n {{ setting('placeholderLabel') }}\r\n </ng-template>\r\n <svg class=\"w-5 h-5 ml-2 text-gray-500 transform transition-transform duration-200\"\r\n [class.rotate-180]=\"dropdownOpen\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Panel -->\r\n <div *ngIf=\"dropdownOpen\"\r\n class=\"absolute mt-1 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-64 overflow-y-auto z-10\">\r\n <div *ngFor=\"let option of findingsOptions; let i = index\"\r\n class=\"border-b border-gray-100 last:border-none p-2 hover:bg-gray-50 cursor-pointer\"\r\n (click)=\"$event.stopPropagation()\">\r\n <!-- Checkbox + Label -->\r\n <div class=\"flex items-center gap-2\">\r\n <input type=\"checkbox\" class=\"w-4 h-4 text-blue-500 border-gray-300 rounded cursor-pointer\"\r\n [(ngModel)]=\"option.selected\" [ngModelOptions]=\"{ standalone: true }\"\r\n (click)=\"toggleOption(option, $event)\" />\r\n <label class=\"text-gray-800 font-medium cursor-pointer select-none\"\r\n (click)=\"toggleOption(option, $event)\">\r\n {{ option.label }}\r\n </label>\r\n\r\n <span *ngIf=\"option.info\" class=\"ml-auto text-blue-500 text-sm cursor-pointer\" title=\"{{ option.info }}\">\r\n \u24D8\r\n </span>\r\n </div>\r\n\r\n <!-- Radios (sub-options) -->\r\n <div class=\"flex items-center flex-wrap gap-4 ml-6 mt-2 text-sm\"\r\n *ngIf=\"option.selected && option.subOptions\">\r\n <ng-container *ngFor=\"let s of option.subOptions\">\r\n <label class=\"flex items-center space-x-1 cursor-pointer\"\r\n (click)=\"option.subSelection = s.value; option.touched = true; updateFindings()\">\r\n <input type=\"radio\" [name]=\"option.value\" [value]=\"s.value\" [(ngModel)]=\"option.subSelection\"\r\n [ngModelOptions]=\"{ standalone: true }\" class=\"text-blue-600 cursor-pointer\" />\r\n <span>{{ s.label }}</span>\r\n </label>\r\n </ng-container>\r\n\r\n <!-- Validation Message (if sub-selection is missing) -->\r\n <div *ngIf=\"option.selected && option.subOptions && !option.subSelection\"\r\n class=\"text-red-500 text-xs mt-1 w-full ml-1\">\r\n Please select one option\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</fx-component>\r\n", styles: [".container{width:300px}.dropdown{position:relative;-webkit-user-select:none;user-select:none}.dropdown-header{border:1px solid #ccc;border-radius:4px;padding:6px 8px;background-color:#fff;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.dropdown-panel{position:absolute;width:100%;background:#fff;border:1px solid #ddd;margin-top:4px;border-radius:4px;max-height:250px;overflow-y:auto;z-index:1000;box-shadow:0 2px 8px #0000001a}.dropdown-item{padding:4px 8px;border-bottom:1px solid #f1f1f1}.dropdown-item:last-child{border-bottom:none}.item-header{display:flex;align-items:center;gap:6px}.label{cursor:pointer;flex-grow:1}.info{margin-left:auto;cursor:help;font-size:12px;color:#666}.sub-options{display:flex;align-items:center;flex-wrap:wrap;padding-left:22px;font-size:13px;margin-top:4px}.error{color:#e63946;font-size:11px;margin-left:22px;margin-top:2px}.arrow{font-size:10px;color:#555}.submit-btn{margin-top:1rem;padding:6px 12px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }] });
|
|
238
|
-
}
|
|
239
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomizeDropdownComponent, decorators: [{
|
|
240
|
-
type: Component,
|
|
241
|
-
args: [{ selector: 'lib-customize-dropdown', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule, FxComponent], template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"container\">\r\n <form [formGroup]=\"form\" class=\"relative\">\r\n <!-- Header -->\r\n <div #dropdownWrapper class=\"relative w-80\">\r\n <button type=\"button\"\r\n class=\"w-full border border-gray-300 rounded-md px-3 py-2 flex justify-between items-center bg-white text-gray-700 hover:border-blue-400\"\r\n (click)=\"toggleDropdown()\">\r\n <span *ngIf=\"hasSelectedFindings; else placeholder\">\r\n {{ selectedFindingsLabel }}\r\n </span>\r\n <ng-template #placeholder>\r\n {{ setting('placeholderLabel') }}\r\n </ng-template>\r\n <svg class=\"w-5 h-5 ml-2 text-gray-500 transform transition-transform duration-200\"\r\n [class.rotate-180]=\"dropdownOpen\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Panel -->\r\n <div *ngIf=\"dropdownOpen\"\r\n class=\"absolute mt-1 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-64 overflow-y-auto z-10\">\r\n <div *ngFor=\"let option of findingsOptions; let i = index\"\r\n class=\"border-b border-gray-100 last:border-none p-2 hover:bg-gray-50 cursor-pointer\"\r\n (click)=\"$event.stopPropagation()\">\r\n <!-- Checkbox + Label -->\r\n <div class=\"flex items-center gap-2\">\r\n <input type=\"checkbox\" class=\"w-4 h-4 text-blue-500 border-gray-300 rounded cursor-pointer\"\r\n [(ngModel)]=\"option.selected\" [ngModelOptions]=\"{ standalone: true }\"\r\n (click)=\"toggleOption(option, $event)\" />\r\n <label class=\"text-gray-800 font-medium cursor-pointer select-none\"\r\n (click)=\"toggleOption(option, $event)\">\r\n {{ option.label }}\r\n </label>\r\n\r\n <span *ngIf=\"option.info\" class=\"ml-auto text-blue-500 text-sm cursor-pointer\" title=\"{{ option.info }}\">\r\n \u24D8\r\n </span>\r\n </div>\r\n\r\n <!-- Radios (sub-options) -->\r\n <div class=\"flex items-center flex-wrap gap-4 ml-6 mt-2 text-sm\"\r\n *ngIf=\"option.selected && option.subOptions\">\r\n <ng-container *ngFor=\"let s of option.subOptions\">\r\n <label class=\"flex items-center space-x-1 cursor-pointer\"\r\n (click)=\"option.subSelection = s.value; option.touched = true; updateFindings()\">\r\n <input type=\"radio\" [name]=\"option.value\" [value]=\"s.value\" [(ngModel)]=\"option.subSelection\"\r\n [ngModelOptions]=\"{ standalone: true }\" class=\"text-blue-600 cursor-pointer\" />\r\n <span>{{ s.label }}</span>\r\n </label>\r\n </ng-container>\r\n\r\n <!-- Validation Message (if sub-selection is missing) -->\r\n <div *ngIf=\"option.selected && option.subOptions && !option.subSelection\"\r\n class=\"text-red-500 text-xs mt-1 w-full ml-1\">\r\n Please select one option\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</fx-component>\r\n", styles: [".container{width:300px}.dropdown{position:relative;-webkit-user-select:none;user-select:none}.dropdown-header{border:1px solid #ccc;border-radius:4px;padding:6px 8px;background-color:#fff;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.dropdown-panel{position:absolute;width:100%;background:#fff;border:1px solid #ddd;margin-top:4px;border-radius:4px;max-height:250px;overflow-y:auto;z-index:1000;box-shadow:0 2px 8px #0000001a}.dropdown-item{padding:4px 8px;border-bottom:1px solid #f1f1f1}.dropdown-item:last-child{border-bottom:none}.item-header{display:flex;align-items:center;gap:6px}.label{cursor:pointer;flex-grow:1}.info{margin-left:auto;cursor:help;font-size:12px;color:#666}.sub-options{display:flex;align-items:center;flex-wrap:wrap;padding-left:22px;font-size:13px;margin-top:4px}.error{color:#e63946;font-size:11px;margin-left:22px;margin-top:2px}.arrow{font-size:10px;color:#555}.submit-btn{margin-top:1rem;padding:6px 12px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer}\n"] }]
|
|
242
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.FxBuilderWrapperService }, { type: i3.ApiServiceRegistry }, { type: i4.FormBuilder }, { type: i0.ElementRef }] });
|
|
243
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9taXplLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z4LWJ1aWxkZXItd3JhcHBlci9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGlzZWxlY3Qtd2l0aC1mb3JtLWZpZWxkcy9jdXN0b21pemUtZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy9tdWx0aXNlbGVjdC13aXRoLWZvcm0tZmllbGRzL2N1c3RvbWl6ZS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFvQyxTQUFTLEVBQXNCLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBcUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pILE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsV0FBVyxFQUNYLGVBQWUsRUFFZixlQUFlLEVBRWYsa0JBQWtCLEVBQ25CLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUErQjdCLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxlQUFlO0lBMERuRDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUE5REYsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDMUMsSUFBSSxDQUFhO0lBQ2pCLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFDeEIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLGVBQWUsR0FBMkI7UUFDeEM7WUFDRSxLQUFLLEVBQUUsY0FBYztZQUNy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QztRQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzt3R0ExUFUsMEJBQTBCOzRGQUExQiwwQkFBMEIseUdDN0N2Qyx1NkdBaUVBLDhrQ0R4QlksWUFBWSwrUEFBQyxXQUFXLHV2Q0FBQyxtQkFBbUIsZ0xBQUMsV0FBVzs7NEZBSXZELDBCQUEwQjtrQkFQdEMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFDLFdBQVcsRUFBQyxtQkFBbUIsRUFBQyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRnhCYXNlQ29tcG9uZW50LFxyXG4gIEZ4Q29tcG9uZW50LFxyXG4gIEZ4U2VsZWN0U2V0dGluZyxcclxuICBGeFNldHRpbmcsXHJcbiAgRnhTdHJpbmdTZXR0aW5nLFxyXG4gIEZ4VmFsaWRhdGlvbixcclxuICBGeFZhbGlkYXRvclNlcnZpY2VcclxufSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcblxyXG5pbnRlcmZhY2UgU3ViT3B0aW9uIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBDdXN0b21Ecm9wZG93bk9wdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIGluZm8/OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XHJcbiAgc3ViT3B0aW9ucz86IFN1Yk9wdGlvbltdO1xyXG4gIHN1YlNlbGVjdGlvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIHRvdWNoZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ3VzdG9tRHJvcGRvd25Db25maWcge1xyXG4gIGRpc3BsYXlNb2RlPzogJ2NvbXBhY3QnIHwgJ2VsbGlwc2lzJztcclxuICBwbGFjZWhvbGRlckxhYmVsPzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jdXN0b21pemUtZHJvcGRvd24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSxGb3Jtc01vZHVsZSxSZWFjdGl2ZUZvcm1zTW9kdWxlLEZ4Q29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9taXplLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jdXN0b21pemUtZHJvcGRvd24uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21pemVEcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBmb3JtT2JqZWN0OiBvYmplY3QgPSB7fTtcclxuICBkcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBmb3JtU3VibWl0dGVkID0gZmFsc2U7XHJcblxyXG4gIGZpbmRpbmdzT3B0aW9uczogQ3VzdG9tRHJvcGRvd25PcHRpb25bXSA9IFtcclxuICAgIHtcclxuICAgICAgbGFiZWw6ICdQcm9jbGluYXRpb24nLFxyXG4gICAgICB2YWx1ZTogJ3Byb2NsaW5hdGlvbicsXHJcbiAgICAgIGluZm86ICdGb3J3YXJkIGluY2xpbmF0aW9uIG9mIHRlZXRoJyxcclxuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICBzdWJPcHRpb25zOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ01pbGQnLCB2YWx1ZTogJ21pbGQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ01vZGVyYXRlJywgdmFsdWU6ICdtb2RlcmF0ZScgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU2V2ZXJlJywgdmFsdWU6ICdzZXZlcmUnIH1cclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6ICdDcm93ZGluZycsXHJcbiAgICAgIHZhbHVlOiAnY3Jvd2RpbmcnLFxyXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIHN1Yk9wdGlvbnM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnTWlsZCcsIHZhbHVlOiAnbWlsZCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnTW9kZXJhdGUnLCB2YWx1ZTogJ21vZGVyYXRlJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdTZXZlcmUnLCB2YWx1ZTogJ3NldmVyZScgfVxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDogJ1NwYWNpbmcnLFxyXG4gICAgICB2YWx1ZTogJ3NwYWNpbmcnLFxyXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIHN1Yk9wdGlvbnM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnTWlsZCcsIHZhbHVlOiAnbWlsZCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnTW9kZXJhdGUnLCB2YWx1ZTogJ21vZGVyYXRlJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdTZXZlcmUnLCB2YWx1ZTogJ3NldmVyZScgfVxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDogJ1JldHJvY2xpbmF0aW9uJyxcclxuICAgICAgdmFsdWU6ICdyZXRyb2NsaW5hdGlvbicsXHJcbiAgICAgIGluZm86ICdCYWNrd2FyZCBpbmNsaW5hdGlvbiBvZiB0ZWV0aCcsXHJcbiAgICAgIHNlbGVjdGVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6ICdSb3RhdGlvbicsXHJcbiAgICAgIHZhbHVlOiAncm90YXRpb24nLFxyXG4gICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgIH1cclxuICBdO1xyXG5cclxuICBjb25maWc6IEN1c3RvbURyb3Bkb3duQ29uZmlnID0ge1xyXG4gICAgZGlzcGxheU1vZGU6ICdlbGxpcHNpcycsXHJcbiAgICBwbGFjZWhvbGRlckxhYmVsOiAnU2VsZWN0IEZpbmRpbmcnXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZnhBcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlUmVnaXN0cnksXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZlxyXG4gICkge1xyXG4gICAgc3VwZXIoY2RyKTtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaW5kaW5nczogdGhpcy5mYi5hcnJheShbXSkgIC8vIEluaXRpYWxseSBhbiBlbXB0eSBhcnJheVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZm9ybSBhcnJheVxyXG4gICAgdGhpcy51cGRhdGVGaW5kaW5nc0FycmF5KCk7XHJcbiAgICB0aGlzLm9uSW5pdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVnaXN0ZXIodGhpcy5mb3JtKSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBcInZhbHVlXCI6IFwicHJvY2xpbmF0aW9uXCIsXHJcbiAgICAgICAgICBcInN1YlNlbGVjdGlvblwiOiB7IFwibGFiZWxcIjogXCJNaWxkXCIsIFwidmFsdWVcIjogXCJtaWxkXCIgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIF1cclxuICAgICAgdGhpcy5wYXRjaEV4aXN0aW5nVmFsdWVzKGRhdGEpO1xyXG4gICAgfSwgMjAwMCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaW5kaW5nc0FycmF5KCkge1xyXG4gICAgY29uc3QgZmluZGluZ3NGb3JtQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdmaW5kaW5ncycpIGFzIEZvcm1BcnJheTtcclxuICAgIGZpbmRpbmdzRm9ybUFycmF5LmNsZWFyKCk7XHJcbiAgICB0aGlzLmZpbmRpbmdzT3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkge1xyXG4gICAgICAgIGZpbmRpbmdzRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICB2YWx1ZTogW29wdGlvbi52YWx1ZV0sXHJcbiAgICAgICAgICBzdWJTZWxlY3Rpb246IFtvcHRpb24uc3ViU2VsZWN0aW9uXVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJWYXJpYWJsZXNcIiwgdmFyaWFibGVzKTtcclxuICAgICAgfSk7XHJcbiAgICBjb25zdCBzZXJ2aWNlVXJsID0gdGhpcy5meEFwaVNlcnZpY2UuZ2V0U2VydmljZVVybCh0aGlzLnNldHRpbmcoJ3NlcnZpY2VOYW1lJykpO1xyXG4gICAgdGhpcy5nZXRPcHRpb25zKHNlcnZpY2VVcmwsIHRoaXMuc2V0dGluZygnY2xpbmljYWxOb3Rlc1VSTCcpKTtcclxuICB9XHJcblxyXG4gIGdldE9wdGlvbnMoc2VydmljZVVybDogc3RyaW5nLCB1cmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmluYWxVcmwgPSBzZXJ2aWNlVXJsICsgdXJsO1xyXG4gICAgdGhpcy5odHRwLmdldDxhbnlbXT4oZmluYWxVcmwpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gSGFuZGxlIEFQSSByZXNwb25zZVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgb3B0aW9ucycsIGVycilcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIG5ldyBGeFNlbGVjdFNldHRpbmcoeyBrZXk6ICdkaXNwbGF5TW9kZScsICR0aXRsZTogJ0Rpc3BsYXkgTW9kZScsIHZhbHVlOiAnZWxsaXBzaXMnIH0sIFt7IG9wdGlvbjogJ0VsbGlwc2lzJywgdmFsdWU6ICdlbGxpcHNpcycgfSwgeyBvcHRpb246ICdDb21wYWN0JywgdmFsdWU6ICdjb21wYWN0JyB9XSksXHJcbiAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdwbGFjZWhvbGRlckxhYmVsJywgJHRpdGxlOiAnUGxhY2Vob2xkZXInLCB2YWx1ZTogJ1NlbGVjdCBPcHRpb25zJyB9KSxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdmFsaWRhdGlvbnMoKTogRnhWYWxpZGF0aW9uW10ge1xyXG4gICAgcmV0dXJuIFtGeFZhbGlkYXRvclNlcnZpY2UucmVxdWlyZWRdO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyb3Bkb3duIEJlaGF2aW9yICoqL1xyXG4gIHRvZ2dsZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSAhdGhpcy5kcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICB0b2dnbGVPcHRpb24ob3B0aW9uOiBDdXN0b21Ecm9wZG93bk9wdGlvbiwgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIG9wdGlvbi5zZWxlY3RlZCA9ICFvcHRpb24uc2VsZWN0ZWQ7XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRpbmdzT3B0aW9ucy5maW5kSW5kZXgobyA9PiBvLnZhbHVlID09PSBvcHRpb24udmFsdWUpO1xyXG4gICAgY29uc3QgY29udHJvbCA9ICh0aGlzLmZvcm0uZ2V0KCdmaW5kaW5ncycpIGFzIEZvcm1BcnJheSkuYXQoaW5kZXgpO1xyXG5cclxuICAgIGlmIChvcHRpb24uc2VsZWN0ZWQgJiYgb3B0aW9uLnN1Yk9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICBjb250cm9sLmdldCgnc3ViU2VsZWN0aW9uJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb250cm9sLmdldCgnc3ViU2VsZWN0aW9uJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICBjb250cm9sLmdldCgnc3ViU2VsZWN0aW9uJyk/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRyb2wuZ2V0KCdzdWJTZWxlY3Rpb24nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZvcm0gJiBMYWJlbCBIZWxwZXJzICoqL1xyXG4gIGdldCBoYXNTZWxlY3RlZEZpbmRpbmdzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZGluZ3NPcHRpb25zLnNvbWUoZiA9PiBmLnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZEZpbmRpbmdzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5maW5kaW5nc09wdGlvbnNcclxuICAgICAgLmZpbHRlcihmID0+IHtcclxuICAgICAgICBpZiAoZi5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgLy8gSWYgZmluZGluZyBoYXMgc3ViLW9wdGlvbnMg4oaSIG9ubHkgc2hvdyBpZiBhIHN1Yi1vcHRpb24gaXMgc2VsZWN0ZWRcclxuICAgICAgICAgIGlmIChmLnN1Yk9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gISFmLnN1YlNlbGVjdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIElmIG5vIHN1Yi1vcHRpb25zIOKGkiBhbHdheXMgc2hvd1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgLm1hcChmID0+IGYubGFiZWwpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnNldHRpbmcoJ3BsYWNlaG9sZGVyTGFiZWwnKTtcclxuXHJcbiAgICAvLyBEaXNwbGF5IG1vZGUgbG9naWMgKENvbXBhY3Qgb3IgRWxsaXBzaXMpXHJcbiAgICBjb25zdCBtYXhDb3VudCA9IHRoaXMuc2V0dGluZygnZGlzcGxheU1vZGUnKSA9PT0gJ2NvbXBhY3QnID8gMiA6IDM7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5nKCdkaXNwbGF5TW9kZScpID09PSAnY29tcGFjdCcpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkLmxlbmd0aCA8PSBtYXhDb3VudFxyXG4gICAgICAgID8gc2VsZWN0ZWQuam9pbignLCAnKVxyXG4gICAgICAgIDogYCR7c2VsZWN0ZWQuc2xpY2UoMCwgbWF4Q291bnQpLmpvaW4oJywgJyl9ICske3NlbGVjdGVkLmxlbmd0aCAtIG1heENvdW50fSBtb3JlYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZXR0aW5nKCdkaXNwbGF5TW9kZScpID09PSAnZWxsaXBzaXMnKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZC5sZW5ndGggPiBtYXhDb3VudFxyXG4gICAgICAgID8gYCR7c2VsZWN0ZWQuc2xpY2UoMCwgbWF4Q291bnQpLmpvaW4oJywgJyl9LCAuLi5gXHJcbiAgICAgICAgOiBzZWxlY3RlZC5qb2luKCcsICcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWxlY3RlZC5qb2luKCcsICcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZSBGaW5kaW5ncyArIFZhbGlkYXRpb24gKiovXHJcbiAgdXBkYXRlRmluZGluZ3MoKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZmluZGluZ3NPcHRpb25zXHJcbiAgICAgIC5maWx0ZXIoZiA9PiB7XHJcbiAgICAgICAgaWYgKGYuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSBpbiBmaW5hbCBmb3JtIGlmOlxyXG4gICAgICAgICAgLy8gIC0gbm8gc3ViT3B0aW9ucywgb3JcclxuICAgICAgICAgIC8vICAtIHN1Yk9wdGlvbnMgd2l0aCB2YWxpZCBzdWJTZWxlY3Rpb25cclxuICAgICAgICAgIGlmIChmLnN1Yk9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gISFmLnN1YlNlbGVjdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoZiA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3ViID0gZi5zdWJPcHRpb25zPy5maW5kKHMgPT4gcy52YWx1ZSA9PT0gZi5zdWJTZWxlY3Rpb24pIHx8IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxhYmVsOiBmLmxhYmVsLFxyXG4gICAgICAgICAgdmFsdWU6IGYudmFsdWUsXHJcbiAgICAgICAgICBzdWJTZWxlY3Rpb246IHN1YiA/IHsgbGFiZWw6IHN1Yi5sYWJlbCwgdmFsdWU6IHN1Yi52YWx1ZSB9IDogbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSByZWFjdGl2ZSBmb3JtIHZhbHVlXHJcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGZpbmRpbmdzOiBzZWxlY3RlZCB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgLy8gVmFsaWRhdGlvbiBsb2dpYyByZW1haW5zIHNhbWVcclxuICAgIGNvbnN0IGludmFsaWRJdGVtcyA9IHRoaXMuZmluZGluZ3NPcHRpb25zLmZpbHRlcihcclxuICAgICAgZiA9PiBmLnNlbGVjdGVkICYmIGYuc3ViT3B0aW9ucyAmJiAhZi5zdWJTZWxlY3Rpb25cclxuICAgICk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdmaW5kaW5ncycpPy5zZXRFcnJvcnMoXHJcbiAgICAgIGludmFsaWRJdGVtcy5sZW5ndGggPiAwID8geyBtaXNzaW5nU3ViU2VsZWN0aW9uOiB0cnVlIH0gOiBudWxsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hFeGlzdGluZ1ZhbHVlcyhkYXRhOiBhbnlbXSkge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mb3JtLmdldCgnZmluZGluZ3MnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICBmb3JtQXJyYXkuY2xlYXIoKTtcclxuXHJcbiAgICB0aGlzLmZpbmRpbmdzT3B0aW9ucy5mb3JFYWNoKG9wdCA9PiB7XHJcbiAgICAgIGNvbnN0IG1hdGNoID0gZGF0YS5maW5kKHggPT4geC52YWx1ZSA9PT0gb3B0LnZhbHVlKTtcclxuICAgICAgb3B0LnNlbGVjdGVkID0gISFtYXRjaDtcclxuICAgICAgb3B0LnN1YlNlbGVjdGlvbiA9IG1hdGNoPy5zdWJTZWxlY3Rpb24/LnZhbHVlIHx8IG51bGw7XHJcblxyXG4gICAgICBpZiAob3B0LnNlbGVjdGVkKSB7XHJcbiAgICAgICAgZm9ybUFycmF5LnB1c2goXHJcbiAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgdmFsdWU6IFtvcHQudmFsdWVdLFxyXG4gICAgICAgICAgICBzdWJTZWxlY3Rpb246IFtvcHQuc3ViU2VsZWN0aW9uXVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbmRpbmdzKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmeC1jb21wb25lbnQgW2Z4RGF0YV09XCJmeERhdGFcIiAjZnhDb21wb25lbnQ+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJyZWxhdGl2ZVwiPlxyXG4gICAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgICAgPGRpdiAjZHJvcGRvd25XcmFwcGVyIGNsYXNzPVwicmVsYXRpdmUgdy04MFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cInctZnVsbCBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgcHgtMyBweS0yIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBiZy13aGl0ZSB0ZXh0LWdyYXktNzAwIGhvdmVyOmJvcmRlci1ibHVlLTQwMFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJoYXNTZWxlY3RlZEZpbmRpbmdzOyBlbHNlIHBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgIHt7IHNlbGVjdGVkRmluZGluZ3NMYWJlbCB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAge3sgc2V0dGluZygncGxhY2Vob2xkZXJMYWJlbCcpIH19XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPHN2ZyBjbGFzcz1cInctNSBoLTUgbWwtMiB0ZXh0LWdyYXktNTAwIHRyYW5zZm9ybSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0yMDBcIlxyXG4gICAgICAgICAgICBbY2xhc3Mucm90YXRlLTE4MF09XCJkcm9wZG93bk9wZW5cIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGQ9XCJNMTkgOWwtNyA3LTctN1wiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPCEtLSBQYW5lbCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgbXQtMSB3LWZ1bGwgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1sZyBtYXgtaC02NCBvdmVyZmxvdy15LWF1dG8gei0xMFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbmRpbmdzT3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLWIgYm9yZGVyLWdyYXktMTAwIGxhc3Q6Ym9yZGVyLW5vbmUgcC0yIGhvdmVyOmJnLWdyYXktNTAgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggKyBMYWJlbCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwidy00IGgtNCB0ZXh0LWJsdWUtNTAwIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9uLnNlbGVjdGVkXCIgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcHRpb24ob3B0aW9uLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LWdyYXktODAwIGZvbnQtbWVkaXVtIGN1cnNvci1wb2ludGVyIHNlbGVjdC1ub25lXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcHRpb24ob3B0aW9uLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm9wdGlvbi5pbmZvXCIgY2xhc3M9XCJtbC1hdXRvIHRleHQtYmx1ZS01MDAgdGV4dC1zbSBjdXJzb3ItcG9pbnRlclwiIHRpdGxlPVwie3sgb3B0aW9uLmluZm8gfX1cIj5cclxuICAgICAgICAgICAgICAgIOKTmFxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFJhZGlvcyAoc3ViLW9wdGlvbnMpIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC00IG1sLTYgbXQtMiB0ZXh0LXNtXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi5zZWxlY3RlZCAmJiBvcHRpb24uc3ViT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2Ygb3B0aW9uLnN1Yk9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMSBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcHRpb24uc3ViU2VsZWN0aW9uID0gcy52YWx1ZTsgb3B0aW9uLnRvdWNoZWQgPSB0cnVlOyB1cGRhdGVGaW5kaW5ncygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbbmFtZV09XCJvcHRpb24udmFsdWVcIiBbdmFsdWVdPVwicy52YWx1ZVwiIFsobmdNb2RlbCldPVwib3B0aW9uLnN1YlNlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCIgY2xhc3M9XCJ0ZXh0LWJsdWUtNjAwIGN1cnNvci1wb2ludGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVmFsaWRhdGlvbiBNZXNzYWdlIChpZiBzdWItc2VsZWN0aW9uIGlzIG1pc3NpbmcpIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb24uc2VsZWN0ZWQgJiYgb3B0aW9uLnN1Yk9wdGlvbnMgJiYgIW9wdGlvbi5zdWJTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgdGV4dC14cyBtdC0xIHctZnVsbCBtbC0xXCI+XHJcbiAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IG9uZSBvcHRpb25cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9kaXY+XHJcbjwvZngtY29tcG9uZW50PlxyXG4iXX0=
|
package/esm2022/lib/components/multiselect-with-form-fields/multiselect-dropdown.component.mjs
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, HostListener } from '@angular/core';
|
|
3
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
-
import { FxBaseComponent, FxComponent, FxSelectSetting, FxStringSetting, FxValidatorService } from '@instantsys-labs/fx';
|
|
5
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
import * as i2 from "../../fx-builder-wrapper.service";
|
|
9
|
-
import * as i3 from "@instantsys-labs/core";
|
|
10
|
-
import * as i4 from "@angular/forms";
|
|
11
|
-
import * as i5 from "@angular/common";
|
|
12
|
-
export class MultiselectDropdownComponentForm extends FxBaseComponent {
|
|
13
|
-
cdr;
|
|
14
|
-
http;
|
|
15
|
-
fxBuilderWrapperService;
|
|
16
|
-
fxApiService;
|
|
17
|
-
fb;
|
|
18
|
-
eRef;
|
|
19
|
-
form;
|
|
20
|
-
dropdownOpen = false;
|
|
21
|
-
searchTerm = '';
|
|
22
|
-
placeholder = 'Select items';
|
|
23
|
-
destroy$ = new Subject();
|
|
24
|
-
formObject = {};
|
|
25
|
-
options = [
|
|
26
|
-
{ label: 'Option 1', value: 'opt1', selected: false },
|
|
27
|
-
{ label: 'Option 2', value: 'opt2', selected: false },
|
|
28
|
-
{ label: 'Option 3', value: 'opt3', selected: false },
|
|
29
|
-
{ label: 'Option 4', value: 'opt4', selected: false },
|
|
30
|
-
{ label: 'Option 5', value: 'opt5', selected: false },
|
|
31
|
-
];
|
|
32
|
-
constructor(cdr, http, fxBuilderWrapperService, fxApiService, fb, eRef) {
|
|
33
|
-
super(cdr);
|
|
34
|
-
this.cdr = cdr;
|
|
35
|
-
this.http = http;
|
|
36
|
-
this.fxBuilderWrapperService = fxBuilderWrapperService;
|
|
37
|
-
this.fxApiService = fxApiService;
|
|
38
|
-
this.fb = fb;
|
|
39
|
-
this.eRef = eRef;
|
|
40
|
-
this.form = this.fb.group({
|
|
41
|
-
selectedOptionsMultiForm: [[], arrayRequiredValidator]
|
|
42
|
-
});
|
|
43
|
-
this.onInit.subscribe(() => this._register(this.form));
|
|
44
|
-
}
|
|
45
|
-
/** Close dropdown when clicking outside */
|
|
46
|
-
onClickOutside(event) {
|
|
47
|
-
if (this.dropdownOpen && !this.eRef.nativeElement.contains(event.target)) {
|
|
48
|
-
this.dropdownOpen = false;
|
|
49
|
-
this.cdr.detectChanges();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
ngOnInit() {
|
|
53
|
-
this.fxBuilderWrapperService.variables$
|
|
54
|
-
.pipe(takeUntil(this.destroy$))
|
|
55
|
-
.subscribe((variables) => {
|
|
56
|
-
console.log("Variables");
|
|
57
|
-
// If your variables or settings change at runtime and you want to re-evaluate:
|
|
58
|
-
this.applyValidation();
|
|
59
|
-
});
|
|
60
|
-
const serviceUrl = this.fxApiService.getServiceUrl(this.setting('serviceName'));
|
|
61
|
-
this.getOptions(serviceUrl, this.setting('clinicalNotesURL'));
|
|
62
|
-
}
|
|
63
|
-
getOptions(serviceUrl, url) {
|
|
64
|
-
const finalUrl = serviceUrl + url;
|
|
65
|
-
this.http.get(finalUrl).subscribe({
|
|
66
|
-
next: (response) => {
|
|
67
|
-
// Future API logic here
|
|
68
|
-
},
|
|
69
|
-
error: (err) => console.error('Error fetching options', err)
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
toggleDropdown() {
|
|
73
|
-
this.dropdownOpen = !this.dropdownOpen;
|
|
74
|
-
if (this.dropdownOpen)
|
|
75
|
-
this.searchTerm = '';
|
|
76
|
-
}
|
|
77
|
-
/** Filter options based on search term */
|
|
78
|
-
get filteredOptions() {
|
|
79
|
-
const term = this.searchTerm.toLowerCase();
|
|
80
|
-
return this.options.filter(opt => opt.label.toLowerCase().includes(term));
|
|
81
|
-
}
|
|
82
|
-
toggleOption(option, event) {
|
|
83
|
-
event.stopPropagation();
|
|
84
|
-
option.selected = !option.selected;
|
|
85
|
-
this.updateSelectedValues();
|
|
86
|
-
}
|
|
87
|
-
/** Update reactive form with selected items */
|
|
88
|
-
updateSelectedValues() {
|
|
89
|
-
const selectedValues = this.options
|
|
90
|
-
.filter(o => o.selected)
|
|
91
|
-
.map(o => ({ label: o.label, value: o.value }));
|
|
92
|
-
this.form.patchValue({ selectedOptionsMultiForm: selectedValues }, { emitEvent: false });
|
|
93
|
-
}
|
|
94
|
-
/** Placeholder / Display logic */
|
|
95
|
-
get selectedLabel() {
|
|
96
|
-
const selected = this.options.filter(o => o.selected).map(o => o.label);
|
|
97
|
-
if (selected.length === 0)
|
|
98
|
-
return this.placeholder = this.setting('placeholderLabel') ?? this.placeholder;
|
|
99
|
-
const maxCount = this.setting('displayMode') === 'compact' ? 2 : 3;
|
|
100
|
-
if (this.setting('displayMode') === 'compact') {
|
|
101
|
-
return selected.length <= maxCount
|
|
102
|
-
? selected.join(', ')
|
|
103
|
-
: `${selected.slice(0, maxCount).join(', ')} +${selected.length - maxCount} more`;
|
|
104
|
-
}
|
|
105
|
-
if (this.setting('displayMode') === 'ellipsis') {
|
|
106
|
-
return selected.length > maxCount
|
|
107
|
-
? `${selected.slice(0, maxCount).join(', ')}, ...`
|
|
108
|
-
: selected.join(', ');
|
|
109
|
-
}
|
|
110
|
-
return selected.join(', ');
|
|
111
|
-
}
|
|
112
|
-
onSubmit() {
|
|
113
|
-
console.log('Form Value:', this.form.value);
|
|
114
|
-
}
|
|
115
|
-
get getDropdownSearch() {
|
|
116
|
-
return this.setting('dropDownSearch');
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Apply or remove the array-required validator depending on the FX setting.
|
|
120
|
-
*/
|
|
121
|
-
applyValidation() {
|
|
122
|
-
const control = this.form.get('selectedOptionsMultiForm');
|
|
123
|
-
console.log(this.form);
|
|
124
|
-
const shouldRequire = this.setting('validationRequired') === 'yes';
|
|
125
|
-
if (!control)
|
|
126
|
-
return;
|
|
127
|
-
if (shouldRequire) {
|
|
128
|
-
control.setValidators(arrayRequiredValidator);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
control.clearValidators();
|
|
132
|
-
}
|
|
133
|
-
// Recompute validity after changing validators
|
|
134
|
-
control.updateValueAndValidity({ emitEvent: false });
|
|
135
|
-
}
|
|
136
|
-
settings() {
|
|
137
|
-
return [
|
|
138
|
-
new FxSelectSetting({ key: 'displayMode', $title: 'Display Mode', value: 'ellipsis' }, [{ option: 'Ellipsis', value: 'ellipsis' }, { option: 'Compact', value: 'compact' }]),
|
|
139
|
-
new FxSelectSetting({ key: 'validationRequired', $title: 'Validation Required', value: 'yes' }, [{ option: 'Yes', value: 'yes' }, { option: 'No', value: 'no' }]),
|
|
140
|
-
new FxSelectSetting({ key: 'dropDownSearch', $title: 'Dropdown Search', value: 'yes' }, [{ option: 'Yes', value: 'yes' }, { option: 'No', value: 'no' }]),
|
|
141
|
-
new FxStringSetting({ key: 'placeholderLabel', $title: 'Placeholder', value: 'Select Options' }),
|
|
142
|
-
new FxSelectSetting({ key: 'serviceName', $title: 'Service', value: '' }, [{ option: 'User Service', value: 'user_service' }, { option: 'Patient Service', value: 'patient_service' }, { option: 'Workflow Service', value: 'workflow_service' }]),
|
|
143
|
-
new FxStringSetting({ key: 'errorMessage', $title: 'Error Message', value: 'Please select at least one option' }),
|
|
144
|
-
];
|
|
145
|
-
}
|
|
146
|
-
validations() {
|
|
147
|
-
return [FxValidatorService.required];
|
|
148
|
-
}
|
|
149
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultiselectDropdownComponentForm, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.FxBuilderWrapperService }, { token: i3.ApiServiceRegistry }, { token: i4.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MultiselectDropdownComponentForm, isStandalone: true, selector: "multiselect-dropdown-form", host: { listeners: { "document:click": "onClickOutside($event)" } }, usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"container\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit();\" class=\"relative\">\r\n <!-- Dropdown header -->\r\n <div class=\"dropdown\" #dropdownWrapper class=\"relative w-80\">\r\n <button type=\"button\" class=\"dropdown-header\" (click)=\"toggleDropdown()\">\r\n <span>{{ selectedLabel }}</span>\r\n <span class=\"arrow\" [class.open]=\"dropdownOpen\">▾</span>\r\n </button>\r\n\r\n <!-- Dropdown panel -->\r\n <div *ngIf=\"dropdownOpen\" class=\"dropdown-panel\">\r\n <!-- Search -->\r\n <div class=\"search-box\" *ngIf=\"getDropdownSearch === 'yes';\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"searchTerm\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n\r\n <!-- Options -->\r\n <ng-container *ngIf=\"filteredOptions.length > 0; else noRecords\">\r\n <div\r\n *ngFor=\"let option of filteredOptions\"\r\n class=\"dropdown-item\"\r\n (click)=\"toggleOption(option, $event)\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"option.selected\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n class=\"checkbox\"\r\n />\r\n <label class=\"option-label\">{{ option.label }}</label>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Records Template -->\r\n <ng-template #noRecords>\r\n <div class=\"no-records\">\r\n {{ searchTerm ? 'No records found' : 'No options available' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <small\r\n *ngIf=\"form.get('selectedOptionsMultiForm')?.touched && form.get('selectedOptionsMultiForm')?.errors?.['required']\"\r\n class=\"text-red-500 block mt-1\"\r\n >\r\n {{ setting('errorMessage') }}\r\n </small>\r\n </form>\r\n </div>\r\n</fx-component>\r\n", styles: [".container{width:300px}.dropdown{position:relative;-webkit-user-select:none;user-select:none}.dropdown-header{border:1px solid #ccc;border-radius:4px;padding:6px 8px;background-color:#fff;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.dropdown-header:hover{border-color:#007bff}.arrow{font-size:10px;color:#555;transition:transform .2s}.arrow.open{transform:rotate(180deg)}.dropdown-panel{position:absolute;width:100%;background:#fff;border:1px solid #ddd;margin-top:4px;border-radius:4px;max-height:250px;overflow-y:auto;z-index:1000;box-shadow:0 2px 8px #0000001a}.search-box{padding:6px;border-bottom:1px solid #eee}.search-input{width:100%;padding:5px;border:1px solid #ccc;border-radius:4px;outline:none}.dropdown-item{padding:6px 8px;display:flex;align-items:center;gap:8px;cursor:pointer}.dropdown-item:hover{background-color:#f8f9fa}.checkbox{cursor:pointer}.option-label{cursor:pointer;flex-grow:1}.submit-btn{margin-top:1rem;padding:6px 12px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer}.no-records{text-align:center;padding:10px;color:#888;font-size:13px;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }] });
|
|
151
|
-
}
|
|
152
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultiselectDropdownComponentForm, decorators: [{
|
|
153
|
-
type: Component,
|
|
154
|
-
args: [{ selector: 'multiselect-dropdown-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent], template: "<fx-component [fxData]=\"fxData\" #fxComponent>\r\n <div class=\"container\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit();\" class=\"relative\">\r\n <!-- Dropdown header -->\r\n <div class=\"dropdown\" #dropdownWrapper class=\"relative w-80\">\r\n <button type=\"button\" class=\"dropdown-header\" (click)=\"toggleDropdown()\">\r\n <span>{{ selectedLabel }}</span>\r\n <span class=\"arrow\" [class.open]=\"dropdownOpen\">▾</span>\r\n </button>\r\n\r\n <!-- Dropdown panel -->\r\n <div *ngIf=\"dropdownOpen\" class=\"dropdown-panel\">\r\n <!-- Search -->\r\n <div class=\"search-box\" *ngIf=\"getDropdownSearch === 'yes';\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"searchTerm\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n\r\n <!-- Options -->\r\n <ng-container *ngIf=\"filteredOptions.length > 0; else noRecords\">\r\n <div\r\n *ngFor=\"let option of filteredOptions\"\r\n class=\"dropdown-item\"\r\n (click)=\"toggleOption(option, $event)\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"option.selected\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n class=\"checkbox\"\r\n />\r\n <label class=\"option-label\">{{ option.label }}</label>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Records Template -->\r\n <ng-template #noRecords>\r\n <div class=\"no-records\">\r\n {{ searchTerm ? 'No records found' : 'No options available' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <small\r\n *ngIf=\"form.get('selectedOptionsMultiForm')?.touched && form.get('selectedOptionsMultiForm')?.errors?.['required']\"\r\n class=\"text-red-500 block mt-1\"\r\n >\r\n {{ setting('errorMessage') }}\r\n </small>\r\n </form>\r\n </div>\r\n</fx-component>\r\n", styles: [".container{width:300px}.dropdown{position:relative;-webkit-user-select:none;user-select:none}.dropdown-header{border:1px solid #ccc;border-radius:4px;padding:6px 8px;background-color:#fff;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.dropdown-header:hover{border-color:#007bff}.arrow{font-size:10px;color:#555;transition:transform .2s}.arrow.open{transform:rotate(180deg)}.dropdown-panel{position:absolute;width:100%;background:#fff;border:1px solid #ddd;margin-top:4px;border-radius:4px;max-height:250px;overflow-y:auto;z-index:1000;box-shadow:0 2px 8px #0000001a}.search-box{padding:6px;border-bottom:1px solid #eee}.search-input{width:100%;padding:5px;border:1px solid #ccc;border-radius:4px;outline:none}.dropdown-item{padding:6px 8px;display:flex;align-items:center;gap:8px;cursor:pointer}.dropdown-item:hover{background-color:#f8f9fa}.checkbox{cursor:pointer}.option-label{cursor:pointer;flex-grow:1}.submit-btn{margin-top:1rem;padding:6px 12px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer}.no-records{text-align:center;padding:10px;color:#888;font-size:13px;-webkit-user-select:none;user-select:none}\n"] }]
|
|
155
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.FxBuilderWrapperService }, { type: i3.ApiServiceRegistry }, { type: i4.FormBuilder }, { type: i0.ElementRef }], propDecorators: { onClickOutside: [{
|
|
156
|
-
type: HostListener,
|
|
157
|
-
args: ['document:click', ['$event']]
|
|
158
|
-
}] } });
|
|
159
|
-
function arrayRequiredValidator(control) {
|
|
160
|
-
const value = control.value;
|
|
161
|
-
if (Array.isArray(value) && value.length === 0) {
|
|
162
|
-
return { required: true };
|
|
163
|
-
}
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy9tdWx0aXNlbGVjdC13aXRoLWZvcm0tZmllbGRzL211bHRpc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z4LWJ1aWxkZXItd3JhcHBlci9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGlzZWxlY3Qtd2l0aC1mb3JtLWZpZWxkcy9tdWx0aXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFxQixTQUFTLEVBQXVCLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQTBCLFdBQVcsRUFBRSxtQkFBbUIsRUFBaUQsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6SSxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xKLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBZ0IxQyxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsZUFBZTtJQWlCekQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBckJWLElBQUksQ0FBYTtJQUNqQixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsV0FBVyxHQUFHLGNBQWMsQ0FBQztJQUNyQixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUMxQyxVQUFVLEdBQVcsRUFBRSxDQUFDO0lBRXhCLE9BQU8sR0FB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QUVTLFdBQVc7UUFDbkIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7d0dBdEpVLGdDQUFnQzs0RkFBaEMsZ0NBQWdDLGlMQ3RCN0Msd3ZGQTBEQSw0c0NEeENZLFlBQVksK1BBQUUsbUJBQW1CLDY5QkFBRSxXQUFXLHVQQUFFLFdBQVc7OzRGQUkxRCxnQ0FBZ0M7a0JBUDVDLFNBQVM7K0JBQ0UsMkJBQTJCLGNBQ3pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO3lPQXFDdEUsY0FBYztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOztBQXlINUMsU0FBUyxzQkFBc0IsQ0FBQyxPQUF3QjtJQUN0RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERvQ2hlY2ssIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvY29yZSc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnQsIEZ4U2VsZWN0U2V0dGluZywgRnhTZXR0aW5nLCBGeFN0cmluZ1NldHRpbmcsIEZ4VmFsaWRhdGlvbiwgRnhWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGluc3RhbnRzeXMtbGFicy9meCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2Z4LWJ1aWxkZXItd3JhcHBlci5zZXJ2aWNlJztcclxuXHJcbmludGVyZmFjZSBNdWx0aVNlbGVjdE9wdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ211bHRpc2VsZWN0LWRyb3Bkb3duLWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUsIEZ4Q29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGlzZWxlY3QtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9tdWx0aXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlzZWxlY3REcm9wZG93bkNvbXBvbmVudEZvcm0gZXh0ZW5kcyBGeEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgZHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgc2VhcmNoVGVybSA9ICcnO1xyXG4gIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCBpdGVtcyc7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KCk7XHJcbiAgZm9ybU9iamVjdDogb2JqZWN0ID0ge307XHJcblxyXG4gIG9wdGlvbnM6IE11bHRpU2VsZWN0T3B0aW9uW10gPSBbXHJcbiAgICB7IGxhYmVsOiAnT3B0aW9uIDEnLCB2YWx1ZTogJ29wdDEnLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICdPcHRpb24gMicsIHZhbHVlOiAnb3B0MicsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJ09wdGlvbiAzJywgdmFsdWU6ICdvcHQzJywgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAnT3B0aW9uIDQnLCB2YWx1ZTogJ29wdDQnLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICdPcHRpb24gNScsIHZhbHVlOiAnb3B0NScsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gIF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBmeEJ1aWxkZXJXcmFwcGVyU2VydmljZTogRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZ4QXBpU2VydmljZTogQXBpU2VydmljZVJlZ2lzdHJ5LFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGVSZWY6IEVsZW1lbnRSZWZcclxuICApIHtcclxuICAgIHN1cGVyKGNkcik7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2VsZWN0ZWRPcHRpb25zTXVsdGlGb3JtOiBbW10sIGFycmF5UmVxdWlyZWRWYWxpZGF0b3JdXHJcbiAgICB9KTtcclxuICAgIHRoaXMub25Jbml0LnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZWdpc3Rlcih0aGlzLmZvcm0pKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZSBkcm9wZG93biB3aGVuIGNsaWNraW5nIG91dHNpZGUgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbiAmJiAhdGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJWYXJpYWJsZXNcIiwpXHJcbiAgICAgICAgLy8gSWYgeW91ciB2YXJpYWJsZXMgb3Igc2V0dGluZ3MgY2hhbmdlIGF0IHJ1bnRpbWUgYW5kIHlvdSB3YW50IHRvIHJlLWV2YWx1YXRlOlxyXG4gICAgICAgIHRoaXMuYXBwbHlWYWxpZGF0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgY29uc3Qgc2VydmljZVVybCA9IHRoaXMuZnhBcGlTZXJ2aWNlLmdldFNlcnZpY2VVcmwodGhpcy5zZXR0aW5nKCdzZXJ2aWNlTmFtZScpKTtcclxuICAgIHRoaXMuZ2V0T3B0aW9ucyhzZXJ2aWNlVXJsLCB0aGlzLnNldHRpbmcoJ2NsaW5pY2FsTm90ZXNVUkwnKSk7XHJcbiAgfVxyXG5cclxuICBnZXRPcHRpb25zKHNlcnZpY2VVcmw6IHN0cmluZywgdXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGZpbmFsVXJsID0gc2VydmljZVVybCArIHVybDtcclxuICAgIHRoaXMuaHR0cC5nZXQ8YW55W10+KGZpbmFsVXJsKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIEZ1dHVyZSBBUEkgbG9naWMgaGVyZVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgb3B0aW9ucycsIGVycilcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmRyb3Bkb3duT3BlbiA9ICF0aGlzLmRyb3Bkb3duT3BlbjtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbikgdGhpcy5zZWFyY2hUZXJtID0gJyc7XHJcbiAgfVxyXG5cclxuICAvKiogRmlsdGVyIG9wdGlvbnMgYmFzZWQgb24gc2VhcmNoIHRlcm0gKi9cclxuICBnZXQgZmlsdGVyZWRPcHRpb25zKCk6IE11bHRpU2VsZWN0T3B0aW9uW10ge1xyXG4gICAgY29uc3QgdGVybSA9IHRoaXMuc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIob3B0ID0+IG9wdC5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU9wdGlvbihvcHRpb246IE11bHRpU2VsZWN0T3B0aW9uLCBldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgb3B0aW9uLnNlbGVjdGVkID0gIW9wdGlvbi5zZWxlY3RlZDtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRWYWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBVcGRhdGUgcmVhY3RpdmUgZm9ybSB3aXRoIHNlbGVjdGVkIGl0ZW1zICovXHJcbiAgdXBkYXRlU2VsZWN0ZWRWYWx1ZXMoKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IHRoaXMub3B0aW9uc1xyXG4gICAgICAuZmlsdGVyKG8gPT4gby5zZWxlY3RlZClcclxuICAgICAgLm1hcChvID0+ICh7IGxhYmVsOiBvLmxhYmVsLCB2YWx1ZTogby52YWx1ZSB9KSk7XHJcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IHNlbGVjdGVkT3B0aW9uc011bHRpRm9ybTogc2VsZWN0ZWRWYWx1ZXMgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBsYWNlaG9sZGVyIC8gRGlzcGxheSBsb2dpYyAqL1xyXG4gIGdldCBzZWxlY3RlZExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMub3B0aW9ucy5maWx0ZXIobyA9PiBvLnNlbGVjdGVkKS5tYXAobyA9PiBvLmxhYmVsKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMuc2V0dGluZygncGxhY2Vob2xkZXJMYWJlbCcpID8/IHRoaXMucGxhY2Vob2xkZXI7XHJcblxyXG4gICAgY29uc3QgbWF4Q291bnQgPSB0aGlzLnNldHRpbmcoJ2Rpc3BsYXlNb2RlJykgPT09ICdjb21wYWN0JyA/IDIgOiAzO1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZygnZGlzcGxheU1vZGUnKSA9PT0gJ2NvbXBhY3QnKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZC5sZW5ndGggPD0gbWF4Q291bnRcclxuICAgICAgICA/IHNlbGVjdGVkLmpvaW4oJywgJylcclxuICAgICAgICA6IGAke3NlbGVjdGVkLnNsaWNlKDAsIG1heENvdW50KS5qb2luKCcsICcpfSArJHtzZWxlY3RlZC5sZW5ndGggLSBtYXhDb3VudH0gbW9yZWA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2V0dGluZygnZGlzcGxheU1vZGUnKSA9PT0gJ2VsbGlwc2lzJykge1xyXG4gICAgICByZXR1cm4gc2VsZWN0ZWQubGVuZ3RoID4gbWF4Q291bnRcclxuICAgICAgICA/IGAke3NlbGVjdGVkLnNsaWNlKDAsIG1heENvdW50KS5qb2luKCcsICcpfSwgLi4uYFxyXG4gICAgICAgIDogc2VsZWN0ZWQuam9pbignLCAnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VsZWN0ZWQuam9pbignLCAnKTtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgY29uc29sZS5sb2coJ0Zvcm0gVmFsdWU6JywgdGhpcy5mb3JtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBnZXREcm9wZG93blNlYXJjaCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZygnZHJvcERvd25TZWFyY2gnKTtcclxuICB9XHJcblxyXG4vKipcclxuICAgKiBBcHBseSBvciByZW1vdmUgdGhlIGFycmF5LXJlcXVpcmVkIHZhbGlkYXRvciBkZXBlbmRpbmcgb24gdGhlIEZYIHNldHRpbmcuXHJcbiAgICovXHJcbiAgYXBwbHlWYWxpZGF0aW9uKCkge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGVkT3B0aW9uc011bHRpRm9ybScpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5mb3JtKVxyXG4gICAgY29uc3Qgc2hvdWxkUmVxdWlyZSA9IHRoaXMuc2V0dGluZygndmFsaWRhdGlvblJlcXVpcmVkJykgPT09ICd5ZXMnO1xyXG5cclxuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChzaG91bGRSZXF1aXJlKSB7XHJcbiAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhhcnJheVJlcXVpcmVkVmFsaWRhdG9yKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVjb21wdXRlIHZhbGlkaXR5IGFmdGVyIGNoYW5naW5nIHZhbGlkYXRvcnNcclxuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0dGluZ3MoKTogRnhTZXR0aW5nW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgbmV3IEZ4U2VsZWN0U2V0dGluZyh7IGtleTogJ2Rpc3BsYXlNb2RlJywgJHRpdGxlOiAnRGlzcGxheSBNb2RlJywgdmFsdWU6ICdlbGxpcHNpcycgfSwgW3sgb3B0aW9uOiAnRWxsaXBzaXMnLCB2YWx1ZTogJ2VsbGlwc2lzJyB9LCB7IG9wdGlvbjogJ0NvbXBhY3QnLCB2YWx1ZTogJ2NvbXBhY3QnIH1dKSxcclxuICAgICAgbmV3IEZ4U2VsZWN0U2V0dGluZyh7IGtleTogJ3ZhbGlkYXRpb25SZXF1aXJlZCcsICR0aXRsZTogJ1ZhbGlkYXRpb24gUmVxdWlyZWQnLCB2YWx1ZTogJ3llcycgfSwgW3sgb3B0aW9uOiAnWWVzJywgdmFsdWU6ICd5ZXMnIH0sIHsgb3B0aW9uOiAnTm8nLCB2YWx1ZTogJ25vJyB9XSksXHJcbiAgICAgIG5ldyBGeFNlbGVjdFNldHRpbmcoeyBrZXk6ICdkcm9wRG93blNlYXJjaCcsICR0aXRsZTogJ0Ryb3Bkb3duIFNlYXJjaCcsIHZhbHVlOiAneWVzJyB9LCBbeyBvcHRpb246ICdZZXMnLCB2YWx1ZTogJ3llcycgfSwgeyBvcHRpb246ICdObycsIHZhbHVlOiAnbm8nIH1dKSxcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3BsYWNlaG9sZGVyTGFiZWwnLCAkdGl0bGU6ICdQbGFjZWhvbGRlcicsIHZhbHVlOiAnU2VsZWN0IE9wdGlvbnMnIH0pLFxyXG4gICAgICBuZXcgRnhTZWxlY3RTZXR0aW5nKHsga2V5OiAnc2VydmljZU5hbWUnLCAkdGl0bGU6ICdTZXJ2aWNlJywgdmFsdWU6ICcnIH0sIFt7IG9wdGlvbjogJ1VzZXIgU2VydmljZScsIHZhbHVlOiAndXNlcl9zZXJ2aWNlJyB9LCB7IG9wdGlvbjogJ1BhdGllbnQgU2VydmljZScsIHZhbHVlOiAncGF0aWVudF9zZXJ2aWNlJyB9LCB7IG9wdGlvbjogJ1dvcmtmbG93IFNlcnZpY2UnLCB2YWx1ZTogJ3dvcmtmbG93X3NlcnZpY2UnIH1dKSxcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2Vycm9yTWVzc2FnZScsICR0aXRsZTogJ0Vycm9yIE1lc3NhZ2UnLCB2YWx1ZTogJ1BsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIG9wdGlvbicgfSksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5UmVxdWlyZWRWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4geyByZXF1aXJlZDogdHJ1ZSB9O1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG4iLCI8ZngtY29tcG9uZW50IFtmeERhdGFdPVwiZnhEYXRhXCIgI2Z4Q29tcG9uZW50PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpO1wiIGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPCEtLSBEcm9wZG93biBoZWFkZXIgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiICNkcm9wZG93bldyYXBwZXIgY2xhc3M9XCJyZWxhdGl2ZSB3LTgwXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2VsZWN0ZWRMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFycm93XCIgW2NsYXNzLm9wZW5dPVwiZHJvcGRvd25PcGVuXCI+JiM5NjYyOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gcGFuZWwgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25PcGVuXCIgY2xhc3M9XCJkcm9wZG93bi1wYW5lbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYm94XCIgKm5nSWY9XCJnZXREcm9wZG93blNlYXJjaCA9PT0gJ3llcyc7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gT3B0aW9ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDA7IGVsc2Ugbm9SZWNvcmRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3B0aW9uKG9wdGlvbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb24uc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwib3B0aW9uLWxhYmVsXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gUmVjb3JkcyBUZW1wbGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vUmVjb3Jkcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlYXJjaFRlcm0gPyAnTm8gcmVjb3JkcyBmb3VuZCcgOiAnTm8gb3B0aW9ucyBhdmFpbGFibGUnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8c21hbGxcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybS5nZXQoJ3NlbGVjdGVkT3B0aW9uc011bHRpRm9ybScpPy50b3VjaGVkICYmIGZvcm0uZ2V0KCdzZWxlY3RlZE9wdGlvbnNNdWx0aUZvcm0nKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgYmxvY2sgbXQtMVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBzZXR0aW5nKCdlcnJvck1lc3NhZ2UnKSB9fVxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG48L2Z4LWNvbXBvbmVudD5cclxuIl19
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { AfterViewInit, ChangeDetectorRef, ElementRef, OnInit } from '@angular/core';
|
|
3
|
-
import { FormBuilder, FormGroup } from '@angular/forms';
|
|
4
|
-
import { ApiServiceRegistry } from '@instantsys-labs/core';
|
|
5
|
-
import { FxBaseComponent, FxSetting, FxValidation } from '@instantsys-labs/fx';
|
|
6
|
-
import { FxBuilderWrapperService } from '../../fx-builder-wrapper.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
interface SubOption {
|
|
9
|
-
label: string;
|
|
10
|
-
value: string;
|
|
11
|
-
}
|
|
12
|
-
interface CustomDropdownOption {
|
|
13
|
-
label: string;
|
|
14
|
-
value: string;
|
|
15
|
-
info?: string;
|
|
16
|
-
selected: boolean;
|
|
17
|
-
subOptions?: SubOption[];
|
|
18
|
-
subSelection?: string | null;
|
|
19
|
-
disabled?: boolean;
|
|
20
|
-
touched?: boolean;
|
|
21
|
-
}
|
|
22
|
-
interface CustomDropdownConfig {
|
|
23
|
-
displayMode?: 'compact' | 'ellipsis';
|
|
24
|
-
placeholderLabel?: string;
|
|
25
|
-
}
|
|
26
|
-
export declare class CustomizeDropdownComponent extends FxBaseComponent implements OnInit, AfterViewInit {
|
|
27
|
-
private cdr;
|
|
28
|
-
private http;
|
|
29
|
-
private fxBuilderWrapperService;
|
|
30
|
-
private fxApiService;
|
|
31
|
-
private fb;
|
|
32
|
-
private eRef;
|
|
33
|
-
private destroy$;
|
|
34
|
-
form: FormGroup;
|
|
35
|
-
formObject: object;
|
|
36
|
-
dropdownOpen: boolean;
|
|
37
|
-
formSubmitted: boolean;
|
|
38
|
-
findingsOptions: CustomDropdownOption[];
|
|
39
|
-
config: CustomDropdownConfig;
|
|
40
|
-
constructor(cdr: ChangeDetectorRef, http: HttpClient, fxBuilderWrapperService: FxBuilderWrapperService, fxApiService: ApiServiceRegistry, fb: FormBuilder, eRef: ElementRef);
|
|
41
|
-
ngAfterViewInit(): void;
|
|
42
|
-
ngOnInit(): void;
|
|
43
|
-
getOptions(serviceUrl: string, url: string): void;
|
|
44
|
-
protected settings(): FxSetting[];
|
|
45
|
-
protected validations(): FxValidation[];
|
|
46
|
-
/** Dropdown Behavior **/
|
|
47
|
-
toggleDropdown(): void;
|
|
48
|
-
toggleOption(option: CustomDropdownOption, event: Event): void;
|
|
49
|
-
/** Form & Label Helpers **/
|
|
50
|
-
get hasSelectedFindings(): boolean;
|
|
51
|
-
get selectedFindingsLabel(): string;
|
|
52
|
-
/** Update Findings + Validation **/
|
|
53
|
-
updateFindings(): void;
|
|
54
|
-
onSubmit(): void;
|
|
55
|
-
patchExistingValues(data: any[]): void;
|
|
56
|
-
selectSubOption(option: any, subOption: any): void;
|
|
57
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CustomizeDropdownComponent, never>;
|
|
58
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<CustomizeDropdownComponent, "lib-customize-dropdown", never, {}, {}, never, never, true, never>;
|
|
59
|
-
}
|
|
60
|
-
export {};
|