fx-form-builder-wrapper 2.0.91 → 2.0.94

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.
@@ -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=
@@ -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\">&#9662;</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\">&#9662;</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 {};