@qbs-origin/origin-form 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/action-step-handler.mjs +163 -0
- package/esm2022/lib/auth-client.service.mjs +69 -0
- package/esm2022/lib/enums/label.keys.mjs +721 -0
- package/esm2022/lib/form-css.helper.mjs +367 -0
- package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
- package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
- package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
- package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
- package/esm2022/lib/formly/formly-action.mjs +56 -0
- package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
- package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
- package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
- package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
- package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
- package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
- package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
- package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
- package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
- package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
- package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
- package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
- package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
- package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
- package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
- package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
- package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
- package/esm2022/lib/model-population.helper.mjs +265 -0
- package/esm2022/lib/models/application-type.model.mjs +12 -0
- package/esm2022/lib/models/application.model.mjs +30 -0
- package/esm2022/lib/models/auth/users.model.mjs +2 -0
- package/esm2022/lib/models/dictionary.model.mjs +20 -0
- package/esm2022/lib/models/flux.model.mjs +105 -0
- package/esm2022/lib/models/forms.model.mjs +572 -0
- package/esm2022/lib/models/label-info.model.mjs +2 -0
- package/esm2022/lib/models/label.model.mjs +2 -0
- package/esm2022/lib/models/language.model.mjs +3 -0
- package/esm2022/lib/models/list.model.mjs +2 -0
- package/esm2022/lib/models/partner.model.mjs +3 -0
- package/esm2022/lib/models/treeview.model.mjs +15 -0
- package/esm2022/lib/origin-form-auth.service.mjs +40 -0
- package/esm2022/lib/origin-form-config.model.mjs +2 -0
- package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
- package/esm2022/lib/origin-form.component.mjs +2391 -0
- package/esm2022/lib/origin-form.module.mjs +479 -0
- package/esm2022/lib/origin-form.service.mjs +14 -0
- package/esm2022/lib/others/check-list.database.mjs +55 -0
- package/esm2022/lib/others/config-service.mjs +42 -0
- package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
- package/esm2022/lib/others/environment-type.mjs +21 -0
- package/esm2022/lib/others/external-link.directive.mjs +49 -0
- package/esm2022/lib/others/flux-helper.mjs +1397 -0
- package/esm2022/lib/others/picker.component.mjs +119 -0
- package/esm2022/lib/others/translation.pipe.mjs +21 -0
- package/esm2022/lib/others/translations-helper.mjs +258 -0
- package/esm2022/lib/others/utils.mjs +272 -0
- package/esm2022/lib/services/applicationData.service.mjs +145 -0
- package/esm2022/lib/services/auth-http.service.mjs +80 -0
- package/esm2022/lib/services/dialog.service.mjs +56 -0
- package/esm2022/lib/services/dictionary.service.mjs +198 -0
- package/esm2022/lib/services/forms.service.mjs +47 -0
- package/esm2022/lib/services/labels.service.mjs +29 -0
- package/esm2022/lib/services/language.service.mjs +24 -0
- package/esm2022/lib/services/open-banking.service.mjs +194 -0
- package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
- package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
- package/esm2022/lib/services/otp.service.mjs +28 -0
- package/esm2022/lib/services/proxy.service.mjs +79 -0
- package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
- package/esm2022/lib/services/translation.service.mjs +27 -0
- package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
- package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
- package/esm2022/lib/shared-components/grid.component.mjs +241 -0
- package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
- package/esm2022/lib/theme-css.mjs +2254 -0
- package/esm2022/lib/theme-injector.service.mjs +26 -0
- package/esm2022/public-api.mjs +4 -0
- package/esm2022/qbs-origin-origin-form.mjs +5 -0
- package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
- package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/action-step-handler.d.ts +49 -0
- package/lib/auth-client.service.d.ts +17 -0
- package/lib/enums/label.keys.d.ts +720 -0
- package/lib/form-css.helper.d.ts +28 -0
- package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
- package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
- package/lib/formly/custom-section-separator.component.d.ts +6 -0
- package/lib/formly/form-section-separator.component.d.ts +10 -0
- package/lib/formly/formly-action.d.ts +13 -0
- package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
- package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
- package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
- package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
- package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
- package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
- package/lib/formly/formly-identification.component.d.ts +19 -0
- package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
- package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
- package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
- package/lib/formly/formly-row-fille.d.ts +6 -0
- package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
- package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
- package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
- package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
- package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
- package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
- package/lib/model-population.helper.d.ts +8 -0
- package/lib/models/application-type.model.d.ts +27 -0
- package/lib/models/application.model.d.ts +107 -0
- package/lib/models/auth/users.model.d.ts +20 -0
- package/lib/models/dictionary.model.d.ts +77 -0
- package/lib/models/flux.model.d.ts +101 -0
- package/lib/models/forms.model.d.ts +504 -0
- package/lib/models/label-info.model.d.ts +10 -0
- package/lib/models/label.model.d.ts +4 -0
- package/lib/models/language.model.d.ts +5 -0
- package/lib/models/list.model.d.ts +8 -0
- package/lib/models/partner.model.d.ts +12 -0
- package/lib/models/treeview.model.d.ts +17 -0
- package/lib/origin-form-auth.service.d.ts +15 -0
- package/lib/origin-form-config.model.d.ts +12 -0
- package/lib/origin-form-token.interceptor.d.ts +12 -0
- package/lib/origin-form.component.d.ts +231 -0
- package/lib/origin-form.module.d.ts +84 -0
- package/lib/origin-form.service.d.ts +6 -0
- package/lib/others/check-list.database.d.ts +16 -0
- package/lib/others/config-service.d.ts +22 -0
- package/lib/others/dictionary-label-info.d.ts +6 -0
- package/lib/others/environment-type.d.ts +8 -0
- package/lib/others/external-link.directive.d.ts +12 -0
- package/lib/others/flux-helper.d.ts +115 -0
- package/lib/others/picker.component.d.ts +36 -0
- package/lib/others/translation.pipe.d.ts +10 -0
- package/lib/others/translations-helper.d.ts +31 -0
- package/lib/others/utils.d.ts +37 -0
- package/lib/services/applicationData.service.d.ts +35 -0
- package/lib/services/auth-http.service.d.ts +21 -0
- package/lib/services/dialog.service.d.ts +20 -0
- package/lib/services/dictionary.service.d.ts +89 -0
- package/lib/services/forms.service.d.ts +17 -0
- package/lib/services/labels.service.d.ts +13 -0
- package/lib/services/language.service.d.ts +14 -0
- package/lib/services/open-banking.service.d.ts +137 -0
- package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
- package/lib/services/origin-form-signalr.service.d.ts +24 -0
- package/lib/services/otp.service.d.ts +22 -0
- package/lib/services/proxy.service.d.ts +29 -0
- package/lib/services/scroll-to-error.service.d.ts +54 -0
- package/lib/services/translation.service.d.ts +10 -0
- package/lib/shared-components/confirmation.component.d.ts +77 -0
- package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
- package/lib/shared-components/grid.component.d.ts +138 -0
- package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
- package/lib/theme-css.d.ts +2 -0
- package/lib/theme-injector.service.d.ts +8 -0
- package/package.json +42 -0
- package/public-api.d.ts +3 -0
- package/schematics-compiled/collection.json +10 -0
- package/schematics-compiled/ng-add/index.d.ts +2 -0
- package/schematics-compiled/ng-add/index.js +67 -0
- package/schematics-compiled/ng-add/index.js.map +1 -0
- package/schematics-compiled/ng-add/schema.json +8 -0
- package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
- package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
- package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
- package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
- package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
- package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
- package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { EnvironmentType } from '../others/environment-type';
|
|
3
|
+
import { Utils } from '../others/utils';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../services/dictionary.service";
|
|
6
|
+
import * as i2 from "@angular/common";
|
|
7
|
+
import * as i3 from "@angular/material/progress-spinner";
|
|
8
|
+
import * as i4 from "./treeview/treeview.component";
|
|
9
|
+
export class DictionariesTreeComponent {
|
|
10
|
+
constructor(dictService) {
|
|
11
|
+
this.dictService = dictService;
|
|
12
|
+
this.allowCheckItems = true;
|
|
13
|
+
this.allowFilter = false;
|
|
14
|
+
this.drawReferenceDictionariesAsSeparateNode = true;
|
|
15
|
+
this.drawChildDictionariesAsSeparateNode = true;
|
|
16
|
+
this.drawRootNode = true;
|
|
17
|
+
this.allowSelectNonLeafNodes = false;
|
|
18
|
+
this.hideParentArrow = false;
|
|
19
|
+
// NEW: Accept preloaded dictionary data
|
|
20
|
+
this.preloadedDictionary = null;
|
|
21
|
+
this.preloadedDictionaries = null;
|
|
22
|
+
this.usePreloadedData = false;
|
|
23
|
+
this.selectedDictionaryValuesChanged = new EventEmitter();
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
// Only initialize if not already set
|
|
27
|
+
if (!this.allDictionaries) {
|
|
28
|
+
this.allDictionaries = [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
ngOnChanges(changes) {
|
|
32
|
+
if (changes['dictionaryId']) {
|
|
33
|
+
const changed = changes['dictionaryId'];
|
|
34
|
+
if (changed.currentValue !== changed.previousValue) {
|
|
35
|
+
this.loadDictionary();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// NEW: Handle preloaded data changes
|
|
39
|
+
if (changes['preloadedDictionary'] ||
|
|
40
|
+
changes['preloadedDictionaries'] ||
|
|
41
|
+
changes['usePreloadedData']) {
|
|
42
|
+
if (this.usePreloadedData && this.preloadedDictionary) {
|
|
43
|
+
this.loadFromPreloadedData();
|
|
44
|
+
}
|
|
45
|
+
else if (this.dictionaryId) {
|
|
46
|
+
this.loadDictionary();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (changes['filterText'] && this.treeViewControl) {
|
|
50
|
+
let text = changes['filterText'].currentValue;
|
|
51
|
+
this.treeViewControl.filterText(text);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
ngAfterViewInit() {
|
|
55
|
+
// If we have a main dictionary but haven't built the tree yet, build it now
|
|
56
|
+
if (this.mainDictionary && this.treeViewControl) {
|
|
57
|
+
this.rebuildTree();
|
|
58
|
+
}
|
|
59
|
+
// If we have a dictionaryId but haven't loaded the dictionary yet, load it now
|
|
60
|
+
// This handles the case where the component is initialized with a pre-populated dictionaryId
|
|
61
|
+
if (this.dictionaryId && !this.mainDictionary && !this.isLoading) {
|
|
62
|
+
if (this.usePreloadedData && this.preloadedDictionary) {
|
|
63
|
+
this.loadFromPreloadedData();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.loadDictionary();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
loadDictionary() {
|
|
71
|
+
if (this.dictionaryId) {
|
|
72
|
+
this.isLoading = true;
|
|
73
|
+
const params = {
|
|
74
|
+
env: EnvironmentType.Config, // TODO: retrieve correct environment
|
|
75
|
+
languageId: this.languageId > 0 ? this.languageId : undefined,
|
|
76
|
+
valueIdsToShow: this.valuesIdsToShow?.length > 0 ? this.valuesIdsToShow : undefined,
|
|
77
|
+
};
|
|
78
|
+
this.dictService.getDictionaryTree(this.dictionaryId, params).subscribe({
|
|
79
|
+
next: (response) => {
|
|
80
|
+
this.mainDictionary = response.mainDictionary;
|
|
81
|
+
this.allDictionaries = response.allDictionaries;
|
|
82
|
+
this.rebuildTree();
|
|
83
|
+
this.isLoading = false;
|
|
84
|
+
},
|
|
85
|
+
error: (error) => {
|
|
86
|
+
console.error('Failed to load dictionary tree:', error);
|
|
87
|
+
this.isLoading = false;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.clearTree();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* NEW: Load dictionary from preloaded data instead of API calls
|
|
97
|
+
*/
|
|
98
|
+
loadFromPreloadedData() {
|
|
99
|
+
if (!this.preloadedDictionary) {
|
|
100
|
+
console.warn('No preloaded dictionary data available, falling back to API');
|
|
101
|
+
this.loadDictionary();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.isLoading = true;
|
|
105
|
+
this.mainDictionary = { ...this.preloadedDictionary }; // Create a copy
|
|
106
|
+
// Apply value filtering if needed
|
|
107
|
+
if (this.valuesIdsToShow?.length > 0) {
|
|
108
|
+
this.mainDictionary.values =
|
|
109
|
+
this.mainDictionary.values?.filter((v) => this.valuesIdsToShow.some((c) => c == v.id)) || [];
|
|
110
|
+
}
|
|
111
|
+
// Use preloaded dictionaries for dependencies
|
|
112
|
+
this.loadAllNeededDictionariesFromPreloaded(this.mainDictionary);
|
|
113
|
+
this.isLoading = false;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* NEW: Load needed dictionaries from preloaded data instead of API calls
|
|
117
|
+
*/
|
|
118
|
+
loadAllNeededDictionariesFromPreloaded(dictionary) {
|
|
119
|
+
if (!this.preloadedDictionaries) {
|
|
120
|
+
console.warn('No preloaded dictionaries map available');
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Initialize with all preloaded dictionaries - this ensures child dictionaries are available
|
|
124
|
+
this.allDictionaries = Array.from(this.preloadedDictionaries.values());
|
|
125
|
+
// Build the tree
|
|
126
|
+
this.rebuildTree();
|
|
127
|
+
}
|
|
128
|
+
rebuildTree() {
|
|
129
|
+
// Check if treeViewControl is available (ViewChild might not be initialized yet)
|
|
130
|
+
if (!this.treeViewControl) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
let node = this.buildDictionaryTree(this.mainDictionary);
|
|
134
|
+
if (this.drawRootNode) {
|
|
135
|
+
this.treeViewControl.initialize([node]);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.treeViewControl.initialize(node.children);
|
|
139
|
+
}
|
|
140
|
+
if (this.allowCheckItems) {
|
|
141
|
+
if (this.selectedValueIds && this.selectedValueIds.length > 0) {
|
|
142
|
+
this.treeViewControl.expandAll();
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.treeViewControl.expandNode(0);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
clearTree() {
|
|
150
|
+
// Check if treeViewControl is available
|
|
151
|
+
if (!this.treeViewControl) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
let node = {};
|
|
155
|
+
this.treeViewControl.initialize([node]);
|
|
156
|
+
}
|
|
157
|
+
buildDictionaryTree(dictionary) {
|
|
158
|
+
let node = {
|
|
159
|
+
name: dictionary.name,
|
|
160
|
+
children: [],
|
|
161
|
+
data: null,
|
|
162
|
+
canSelect: false,
|
|
163
|
+
hideArrow: false,
|
|
164
|
+
};
|
|
165
|
+
// Build the tree recursively
|
|
166
|
+
this.buildTreeChildren(dictionary, node);
|
|
167
|
+
// Set canSelect for root node based on whether it has children
|
|
168
|
+
if (!this.hideParentArrow) {
|
|
169
|
+
node.canSelect = this.getCanSelect(node);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
node.canSelect = false;
|
|
173
|
+
node.hideArrow = true;
|
|
174
|
+
}
|
|
175
|
+
return node;
|
|
176
|
+
}
|
|
177
|
+
buildTreeChildren(dictionary, node) {
|
|
178
|
+
if (dictionary.values) {
|
|
179
|
+
dictionary.values.forEach((v) => {
|
|
180
|
+
let childrenNode = {
|
|
181
|
+
name: v.name,
|
|
182
|
+
children: [],
|
|
183
|
+
data: v,
|
|
184
|
+
isSelected: false,
|
|
185
|
+
canSelect: false,
|
|
186
|
+
hideArrow: false,
|
|
187
|
+
};
|
|
188
|
+
if (this.languageId > 0) {
|
|
189
|
+
const val = Utils.findValueTranslation(v.valueTranslations, this.languageId);
|
|
190
|
+
if (val) {
|
|
191
|
+
childrenNode.name = val;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (this.selectedValueIds && this.selectedValueIds.indexOf(v.id) >= 0) {
|
|
195
|
+
childrenNode.isSelected = true;
|
|
196
|
+
}
|
|
197
|
+
// Recursively build child dictionaries if any
|
|
198
|
+
if (v.childDictionaryId || v.childDictionaryUUID) {
|
|
199
|
+
let dict;
|
|
200
|
+
// Try UUID-based lookup first (for preloaded data)
|
|
201
|
+
if (v.childDictionaryUUID) {
|
|
202
|
+
dict = this.allDictionaries.find((d) => d.uuid === v.childDictionaryUUID);
|
|
203
|
+
}
|
|
204
|
+
// Fallback to ID-based lookup (for API-loaded data)
|
|
205
|
+
if (!dict && v.childDictionaryId) {
|
|
206
|
+
dict = this.allDictionaries.find((d) => d.id === v.childDictionaryId);
|
|
207
|
+
}
|
|
208
|
+
if (dict) {
|
|
209
|
+
this.buildTreeChildren(dict, childrenNode);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Handle reference values
|
|
213
|
+
if (v.referenceValues?.length > 0 &&
|
|
214
|
+
this.drawReferenceDictionariesAsSeparateNode === true) {
|
|
215
|
+
// Try to find reference dictionary by UUID first, then by ID
|
|
216
|
+
let refDict = this.allDictionaries.find((d) => dictionary.referredInDictionariesUUIds?.includes(d.uuid || ''));
|
|
217
|
+
if (!refDict) {
|
|
218
|
+
refDict = this.allDictionaries.find((d) => d.id === dictionary.referenceId);
|
|
219
|
+
}
|
|
220
|
+
v.referenceValues.forEach((rv) => {
|
|
221
|
+
let referenceNode = {
|
|
222
|
+
name: rv.name + ` (${refDict?.name})`,
|
|
223
|
+
children: [],
|
|
224
|
+
data: rv,
|
|
225
|
+
isSelected: false,
|
|
226
|
+
canSelect: true, // Reference values are leaf nodes and can be selected
|
|
227
|
+
hideArrow: false,
|
|
228
|
+
};
|
|
229
|
+
if (this.selectedValueIds &&
|
|
230
|
+
this.selectedValueIds.indexOf(rv.id) >= 0) {
|
|
231
|
+
referenceNode.isSelected = true;
|
|
232
|
+
}
|
|
233
|
+
childrenNode.children.push(referenceNode);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// Determine if the current node can be selected
|
|
237
|
+
childrenNode.canSelect = this.getCanSelect(childrenNode);
|
|
238
|
+
// Add the child node to the current node's children
|
|
239
|
+
node.children.push(childrenNode);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Helper method to determine if a node can be selected
|
|
244
|
+
getCanSelect(node) {
|
|
245
|
+
const isLeaf = node.children.length === 0;
|
|
246
|
+
return isLeaf || this.allowSelectNonLeafNodes;
|
|
247
|
+
}
|
|
248
|
+
onTreeSelectionChanged(node) {
|
|
249
|
+
var selectedNodes = this.treeViewControl.getSelectedNodes();
|
|
250
|
+
var values = selectedNodes.map((n) => n.data);
|
|
251
|
+
let dvs = this.createCopy(values);
|
|
252
|
+
this.selectedDictionaryValuesChanged.next(dvs);
|
|
253
|
+
}
|
|
254
|
+
createCopy(objectToCopy) {
|
|
255
|
+
var s = JSON.stringify(objectToCopy);
|
|
256
|
+
var news = s.replace(/"valueTranslations":/g, '"translations":');
|
|
257
|
+
return JSON.parse(news);
|
|
258
|
+
}
|
|
259
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DictionariesTreeComponent, deps: [{ token: i1.DictionaryService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
260
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DictionariesTreeComponent, selector: "app-dictionaries-tree", inputs: { dictionaryId: "dictionaryId", selectedValueIds: "selectedValueIds", allowCheckItems: "allowCheckItems", allowFilter: "allowFilter", drawReferenceDictionariesAsSeparateNode: "drawReferenceDictionariesAsSeparateNode", drawChildDictionariesAsSeparateNode: "drawChildDictionariesAsSeparateNode", drawRootNode: "drawRootNode", filterText: "filterText", allowSelectNonLeafNodes: "allowSelectNonLeafNodes", languageId: "languageId", valuesIdsToShow: "valuesIdsToShow", hideParentArrow: "hideParentArrow", preloadedDictionary: "preloadedDictionary", preloadedDictionaries: "preloadedDictionaries", usePreloadedData: "usePreloadedData" }, outputs: { selectedDictionaryValuesChanged: "selectedDictionaryValuesChanged" }, viewQueries: [{ propertyName: "treeViewControl", first: true, predicate: ["treeView"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-spinner *ngIf=\"isLoading === true\" class=\"m-x-auto\"></mat-spinner>\n<app-treeview #treeView [autoSelectDescendants]=\"false\"\n [allowCheckItems]=\"allowCheckItems\"\n [allowFilter]=\"allowFilter\"\n (selectionChanged)=\"onTreeSelectionChanged($event)\">\n\n</app-treeview>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i4.AppTreeviewComponent, selector: "app-treeview", inputs: ["allowAddItems", "autoSelectDescendants", "allowCheckItems", "allowFilter"], outputs: ["selectionChanged"] }] }); }
|
|
261
|
+
}
|
|
262
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DictionariesTreeComponent, decorators: [{
|
|
263
|
+
type: Component,
|
|
264
|
+
args: [{ selector: 'app-dictionaries-tree', template: "<mat-spinner *ngIf=\"isLoading === true\" class=\"m-x-auto\"></mat-spinner>\n<app-treeview #treeView [autoSelectDescendants]=\"false\"\n [allowCheckItems]=\"allowCheckItems\"\n [allowFilter]=\"allowFilter\"\n (selectionChanged)=\"onTreeSelectionChanged($event)\">\n\n</app-treeview>\n" }]
|
|
265
|
+
}], ctorParameters: () => [{ type: i1.DictionaryService }], propDecorators: { treeViewControl: [{
|
|
266
|
+
type: ViewChild,
|
|
267
|
+
args: ['treeView']
|
|
268
|
+
}], dictionaryId: [{
|
|
269
|
+
type: Input
|
|
270
|
+
}], selectedValueIds: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], allowCheckItems: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], allowFilter: [{
|
|
275
|
+
type: Input
|
|
276
|
+
}], drawReferenceDictionariesAsSeparateNode: [{
|
|
277
|
+
type: Input
|
|
278
|
+
}], drawChildDictionariesAsSeparateNode: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], drawRootNode: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], filterText: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], allowSelectNonLeafNodes: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], languageId: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], valuesIdsToShow: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}], hideParentArrow: [{
|
|
291
|
+
type: Input
|
|
292
|
+
}], preloadedDictionary: [{
|
|
293
|
+
type: Input
|
|
294
|
+
}], preloadedDictionaries: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}], usePreloadedData: [{
|
|
297
|
+
type: Input
|
|
298
|
+
}], selectedDictionaryValuesChanged: [{
|
|
299
|
+
type: Output
|
|
300
|
+
}] } });
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGljdGlvbmFyaWVzLXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9zaGFyZWQtY29tcG9uZW50cy9kaWN0aW9uYXJpZXMtdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL3NoYXJlZC1jb21wb25lbnRzL2RpY3Rpb25hcmllcy10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQVd4QyxNQUFNLE9BQU8seUJBQXlCO0lBNkJwQyxZQUFvQixXQUE4QjtRQUE5QixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUF2QnpDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ2hDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLDRDQUF1QyxHQUFZLElBQUksQ0FBQztRQUN4RCx3Q0FBbUMsR0FBWSxJQUFJLENBQUM7UUFDcEQsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFFN0IsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBR3pDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRTFDLHdDQUF3QztRQUMvQix3QkFBbUIsR0FBeUIsSUFBSSxDQUFDO1FBQ2pELDBCQUFxQixHQUFzQyxJQUFJLENBQUM7UUFDaEUscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRWpDLG9DQUErQixHQUN2QyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQU1hLENBQUM7SUFFdEQsUUFBUTtRQUNOLHFDQUFx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UyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFzQixDQUFDO0lBQy9DLENBQUM7K0dBaFVVLHlCQUF5QjttR0FBekIseUJBQXlCLGc1QkN4QnRDLHFVQU9BOzs0RkRpQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHVCQUF1QjtzRkFPVixlQUFlO3NCQUFyQyxTQUFTO3VCQUFDLFVBQVU7Z0JBQ1osWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLHVDQUF1QztzQkFBL0MsS0FBSztnQkFDRyxtQ0FBbUM7c0JBQTNDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFSSwrQkFBK0I7c0JBQXhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5VmFsdWUsIERpY3Rpb25hcnlEdG8sIERpY3Rpb25hcnlWYWx1ZUR0byB9IGZyb20gJy4uL21vZGVscy9kaWN0aW9uYXJ5Lm1vZGVsJztcbmltcG9ydCB7IEVudmlyb25tZW50VHlwZSB9IGZyb20gJy4uL290aGVycy9lbnZpcm9ubWVudC10eXBlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vb3RoZXJzL3V0aWxzJztcbmltcG9ydCB7IERpY3Rpb25hcnlTZXJ2aWNlLCBEaWN0aW9uYXJ5VHJlZVJlc3BvbnNlRHRvIH0gZnJvbSAnLi4vc2VydmljZXMvZGljdGlvbmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEl0ZW1Ob2RlLCBJdGVtRmxhdE5vZGUgfSBmcm9tICcuLi9tb2RlbHMvdHJlZXZpZXcubW9kZWwnO1xuaW1wb3J0IHsgQXBwVHJlZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RyZWV2aWV3L3RyZWV2aWV3LmNvbXBvbmVudCc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRpY3Rpb25hcmllcy10cmVlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpY3Rpb25hcmllcy10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RpY3Rpb25hcmllcy10cmVlLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRGljdGlvbmFyaWVzVHJlZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XG57XG4gIEBWaWV3Q2hpbGQoJ3RyZWVWaWV3JykgdHJlZVZpZXdDb250cm9sOiBBcHBUcmVldmlld0NvbXBvbmVudDtcbiAgQElucHV0KCkgZGljdGlvbmFyeUlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWVJZHM6IG51bWJlcltdO1xuICBASW5wdXQoKSBhbGxvd0NoZWNrSXRlbXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkcmF3UmVmZXJlbmNlRGljdGlvbmFyaWVzQXNTZXBhcmF0ZU5vZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBkcmF3Q2hpbGREaWN0aW9uYXJpZXNBc1NlcGFyYXRlTm9kZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRyYXdSb290Tm9kZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZpbHRlclRleHQ6IHN0cmluZztcbiAgQElucHV0KCkgYWxsb3dTZWxlY3ROb25MZWFmTm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbGFuZ3VhZ2VJZDogbnVtYmVyO1xuICBASW5wdXQoKSB2YWx1ZXNJZHNUb1Nob3c6IG51bWJlcltdO1xuICBASW5wdXQoKSBoaWRlUGFyZW50QXJyb3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBORVc6IEFjY2VwdCBwcmVsb2FkZWQgZGljdGlvbmFyeSBkYXRhXG4gIEBJbnB1dCgpIHByZWxvYWRlZERpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcHJlbG9hZGVkRGljdGlvbmFyaWVzOiBNYXA8c3RyaW5nLCBEaWN0aW9uYXJ5RHRvPiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSB1c2VQcmVsb2FkZWREYXRhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkRGljdGlvbmFyeVZhbHVlc0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxEaWN0aW9uYXJ5VmFsdWVbXT4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RGljdGlvbmFyeVZhbHVlW10+KCk7XG5cbiAgYWxsRGljdGlvbmFyaWVzOiBEaWN0aW9uYXJ5RHRvW107XG4gIG1haW5EaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvO1xuICBpc0xvYWRpbmc6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWN0U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gT25seSBpbml0aWFsaXplIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgIGlmICghdGhpcy5hbGxEaWN0aW9uYXJpZXMpIHtcbiAgICAgIHRoaXMuYWxsRGljdGlvbmFyaWVzID0gW107XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkaWN0aW9uYXJ5SWQnXSkge1xuICAgICAgY29uc3QgY2hhbmdlZCA9IGNoYW5nZXNbJ2RpY3Rpb25hcnlJZCddO1xuICAgICAgaWYgKGNoYW5nZWQuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VkLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5sb2FkRGljdGlvbmFyeSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5FVzogSGFuZGxlIHByZWxvYWRlZCBkYXRhIGNoYW5nZXNcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydwcmVsb2FkZWREaWN0aW9uYXJ5J10gfHxcbiAgICAgIGNoYW5nZXNbJ3ByZWxvYWRlZERpY3Rpb25hcmllcyddIHx8XG4gICAgICBjaGFuZ2VzWyd1c2VQcmVsb2FkZWREYXRhJ11cbiAgICApIHtcbiAgICAgIGlmICh0aGlzLnVzZVByZWxvYWRlZERhdGEgJiYgdGhpcy5wcmVsb2FkZWREaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMubG9hZEZyb21QcmVsb2FkZWREYXRhKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGljdGlvbmFyeUlkKSB7XG4gICAgICAgIHRoaXMubG9hZERpY3Rpb25hcnkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZmlsdGVyVGV4dCddICYmIHRoaXMudHJlZVZpZXdDb250cm9sKSB7XG4gICAgICBsZXQgdGV4dCA9IGNoYW5nZXNbJ2ZpbHRlclRleHQnXS5jdXJyZW50VmFsdWUgYXMgc3RyaW5nO1xuICAgICAgdGhpcy50cmVlVmlld0NvbnRyb2wuZmlsdGVyVGV4dCh0ZXh0KTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIG1haW4gZGljdGlvbmFyeSBidXQgaGF2ZW4ndCBidWlsdCB0aGUgdHJlZSB5ZXQsIGJ1aWxkIGl0IG5vd1xuICAgIGlmICh0aGlzLm1haW5EaWN0aW9uYXJ5ICYmIHRoaXMudHJlZVZpZXdDb250cm9sKSB7XG4gICAgICB0aGlzLnJlYnVpbGRUcmVlKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIGRpY3Rpb25hcnlJZCBidXQgaGF2ZW4ndCBsb2FkZWQgdGhlIGRpY3Rpb25hcnkgeWV0LCBsb2FkIGl0IG5vd1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxpemVkIHdpdGggYSBwcmUtcG9wdWxhdGVkIGRpY3Rpb25hcnlJZFxuICAgIGlmICh0aGlzLmRpY3Rpb25hcnlJZCAmJiAhdGhpcy5tYWluRGljdGlvbmFyeSAmJiAhdGhpcy5pc0xvYWRpbmcpIHtcbiAgICAgIGlmICh0aGlzLnVzZVByZWxvYWRlZERhdGEgJiYgdGhpcy5wcmVsb2FkZWREaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMubG9hZEZyb21QcmVsb2FkZWREYXRhKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvYWREaWN0aW9uYXJ5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZERpY3Rpb25hcnkoKSB7XG4gICAgaWYgKHRoaXMuZGljdGlvbmFyeUlkKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgZW52OiBFbnZpcm9ubWVudFR5cGUuQ29uZmlnLCAvLyBUT0RPOiByZXRyaWV2ZSBjb3JyZWN0IGVudmlyb25tZW50XG4gICAgICAgIGxhbmd1YWdlSWQ6IHRoaXMubGFuZ3VhZ2VJZCA+IDAgPyB0aGlzLmxhbmd1YWdlSWQgOiB1bmRlZmluZWQsXG4gICAgICAgIHZhbHVlSWRzVG9TaG93OlxuICAgICAgICAgIHRoaXMudmFsdWVzSWRzVG9TaG93Py5sZW5ndGggPiAwID8gdGhpcy52YWx1ZXNJZHNUb1Nob3cgOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmRpY3RTZXJ2aWNlLmdldERpY3Rpb25hcnlUcmVlKHRoaXMuZGljdGlvbmFyeUlkLCBwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogRGljdGlvbmFyeVRyZWVSZXNwb25zZUR0bykgPT4ge1xuICAgICAgICAgIHRoaXMubWFpbkRpY3Rpb25hcnkgPSByZXNwb25zZS5tYWluRGljdGlvbmFyeTtcbiAgICAgICAgICB0aGlzLmFsbERpY3Rpb25hcmllcyA9IHJlc3BvbnNlLmFsbERpY3Rpb25hcmllcztcbiAgICAgICAgICB0aGlzLnJlYnVpbGRUcmVlKCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGRpY3Rpb25hcnkgdHJlZTonLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyVHJlZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBORVc6IExvYWQgZGljdGlvbmFyeSBmcm9tIHByZWxvYWRlZCBkYXRhIGluc3RlYWQgb2YgQVBJIGNhbGxzXG4gICAqL1xuICBsb2FkRnJvbVByZWxvYWRlZERhdGEoKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZERpY3Rpb25hcnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ05vIHByZWxvYWRlZCBkaWN0aW9uYXJ5IGRhdGEgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gQVBJJ1xuICAgICAgKTtcbiAgICAgIHRoaXMubG9hZERpY3Rpb25hcnkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5tYWluRGljdGlvbmFyeSA9IHsgLi4udGhpcy5wcmVsb2FkZWREaWN0aW9uYXJ5IH07IC8vIENyZWF0ZSBhIGNvcHlcblxuICAgIC8vIEFwcGx5IHZhbHVlIGZpbHRlcmluZyBpZiBuZWVkZWRcbiAgICBpZiAodGhpcy52YWx1ZXNJZHNUb1Nob3c/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubWFpbkRpY3Rpb25hcnkudmFsdWVzID1cbiAgICAgICAgdGhpcy5tYWluRGljdGlvbmFyeS52YWx1ZXM/LmZpbHRlcigodikgPT5cbiAgICAgICAgICB0aGlzLnZhbHVlc0lkc1RvU2hvdy5zb21lKChjKSA9PiBjID09IHYuaWQpXG4gICAgICAgICkgfHwgW107XG4gICAgfVxuXG4gICAgLy8gVXNlIHByZWxvYWRlZCBkaWN0aW9uYXJpZXMgZm9yIGRlcGVuZGVuY2llc1xuICAgIHRoaXMubG9hZEFsbE5lZWRlZERpY3Rpb25hcmllc0Zyb21QcmVsb2FkZWQodGhpcy5tYWluRGljdGlvbmFyeSk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBORVc6IExvYWQgbmVlZGVkIGRpY3Rpb25hcmllcyBmcm9tIHByZWxvYWRlZCBkYXRhIGluc3RlYWQgb2YgQVBJIGNhbGxzXG4gICAqL1xuICBsb2FkQWxsTmVlZGVkRGljdGlvbmFyaWVzRnJvbVByZWxvYWRlZChkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZERpY3Rpb25hcmllcykge1xuICAgICAgY29uc29sZS53YXJuKCdObyBwcmVsb2FkZWQgZGljdGlvbmFyaWVzIG1hcCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHdpdGggYWxsIHByZWxvYWRlZCBkaWN0aW9uYXJpZXMgLSB0aGlzIGVuc3VyZXMgY2hpbGQgZGljdGlvbmFyaWVzIGFyZSBhdmFpbGFibGVcbiAgICB0aGlzLmFsbERpY3Rpb25hcmllcyA9IEFycmF5LmZyb20odGhpcy5wcmVsb2FkZWREaWN0aW9uYXJpZXMudmFsdWVzKCkpO1xuXG4gICAgLy8gQnVpbGQgdGhlIHRyZWVcbiAgICB0aGlzLnJlYnVpbGRUcmVlKCk7XG4gIH1cblxuICByZWJ1aWxkVHJlZSgpIHtcbiAgICAvLyBDaGVjayBpZiB0cmVlVmlld0NvbnRyb2wgaXMgYXZhaWxhYmxlIChWaWV3Q2hpbGQgbWlnaHQgbm90IGJlIGluaXRpYWxpemVkIHlldClcbiAgICBpZiAoIXRoaXMudHJlZVZpZXdDb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLmJ1aWxkRGljdGlvbmFyeVRyZWUodGhpcy5tYWluRGljdGlvbmFyeSk7XG4gICAgaWYgKHRoaXMuZHJhd1Jvb3ROb2RlKSB7XG4gICAgICB0aGlzLnRyZWVWaWV3Q29udHJvbC5pbml0aWFsaXplKFtub2RlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJlZVZpZXdDb250cm9sLmluaXRpYWxpemUobm9kZS5jaGlsZHJlbik7XG4gICAgfVxuICAgIGlmICh0aGlzLmFsbG93Q2hlY2tJdGVtcykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZUlkcyAmJiB0aGlzLnNlbGVjdGVkVmFsdWVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnRyZWVWaWV3Q29udHJvbC5leHBhbmRBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJlZVZpZXdDb250cm9sLmV4cGFuZE5vZGUoMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJUcmVlKCkge1xuICAgIC8vIENoZWNrIGlmIHRyZWVWaWV3Q29udHJvbCBpcyBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXMudHJlZVZpZXdDb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5vZGUgPSB7fSBhcyBJdGVtTm9kZTtcbiAgICB0aGlzLnRyZWVWaWV3Q29udHJvbC5pbml0aWFsaXplKFtub2RlXSk7XG4gIH1cblxuICBidWlsZERpY3Rpb25hcnlUcmVlKGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8pOiBJdGVtTm9kZSB7XG4gICAgbGV0IG5vZGUgPSB7XG4gICAgICBuYW1lOiBkaWN0aW9uYXJ5Lm5hbWUsXG4gICAgICBjaGlsZHJlbjogW10sXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgY2FuU2VsZWN0OiBmYWxzZSxcbiAgICAgIGhpZGVBcnJvdzogZmFsc2UsXG4gICAgfSBhcyBJdGVtTm9kZTtcblxuICAgIC8vIEJ1aWxkIHRoZSB0cmVlIHJlY3Vyc2l2ZWx5XG4gICAgdGhpcy5idWlsZFRyZWVDaGlsZHJlbihkaWN0aW9uYXJ5LCBub2RlKTtcblxuICAgIC8vIFNldCBjYW5TZWxlY3QgZm9yIHJvb3Qgbm9kZSBiYXNlZCBvbiB3aGV0aGVyIGl0IGhhcyBjaGlsZHJlblxuICAgIGlmICghdGhpcy5oaWRlUGFyZW50QXJyb3cpIHtcbiAgICAgIG5vZGUuY2FuU2VsZWN0ID0gdGhpcy5nZXRDYW5TZWxlY3Qobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuY2FuU2VsZWN0ID0gZmFsc2U7XG4gICAgICBub2RlLmhpZGVBcnJvdyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBidWlsZFRyZWVDaGlsZHJlbihkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvLCBub2RlOiBJdGVtTm9kZSk6IHZvaWQge1xuICAgIGlmIChkaWN0aW9uYXJ5LnZhbHVlcykge1xuICAgICAgZGljdGlvbmFyeS52YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICBsZXQgY2hpbGRyZW5Ob2RlID0ge1xuICAgICAgICAgIG5hbWU6IHYubmFtZSxcbiAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgZGF0YTogdixcbiAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICBjYW5TZWxlY3Q6IGZhbHNlLFxuICAgICAgICAgIGhpZGVBcnJvdzogZmFsc2UsXG4gICAgICAgIH0gYXMgSXRlbU5vZGU7XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlSWQgPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gVXRpbHMuZmluZFZhbHVlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB2LnZhbHVlVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbk5vZGUubmFtZSA9IHZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlSWRzICYmIHRoaXMuc2VsZWN0ZWRWYWx1ZUlkcy5pbmRleE9mKHYuaWQpID49IDApIHtcbiAgICAgICAgICBjaGlsZHJlbk5vZGUuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWN1cnNpdmVseSBidWlsZCBjaGlsZCBkaWN0aW9uYXJpZXMgaWYgYW55XG4gICAgICAgIGlmICh2LmNoaWxkRGljdGlvbmFyeUlkIHx8IHYuY2hpbGREaWN0aW9uYXJ5VVVJRCkge1xuICAgICAgICAgIGxldCBkaWN0OiBEaWN0aW9uYXJ5RHRvIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgLy8gVHJ5IFVVSUQtYmFzZWQgbG9va3VwIGZpcnN0IChmb3IgcHJlbG9hZGVkIGRhdGEpXG4gICAgICAgICAgaWYgKHYuY2hpbGREaWN0aW9uYXJ5VVVJRCkge1xuICAgICAgICAgICAgZGljdCA9IHRoaXMuYWxsRGljdGlvbmFyaWVzLmZpbmQoXG4gICAgICAgICAgICAgIChkKSA9PiBkLnV1aWQgPT09IHYuY2hpbGREaWN0aW9uYXJ5VVVJRFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBJRC1iYXNlZCBsb29rdXAgKGZvciBBUEktbG9hZGVkIGRhdGEpXG4gICAgICAgICAgaWYgKCFkaWN0ICYmIHYuY2hpbGREaWN0aW9uYXJ5SWQpIHtcbiAgICAgICAgICAgIGRpY3QgPSB0aGlzLmFsbERpY3Rpb25hcmllcy5maW5kKFxuICAgICAgICAgICAgICAoZCkgPT4gZC5pZCA9PT0gdi5jaGlsZERpY3Rpb25hcnlJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGljdCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZFRyZWVDaGlsZHJlbihkaWN0LCBjaGlsZHJlbk5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSByZWZlcmVuY2UgdmFsdWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICB2LnJlZmVyZW5jZVZhbHVlcz8ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHRoaXMuZHJhd1JlZmVyZW5jZURpY3Rpb25hcmllc0FzU2VwYXJhdGVOb2RlID09PSB0cnVlXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRyeSB0byBmaW5kIHJlZmVyZW5jZSBkaWN0aW9uYXJ5IGJ5IFVVSUQgZmlyc3QsIHRoZW4gYnkgSURcbiAgICAgICAgICBsZXQgcmVmRGljdCA9IHRoaXMuYWxsRGljdGlvbmFyaWVzLmZpbmQoKGQpID0+XG4gICAgICAgICAgICBkaWN0aW9uYXJ5LnJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcz8uaW5jbHVkZXMoZC51dWlkIHx8ICcnKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXJlZkRpY3QpIHtcbiAgICAgICAgICAgIHJlZkRpY3QgPSB0aGlzLmFsbERpY3Rpb25hcmllcy5maW5kKFxuICAgICAgICAgICAgICAoZCkgPT4gZC5pZCA9PT0gZGljdGlvbmFyeS5yZWZlcmVuY2VJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2LnJlZmVyZW5jZVZhbHVlcy5mb3JFYWNoKChydikgPT4ge1xuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZU5vZGUgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHJ2Lm5hbWUgKyBgICgke3JlZkRpY3Q/Lm5hbWV9KWAsXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgZGF0YTogcnYsXG4gICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBjYW5TZWxlY3Q6IHRydWUsIC8vIFJlZmVyZW5jZSB2YWx1ZXMgYXJlIGxlYWYgbm9kZXMgYW5kIGNhbiBiZSBzZWxlY3RlZFxuICAgICAgICAgICAgICBoaWRlQXJyb3c6IGZhbHNlLFxuICAgICAgICAgICAgfSBhcyBJdGVtTm9kZTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVJZHMgJiZcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlSWRzLmluZGV4T2YocnYuaWQpID49IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZWZlcmVuY2VOb2RlLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGlsZHJlbk5vZGUuY2hpbGRyZW4ucHVzaChyZWZlcmVuY2VOb2RlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgY3VycmVudCBub2RlIGNhbiBiZSBzZWxlY3RlZFxuICAgICAgICBjaGlsZHJlbk5vZGUuY2FuU2VsZWN0ID0gdGhpcy5nZXRDYW5TZWxlY3QoY2hpbGRyZW5Ob2RlKTtcblxuICAgICAgICAvLyBBZGQgdGhlIGNoaWxkIG5vZGUgdG8gdGhlIGN1cnJlbnQgbm9kZSdzIGNoaWxkcmVuXG4gICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZHJlbk5vZGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSBub2RlIGNhbiBiZSBzZWxlY3RlZFxuICBnZXRDYW5TZWxlY3Qobm9kZTogSXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0xlYWYgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gaXNMZWFmIHx8IHRoaXMuYWxsb3dTZWxlY3ROb25MZWFmTm9kZXM7XG4gIH1cblxuICBvblRyZWVTZWxlY3Rpb25DaGFuZ2VkKG5vZGU6IEl0ZW1GbGF0Tm9kZSkge1xuICAgIHZhciBzZWxlY3RlZE5vZGVzID0gdGhpcy50cmVlVmlld0NvbnRyb2wuZ2V0U2VsZWN0ZWROb2RlcygpO1xuICAgIHZhciB2YWx1ZXMgPSBzZWxlY3RlZE5vZGVzLm1hcCgobikgPT4gbi5kYXRhKSBhcyBEaWN0aW9uYXJ5VmFsdWVEdG9bXTtcbiAgICBsZXQgZHZzID0gdGhpcy5jcmVhdGVDb3B5KHZhbHVlcyk7XG5cbiAgICB0aGlzLnNlbGVjdGVkRGljdGlvbmFyeVZhbHVlc0NoYW5nZWQubmV4dChkdnMpO1xuICB9XG5cbiAgY3JlYXRlQ29weShvYmplY3RUb0NvcHk6IERpY3Rpb25hcnlWYWx1ZUR0b1tdKTogRGljdGlvbmFyeVZhbHVlW10ge1xuICAgIHZhciBzID0gSlNPTi5zdHJpbmdpZnkob2JqZWN0VG9Db3B5KTtcbiAgICB2YXIgbmV3cyA9IHMucmVwbGFjZSgvXCJ2YWx1ZVRyYW5zbGF0aW9uc1wiOi9nLCAnXCJ0cmFuc2xhdGlvbnNcIjonKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShuZXdzKSBhcyBEaWN0aW9uYXJ5VmFsdWVbXTtcbiAgfVxufVxuIiwiPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nID09PSB0cnVlXCIgY2xhc3M9XCJtLXgtYXV0b1wiPjwvbWF0LXNwaW5uZXI+XG48YXBwLXRyZWV2aWV3ICN0cmVlVmlldyBbYXV0b1NlbGVjdERlc2NlbmRhbnRzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2FsbG93Q2hlY2tJdGVtc109XCJhbGxvd0NoZWNrSXRlbXNcIlxuICAgICAgICAgICAgICBbYWxsb3dGaWx0ZXJdPVwiYWxsb3dGaWx0ZXJcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlZCk9XCJvblRyZWVTZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj5cblxuPC9hcHAtdHJlZXZpZXc+XG4iXX0=
|