@eqproject/eqp-dynamic-module 2.8.38 → 2.9.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.
Files changed (42) hide show
  1. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +3 -9
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +42 -43
  3. package/esm2020/lib/components/private/action-button-creator/action-button-creator.component.mjs +204 -0
  4. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +38 -78
  5. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +12 -3
  6. package/esm2020/lib/components/private/field-templates/action-button-field-template/action-button-field-template.component.mjs +52 -0
  7. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +19 -17
  8. package/esm2020/lib/components/private/form-records/hlist-form-record/hlist-form-record.component.mjs +2 -9
  9. package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +2 -8
  10. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +45 -17
  11. package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +3 -9
  12. package/esm2020/lib/components/private/form-records/view-form-record/view-form-record.component.mjs +2 -8
  13. package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +4 -7
  14. package/esm2020/lib/components/private/graphs/graphs.component.mjs +4 -7
  15. package/esm2020/lib/components/private/trigger-creator/trigger-creator.component.mjs +1 -1
  16. package/esm2020/lib/eqp-dynamic-module.module.mjs +9 -3
  17. package/esm2020/lib/models/baseField.model.mjs +2 -1
  18. package/esm2020/lib/models/fields/actionButton.model.mjs +6 -0
  19. package/esm2020/lib/models/trigger.model.mjs +5 -7
  20. package/fesm2015/eqproject-eqp-dynamic-module.mjs +408 -209
  21. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  22. package/fesm2020/eqproject-eqp-dynamic-module.mjs +408 -209
  23. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  24. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +2 -4
  25. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +8 -5
  26. package/lib/components/private/action-button-creator/action-button-creator.component.d.ts +42 -0
  27. package/lib/components/private/add-form-field/add-form-field.component.d.ts +5 -12
  28. package/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.d.ts +4 -1
  29. package/lib/components/private/field-templates/action-button-field-template/action-button-field-template.component.d.ts +19 -0
  30. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +3 -4
  31. package/lib/components/private/form-records/hlist-form-record/hlist-form-record.component.d.ts +2 -4
  32. package/lib/components/private/form-records/list-form-record/list-form-record.component.d.ts +2 -4
  33. package/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.d.ts +2 -4
  34. package/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.d.ts +2 -4
  35. package/lib/components/private/form-records/view-form-record/view-form-record.component.d.ts +2 -4
  36. package/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.d.ts +3 -4
  37. package/lib/components/private/graphs/graphs.component.d.ts +3 -4
  38. package/lib/eqp-dynamic-module.module.d.ts +16 -14
  39. package/lib/models/baseField.model.d.ts +2 -1
  40. package/lib/models/fields/actionButton.model.d.ts +17 -0
  41. package/lib/models/trigger.model.d.ts +7 -14
  42. package/package.json +1 -1
@@ -0,0 +1,204 @@
1
+ import { Component, Input, EventEmitter, Output, ViewChild } from '@angular/core';
2
+ import { ActionButton, ActionFlagEnum, TriggerPropertyTypeEnum } from '../../../models/trigger.model';
3
+ import { ParamTypeEnum } from '../../../models/endPointConfiguration.model';
4
+ import { FieldTypeEnum } from '../../../models/baseField.model';
5
+ import { GlobalService } from '../../../services/global.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/dialog";
8
+ import * as i2 from "../../../services/utilityHelper.services";
9
+ import * as i3 from "@angular/material/button";
10
+ import * as i4 from "@angular/material/input";
11
+ import * as i5 from "@angular/material/form-field";
12
+ import * as i6 from "@angular/material/card";
13
+ import * as i7 from "@angular/material/tooltip";
14
+ import * as i8 from "@angular/forms";
15
+ import * as i9 from "@angular/common";
16
+ import * as i10 from "@eqproject/eqp-select";
17
+ import * as i11 from "../add-formula-field/add-formula-field.component";
18
+ export class ActionButtonCreatorComponent {
19
+ constructor(dialog, utilityHelperService) {
20
+ this.dialog = dialog;
21
+ this.utilityHelperService = utilityHelperService;
22
+ this.actionButton = null;
23
+ this.actionButtonField = null;
24
+ this.formulas = null;
25
+ this.InField = false;
26
+ this.onSaveRecord = new EventEmitter();
27
+ this.onChangeSomething = new EventEmitter();
28
+ this.FieldTypeEnum = FieldTypeEnum;
29
+ this.isSaving = false;
30
+ this.formulaKeys = new Array();
31
+ this.formulaFieldsStructure = new Array();
32
+ this.actionsFlag = ActionFlagEnum;
33
+ this.triggerPropertyType = TriggerPropertyTypeEnum;
34
+ }
35
+ ngOnInit() {
36
+ ///
37
+ /// Questo componente funziona sia per i bottoni dei fields sia per i bottoni sugli header (addrecord, listview eccetera)
38
+ /// Se si sta lavorando sui fields è popolato 'this.actionButtonField' altrimenti è null.
39
+ ///
40
+ if (this.actionButtonField != null) {
41
+ this.actionButton = this.actionButtonField;
42
+ }
43
+ if (this.actionButton != null && this.actionButton.execution != null) {
44
+ this.selectedFormula = {};
45
+ this.selectedFormula.key = this.actionButton.execution;
46
+ if (this.actionButtonField == null) {
47
+ this.formulaFieldsStructure = new Array();
48
+ Object.keys(this.formulas[this.selectedFormula.key]).forEach((res) => {
49
+ this.formulaFieldsStructure.push({ "key": res, "type": this.formulas[this.selectedFormula.key][res].type, "tooltip": this.formulas[this.selectedFormula.key][res].tooltip });
50
+ });
51
+ Object.keys(this.actionButton.formulasTemp).forEach((res) => {
52
+ this.formulaFieldsStructure.find(x => x.key == res).value = this.actionButton.formulasTemp[res].value;
53
+ });
54
+ }
55
+ else {
56
+ this.formulaFieldsStructure.push(this.actionButton.formulas);
57
+ }
58
+ }
59
+ if (this.actionButton == null) {
60
+ this.actionButton = new ActionButton();
61
+ }
62
+ var executeGetModules = false;
63
+ Object.keys(this.formulas).forEach((res) => {
64
+ this.formulaKeys.push({ "key": res });
65
+ Object.keys(this.formulas[res]).forEach((property) => {
66
+ if (this.formulas[res][property].type == TriggerPropertyTypeEnum.DMMODULE) {
67
+ executeGetModules = true;
68
+ }
69
+ });
70
+ });
71
+ if (executeGetModules) {
72
+ this.getAllModules();
73
+ }
74
+ }
75
+ openFormulaDialog(formulaField) {
76
+ this.dialogFormulaRef = this.dialog.open(this.dialogFormula, {
77
+ disableClose: true,
78
+ hasBackdrop: true,
79
+ width: "75%",
80
+ data: {
81
+ formula: this.formulaFieldsStructure.find(x => x.key == formulaField.key).value,
82
+ fields: this.form.Fields
83
+ },
84
+ });
85
+ this.dialogFormulaRef.afterClosed().subscribe((result) => {
86
+ var formulaToChange = this.formulaFieldsStructure.find(x => x.key == formulaField.key);
87
+ formulaToChange.value = result.formula.toString() == "" ? null : result.formula.toString();
88
+ this.onFormulaFieldChange(formulaToChange);
89
+ });
90
+ }
91
+ onFormulaFieldChange(formulaField) {
92
+ this.changeSomething();
93
+ }
94
+ onEqpSelectModule(ev, formulaField) {
95
+ formulaField.value = ev.ID;
96
+ this.changeSomething();
97
+ }
98
+ saveOrExitForm(exit) {
99
+ GlobalService.debugLog('add-form-record saveRecordEvent');
100
+ if (exit) {
101
+ this.onSaveRecord.emit(null);
102
+ }
103
+ else {
104
+ this.actionButton.ButtonCode = this.selectedFormula.key;
105
+ this.formulaFieldsStructure.forEach((formulaField) => {
106
+ if (typeof this.actionButton.formulas == "undefined") {
107
+ this.actionButton.formulas = {};
108
+ }
109
+ this.actionButton.formulasTemp[formulaField.key] = formulaField;
110
+ this.actionButton.execution = this.selectedFormula.key;
111
+ });
112
+ this.isSaving = true;
113
+ this.onSaveRecord.emit(this.actionButton);
114
+ }
115
+ }
116
+ changeSomething() {
117
+ this.actionButton.ButtonCode = this.selectedFormula.key;
118
+ if (!this.actionButton.formulasTemp) {
119
+ this.actionButton.formulasTemp = {};
120
+ }
121
+ console.log("CHANGE SOMETHING", this.actionButton, this.formulaFieldsStructure);
122
+ this.formulaFieldsStructure.forEach((formulaField) => {
123
+ if (typeof this.actionButton.formulas == "undefined") {
124
+ this.actionButton.formulas = {};
125
+ }
126
+ this.actionButton.formulasTemp[formulaField.key] = formulaField;
127
+ this.actionButton.execution = this.selectedFormula.key;
128
+ });
129
+ this.onChangeSomething.emit(this.actionButton);
130
+ }
131
+ getAllModules() {
132
+ const dynamicModuleParams = new Array();
133
+ dynamicModuleParams.push({
134
+ ParamName: "orgaid",
135
+ ParamValue: this.form.OrgaID,
136
+ ParamType: ParamTypeEnum["Query param"],
137
+ });
138
+ this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Forms.GetAllFormEndPoint, dynamicModuleParams, (res) => {
139
+ this.forms = res;
140
+ this.forms = this.forms.sort((uno, due) => uno.Name.localeCompare(due.Name));
141
+ this.formulaFieldsStructure.forEach((res) => {
142
+ if (res.type == TriggerPropertyTypeEnum.DMMODULE) {
143
+ res.object = this.forms.find(x => x.ID == res.value);
144
+ }
145
+ });
146
+ }, (err) => { });
147
+ }
148
+ onChangeFormula(formula) {
149
+ if (formula == null) {
150
+ this.changeSomething();
151
+ return;
152
+ }
153
+ GlobalService.debugLog('@@trigger-creator:onChangeFormula selected formula', formula);
154
+ GlobalService.debugLog('@@trigger-creator:onChangeFormula formulas', this.formulas);
155
+ this.formulaFieldsStructure = new Array();
156
+ console.log("onChangeFormula", this.formulas, formula.key);
157
+ //------------
158
+ Object.keys(this.formulas[formula.key]).forEach((res) => {
159
+ this.formulaFieldsStructure.push({ "key": res, "type": this.formulas[formula.key][res].type,
160
+ "tooltip": this.formulas[formula.key][res].tooltip });
161
+ });
162
+ //------------
163
+ /* *** originale ***
164
+ Object.keys(this.formulas[formula.key]).forEach((res) => {
165
+ this.formulaFieldsStructure.push({"key": res, "type": this.formulas[formula.key][res].type
166
+ });
167
+ });
168
+ *** */
169
+ GlobalService.debugLog('@@trigger-creator:onChangeFormula formulaFieldsStructure', this.formulaFieldsStructure);
170
+ this.changeSomething();
171
+ }
172
+ }
173
+ ActionButtonCreatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ActionButtonCreatorComponent, deps: [{ token: i1.MatDialog }, { token: i2.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
174
+ ActionButtonCreatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ActionButtonCreatorComponent, selector: "action-button-creator", inputs: { form: "form", actionButton: "actionButton", actionButtonField: "actionButtonField", formulas: "formulas", endPointConfiguration: "endPointConfiguration", InField: "InField" }, outputs: { onSaveRecord: "onSaveRecord", onChangeSomething: "onChangeSomething" }, viewQueries: [{ propertyName: "dialogFormula", first: true, predicate: ["dialogFormula"], descendants: true, static: true }], ngImport: i0, template: "\r\n<mat-card class=\"add-form-field\">\r\n <mat-card-header *ngIf=\"!InField\">\r\n <mat-card-title>\r\n {{actionButton != null ? \"Modifica\" : \"Aggiungi\"}} actionButton\r\n </mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content>\r\n\r\n <div class=\"container-fluid containerContent padder\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-3\">Tipo Action Button</div>\r\n <div class=\"col-9\">\r\n <eqp-select [arrayData]=\"formulaKeys\" [(ngModelInput)]=\"selectedFormula\"\r\n [arrayKeyProperty]=\"'key'\" [arrayValueProperty]=\"'key'\" [showCancelButton]=\"true\" (ngModelInputChange)=\"onChangeFormula($event)\">\r\n </eqp-select> \r\n </div>\r\n </div>\r\n \r\n <div class=\"row\">\r\n <div class=\"col-3\">Etichetta</div>\r\n <div class=\"col-9\">\r\n <mat-form-field>\r\n <mat-label class=\"pt-1\"> Etichetta </mat-label>\r\n <input matInput [(ngModel)]=\"actionButton.ButtonLabel\" [readonly]=\"false\" [required]=\"true\" (keyup)=\"changeSomething()\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n \r\n <div class=\"row\">\r\n <div class=\"col-3\">Icona (<a href='https://www.angularjswiki.com/angular/angular-material-icons-list-mat-icon-list' target=\"_blank\">lista</a>)</div>\r\n <div class=\"col-9\">\r\n <mat-form-field>\r\n <mat-label class=\"pt-1\"> Icona Material (<a href='https://www.angularjswiki.com/angular/angular-material-icons-list-mat-icon-list' target=\"_blank\">lista</a>) </mat-label>\r\n <input matInput [(ngModel)]=\"actionButton.Icon\" [readonly]=\"false\" [required]=\"true\" (keyup)=\"changeSomething()\">\r\n </mat-form-field>\r\n </div>\r\n </div> \r\n \r\n <div class=\"row\" *ngIf=\"!InField\">\r\n <div class=\"col-3\">Sezioni</div>\r\n <div class=\"col-9\">\r\n <mat-label class=\"pt-1\"> Sezioni </mat-label>\r\n <eqp-select\r\n [enumData]=\"actionsFlag\"\r\n [isSearchable]=\"true\"\r\n [isMultiSelect] = \"true\"\r\n [(ngModelInput)]=\"actionButton.ShowIn\" \r\n (ngModelInputChange)=\"changeSomething()\" \r\n >\r\n </eqp-select>\r\n </div>\r\n </div> \r\n\r\n <div class=\"row\" *ngFor=\"let formulaField of formulaFieldsStructure\">\r\n <div class=\"col-3\">{{formulaField.key}}</div>\r\n <div class=\"col-9\" *ngIf=\"formulaField.type == triggerPropertyType.STRING\">\r\n <mat-form-field>\r\n <mat-label class=\"pt-1\"> {{formulaField.key}}</mat-label>\r\n <input matInput [readonly]=\"false\" [required]=\"false\" [matTooltip]=\"formulaField.tooltip\" (click)=\"openFormulaDialog(formulaField)\" [(ngModel)]=\"formulaField.value\" (ngModelChange)=\"onFormulaFieldChange(formulaField)\">\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-9\" *ngIf=\"formulaField.type == triggerPropertyType.DMMODULE\">\r\n <eqp-select [placeholder]=\"'Seleziona modulo'\" [arrayData]=\"forms\" [(ngModelInput)]=\"formulaField.object\" [isSearchable]=\"true\"\r\n [arrayKeyProperty]=\"'ID'\" [arrayValueProperty]=\"'Name'\" [ngModelOptions]=\"{ standalone: true }\" (ngModelInputChange)=\"onEqpSelectModule($event, formulaField)\">\r\n </eqp-select>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </mat-card-content>\r\n <mat-card-footer *ngIf=\"!InField\">\r\n <div class=\"d-flex justify-content-end mt-2 mb-1 me-3\"> \r\n <button class=\"mr-2\" mat-raised-button type=\"button\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"isSaving\">\r\n <span *ngIf=\"!isSaving\">Salva</span>\r\n <span *ngIf=\"isSaving\">Salvataggio in Corso...</span>\r\n </button>\r\n </div>\r\n </mat-card-footer>\r\n\r\n</mat-card>\r\n\r\n<!--DIALOG PER SEMPLIFICARE LA SCRITTURA DEL CAMPO FORMULA-->\r\n<ng-template #dialogFormula>\r\n <eqp-dynamic-module-add-formula-component>\r\n </eqp-dynamic-module-add-formula-component>\r\n</ng-template>", styles: [""], dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i6.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i10.EqpSelectComponent, selector: "eqp-select", inputs: ["placeholder", "enumData", "enumDataToExclude", "arrayData", "arrayKeyProperty", "arrayValueProperty", "ngModelOptions", "ngModelInput", "formGroupInput", "formControlNameInput", "isRequired", "isDisabled", "isMultiLanguage", "multilanguagePrefixKey", "isAlphabeticalOrderable", "suffixIcon", "prefixIcon", "isMultiSelect", "includeFullObject", "showCancelButton", "isSearchable", "searchText", "noResultSearchText", "data"], outputs: ["ngModelInputChange"] }, { kind: "component", type: i11.AddFormulaComponent, selector: "eqp-dynamic-module-add-formula-component" }] });
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ActionButtonCreatorComponent, decorators: [{
176
+ type: Component,
177
+ args: [{ selector: 'action-button-creator', template: "\r\n<mat-card class=\"add-form-field\">\r\n <mat-card-header *ngIf=\"!InField\">\r\n <mat-card-title>\r\n {{actionButton != null ? \"Modifica\" : \"Aggiungi\"}} actionButton\r\n </mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content>\r\n\r\n <div class=\"container-fluid containerContent padder\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-3\">Tipo Action Button</div>\r\n <div class=\"col-9\">\r\n <eqp-select [arrayData]=\"formulaKeys\" [(ngModelInput)]=\"selectedFormula\"\r\n [arrayKeyProperty]=\"'key'\" [arrayValueProperty]=\"'key'\" [showCancelButton]=\"true\" (ngModelInputChange)=\"onChangeFormula($event)\">\r\n </eqp-select> \r\n </div>\r\n </div>\r\n \r\n <div class=\"row\">\r\n <div class=\"col-3\">Etichetta</div>\r\n <div class=\"col-9\">\r\n <mat-form-field>\r\n <mat-label class=\"pt-1\"> Etichetta </mat-label>\r\n <input matInput [(ngModel)]=\"actionButton.ButtonLabel\" [readonly]=\"false\" [required]=\"true\" (keyup)=\"changeSomething()\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n \r\n <div class=\"row\">\r\n <div class=\"col-3\">Icona (<a href='https://www.angularjswiki.com/angular/angular-material-icons-list-mat-icon-list' target=\"_blank\">lista</a>)</div>\r\n <div class=\"col-9\">\r\n <mat-form-field>\r\n <mat-label class=\"pt-1\"> Icona Material (<a href='https://www.angularjswiki.com/angular/angular-material-icons-list-mat-icon-list' target=\"_blank\">lista</a>) </mat-label>\r\n <input matInput [(ngModel)]=\"actionButton.Icon\" [readonly]=\"false\" [required]=\"true\" (keyup)=\"changeSomething()\">\r\n </mat-form-field>\r\n </div>\r\n </div> \r\n \r\n <div class=\"row\" *ngIf=\"!InField\">\r\n <div class=\"col-3\">Sezioni</div>\r\n <div class=\"col-9\">\r\n <mat-label class=\"pt-1\"> Sezioni </mat-label>\r\n <eqp-select\r\n [enumData]=\"actionsFlag\"\r\n [isSearchable]=\"true\"\r\n [isMultiSelect] = \"true\"\r\n [(ngModelInput)]=\"actionButton.ShowIn\" \r\n (ngModelInputChange)=\"changeSomething()\" \r\n >\r\n </eqp-select>\r\n </div>\r\n </div> \r\n\r\n <div class=\"row\" *ngFor=\"let formulaField of formulaFieldsStructure\">\r\n <div class=\"col-3\">{{formulaField.key}}</div>\r\n <div class=\"col-9\" *ngIf=\"formulaField.type == triggerPropertyType.STRING\">\r\n <mat-form-field>\r\n <mat-label class=\"pt-1\"> {{formulaField.key}}</mat-label>\r\n <input matInput [readonly]=\"false\" [required]=\"false\" [matTooltip]=\"formulaField.tooltip\" (click)=\"openFormulaDialog(formulaField)\" [(ngModel)]=\"formulaField.value\" (ngModelChange)=\"onFormulaFieldChange(formulaField)\">\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-9\" *ngIf=\"formulaField.type == triggerPropertyType.DMMODULE\">\r\n <eqp-select [placeholder]=\"'Seleziona modulo'\" [arrayData]=\"forms\" [(ngModelInput)]=\"formulaField.object\" [isSearchable]=\"true\"\r\n [arrayKeyProperty]=\"'ID'\" [arrayValueProperty]=\"'Name'\" [ngModelOptions]=\"{ standalone: true }\" (ngModelInputChange)=\"onEqpSelectModule($event, formulaField)\">\r\n </eqp-select>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </mat-card-content>\r\n <mat-card-footer *ngIf=\"!InField\">\r\n <div class=\"d-flex justify-content-end mt-2 mb-1 me-3\"> \r\n <button class=\"mr-2\" mat-raised-button type=\"button\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"isSaving\">\r\n <span *ngIf=\"!isSaving\">Salva</span>\r\n <span *ngIf=\"isSaving\">Salvataggio in Corso...</span>\r\n </button>\r\n </div>\r\n </mat-card-footer>\r\n\r\n</mat-card>\r\n\r\n<!--DIALOG PER SEMPLIFICARE LA SCRITTURA DEL CAMPO FORMULA-->\r\n<ng-template #dialogFormula>\r\n <eqp-dynamic-module-add-formula-component>\r\n </eqp-dynamic-module-add-formula-component>\r\n</ng-template>" }]
178
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.UtilityHelperService }]; }, propDecorators: { form: [{
179
+ type: Input,
180
+ args: ["form"]
181
+ }], actionButton: [{
182
+ type: Input,
183
+ args: ["actionButton"]
184
+ }], actionButtonField: [{
185
+ type: Input,
186
+ args: ["actionButtonField"]
187
+ }], formulas: [{
188
+ type: Input,
189
+ args: ["formulas"]
190
+ }], endPointConfiguration: [{
191
+ type: Input,
192
+ args: ["endPointConfiguration"]
193
+ }], InField: [{
194
+ type: Input,
195
+ args: ["InField"]
196
+ }], onSaveRecord: [{
197
+ type: Output
198
+ }], onChangeSomething: [{
199
+ type: Output
200
+ }], dialogFormula: [{
201
+ type: ViewChild,
202
+ args: ["dialogFormula", { static: true }]
203
+ }] } });
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWJ1dHRvbi1jcmVhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9hY3Rpb24tYnV0dG9uLWNyZWF0b3IvYWN0aW9uLWJ1dHRvbi1jcmVhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9hY3Rpb24tYnV0dG9uLWNyZWF0b3IvYWN0aW9uLWJ1dHRvbi1jcmVhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9GLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdEcsT0FBTyxFQUE2QyxhQUFhLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN2SCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBU2pFLE1BQU0sT0FBTyw0QkFBNEI7SUF5QnJDLFlBQW9CLE1BQWlCLEVBQVUsb0JBQTBDO1FBQXJFLFdBQU0sR0FBTixNQUFNLENBQVc7UUFBVSx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBdEJwRSxpQkFBWSxHQUFpQixJQUFJLENBQUM7UUFDN0Isc0JBQWlCLEdBQXNCLElBQUksQ0FBQztRQUNyRCxhQUFRLEdBQVEsSUFBSSxDQUFDO1FBRXRCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFakMsaUJBQVks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Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQVd5QyxhQUFhO3NCQUExRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3Rpb25CdXR0b24sIEFjdGlvbkZsYWdFbnVtLCBUcmlnZ2VyUHJvcGVydHlUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90cmlnZ2VyLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uLCBFbmRQb2ludERhdGFQYXJhbXMsIFBhcmFtVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRmllbGRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcblxyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2xvYmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBBY3Rpb25CdXR0b25GaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYWN0aW9uQnV0dG9uLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWN0aW9uLWJ1dHRvbi1jcmVhdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWN0aW9uLWJ1dHRvbi1jcmVhdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hY3Rpb24tYnV0dG9uLWNyZWF0b3IuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWN0aW9uQnV0dG9uQ3JlYXRvckNvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dChcImZvcm1cIikgZm9ybTogRm9ybTtcclxuICBASW5wdXQoXCJhY3Rpb25CdXR0b25cIikgYWN0aW9uQnV0dG9uOiBBY3Rpb25CdXR0b24gPSBudWxsO1xyXG4gIEBJbnB1dChcImFjdGlvbkJ1dHRvbkZpZWxkXCIpIGFjdGlvbkJ1dHRvbkZpZWxkOiBBY3Rpb25CdXR0b25GaWVsZCA9IG51bGw7XHJcbiAgQElucHV0KFwiZm9ybXVsYXNcIikgZm9ybXVsYXM6IGFueSA9IG51bGw7XHJcbiAgQElucHV0KFwiZW5kUG9pbnRDb25maWd1cmF0aW9uXCIpIGVuZFBvaW50Q29uZmlndXJhdGlvbjogRW5kUG9pbnRDb25maWd1cmF0aW9uO1xyXG4gIEBJbnB1dChcIkluRmllbGRcIikgSW5GaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgb25TYXZlUmVjb3JkOiBFdmVudEVtaXR0ZXI8QWN0aW9uQnV0dG9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uQnV0dG9uPigpO1xyXG4gIEBPdXRwdXQoKSBvbkNoYW5nZVNvbWV0aGluZzogRXZlbnRFbWl0dGVyPEFjdGlvbkJ1dHRvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFjdGlvbkJ1dHRvbj4oKTtcclxuXHJcbiAgICBGaWVsZFR5cGVFbnVtID0gRmllbGRUeXBlRW51bTtcclxuICAgIGlzU2F2aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZEZvcm11bGE6IGFueTtcclxuICAgIGZvcm11bGFLZXlzOiBBcnJheTxhbnk+ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgIGZvcm11bGFGaWVsZHNTdHJ1Y3R1cmU6IEFycmF5PGFueT4gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgYWN0aW9uc0ZsYWcgPSBBY3Rpb25GbGFnRW51bTtcclxuICAgIHRyaWdnZXJQcm9wZXJ0eVR5cGUgPSBUcmlnZ2VyUHJvcGVydHlUeXBlRW51bTtcclxuICBcclxuICAgIGRpYWxvZ0Zvcm11bGFSZWY6IE1hdERpYWxvZ1JlZjxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBWaWV3Q2hpbGQoXCJkaWFsb2dGb3JtdWxhXCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ0Zvcm11bGE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgXHJcbiAgICBmb3JtczogQXJyYXk8Rm9ybT47XHJcbiAgXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIHV0aWxpdHlIZWxwZXJTZXJ2aWNlOiBVdGlsaXR5SGVscGVyU2VydmljZSl7fVxyXG4gICAgXHJcbiAgICBuZ09uSW5pdCgpe1xyXG5cclxuICAgICAgLy8vXHJcbiAgICAgIC8vLyBRdWVzdG8gY29tcG9uZW50ZSBmdW56aW9uYSBzaWEgcGVyIGkgYm90dG9uaSBkZWkgZmllbGRzIHNpYSBwZXIgaSBib3R0b25pIHN1Z2xpIGhlYWRlciAoYWRkcmVjb3JkLCBsaXN0dmlldyBlY2NldGVyYSlcclxuICAgICAgLy8vIFNlIHNpIHN0YSBsYXZvcmFuZG8gc3VpIGZpZWxkcyDDqCBwb3BvbGF0byAndGhpcy5hY3Rpb25CdXR0b25GaWVsZCcgYWx0cmltZW50aSDDqCBudWxsLlxyXG4gICAgICAvLy9cclxuXHJcbiAgICAgIGlmICh0aGlzLmFjdGlvbkJ1dHRvbkZpZWxkICE9IG51bGwpe1xyXG4gICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gPEFjdGlvbkJ1dHRvbj50aGlzLmFjdGlvbkJ1dHRvbkZpZWxkO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b24gIT0gbnVsbCAmJiB0aGlzLmFjdGlvbkJ1dHRvbi5leGVjdXRpb24gIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtdWxhID0ge307XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZvcm11bGEua2V5ID0gdGhpcy5hY3Rpb25CdXR0b24uZXhlY3V0aW9uO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b25GaWVsZCA9PSBudWxsKXtcclxuICAgICAgICAgIHRoaXMuZm9ybXVsYUZpZWxkc1N0cnVjdHVyZSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm11bGFzW3RoaXMuc2VsZWN0ZWRGb3JtdWxhLmtleV0pLmZvckVhY2goKHJlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUucHVzaCh7XCJrZXlcIjogcmVzLCBcInR5cGVcIjogdGhpcy5mb3JtdWxhc1t0aGlzLnNlbGVjdGVkRm9ybXVsYS5rZXldW3Jlc10udHlwZSwgXCJ0b29sdGlwXCI6IHRoaXMuZm9ybXVsYXNbdGhpcy5zZWxlY3RlZEZvcm11bGEua2V5XVtyZXNdLnRvb2x0aXB9KTtcclxuICAgICAgICAgIH0pOyAgIFxyXG5cclxuICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzVGVtcCkuZm9yRWFjaCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybXVsYUZpZWxkc1N0cnVjdHVyZS5maW5kKHggPT4geC5rZXkgPT0gcmVzKS52YWx1ZSA9IHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzVGVtcFtyZXNdLnZhbHVlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZm9ybXVsYUZpZWxkc1N0cnVjdHVyZS5wdXNoKHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b24gPT0gbnVsbCl7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBleGVjdXRlR2V0TW9kdWxlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm11bGFzKS5mb3JFYWNoKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm11bGFLZXlzLnB1c2goe1wia2V5XCI6IHJlc30pO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybXVsYXNbcmVzXSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm11bGFzW3Jlc11bcHJvcGVydHldLnR5cGUgPT0gVHJpZ2dlclByb3BlcnR5VHlwZUVudW0uRE1NT0RVTEUpe1xyXG4gICAgICAgICAgICBleGVjdXRlR2V0TW9kdWxlcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGV4ZWN1dGVHZXRNb2R1bGVzKXtcclxuICAgICAgICB0aGlzLmdldEFsbE1vZHVsZXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvcGVuRm9ybXVsYURpYWxvZyhmb3JtdWxhRmllbGQ6IGFueSkge1xyXG4gICAgICB0aGlzLmRpYWxvZ0Zvcm11bGFSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nRm9ybXVsYSwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICB3aWR0aDogXCI3NSVcIixcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBmb3JtdWxhOiB0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUuZmluZCh4ID0+IHgua2V5ID09IGZvcm11bGFGaWVsZC5rZXkpLnZhbHVlLFxyXG4gICAgICAgICAgZmllbGRzOiB0aGlzLmZvcm0uRmllbGRzXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZGlhbG9nRm9ybXVsYVJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdmFyIGZvcm11bGFUb0NoYW5nZSA9IHRoaXMuZm9ybXVsYUZpZWxkc1N0cnVjdHVyZS5maW5kKHggPT4geC5rZXkgPT0gZm9ybXVsYUZpZWxkLmtleSk7XHJcbiAgICAgICAgZm9ybXVsYVRvQ2hhbmdlLnZhbHVlID0gcmVzdWx0LmZvcm11bGEudG9TdHJpbmcoKSA9PSBcIlwiID8gbnVsbCA6IHJlc3VsdC5mb3JtdWxhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5vbkZvcm11bGFGaWVsZENoYW5nZShmb3JtdWxhVG9DaGFuZ2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZvcm11bGFGaWVsZENoYW5nZShmb3JtdWxhRmllbGQ6IGFueSl7XHJcbiAgICAgICB0aGlzLmNoYW5nZVNvbWV0aGluZygpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBvbkVxcFNlbGVjdE1vZHVsZShldiwgZm9ybXVsYUZpZWxkKXtcclxuICAgICAgZm9ybXVsYUZpZWxkLnZhbHVlID0gZXYuSUQ7ICAgIFxyXG4gICAgICB0aGlzLmNoYW5nZVNvbWV0aGluZygpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgc2F2ZU9yRXhpdEZvcm0oZXhpdDogYm9vbGVhbikge1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnYWRkLWZvcm0tcmVjb3JkIHNhdmVSZWNvcmRFdmVudCcpXHJcbiAgICBpZiAoZXhpdCkge1xyXG4gICAgICB0aGlzLm9uU2F2ZVJlY29yZC5lbWl0KG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLkJ1dHRvbkNvZGUgPSB0aGlzLnNlbGVjdGVkRm9ybXVsYS5rZXk7XHJcblxyXG4gICAgICB0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUuZm9yRWFjaCgoZm9ybXVsYUZpZWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFjdGlvbkJ1dHRvbi5mb3JtdWxhcyA9PSBcInVuZGVmaW5lZFwiKXsgdGhpcy5hY3Rpb25CdXR0b24uZm9ybXVsYXMgPSB7fTsgfVxyXG4gICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzVGVtcFtmb3JtdWxhRmllbGQua2V5XSA9IGZvcm11bGFGaWVsZDtcclxuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbi5leGVjdXRpb24gPSB0aGlzLnNlbGVjdGVkRm9ybXVsYS5rZXk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMub25TYXZlUmVjb3JkLmVtaXQodGhpcy5hY3Rpb25CdXR0b24pO1xyXG4gICAgfVxyXG4gIH0gICAgXHJcblxyXG4gIGNoYW5nZVNvbWV0aGluZygpe1xyXG4gICAgdGhpcy5hY3Rpb25CdXR0b24uQnV0dG9uQ29kZSA9IHRoaXMuc2VsZWN0ZWRGb3JtdWxhLmtleTtcclxuXHJcbiAgICBpZiAoIXRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzVGVtcCl7IHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzVGVtcCA9IHt9OyB9XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJDSEFOR0UgU09NRVRISU5HXCIsIHRoaXMuYWN0aW9uQnV0dG9uLCB0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUpO1xyXG4gICAgdGhpcy5mb3JtdWxhRmllbGRzU3RydWN0dXJlLmZvckVhY2goKGZvcm11bGFGaWVsZCkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzID09IFwidW5kZWZpbmVkXCIpeyB0aGlzLmFjdGlvbkJ1dHRvbi5mb3JtdWxhcyA9IHt9OyB9XHJcbiAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLmZvcm11bGFzVGVtcFtmb3JtdWxhRmllbGQua2V5XSA9IGZvcm11bGFGaWVsZDtcclxuICAgICAgdGhpcy5hY3Rpb25CdXR0b24uZXhlY3V0aW9uID0gdGhpcy5zZWxlY3RlZEZvcm11bGEua2V5O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZVNvbWV0aGluZy5lbWl0KHRoaXMuYWN0aW9uQnV0dG9uKTtcclxuICB9XHJcblxyXG4gIGdldEFsbE1vZHVsZXMoKXtcclxuXHJcbiAgICBjb25zdCBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID1cclxuICAgICAgbmV3IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4oKTtcclxuICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMucHVzaCh7XHJcbiAgICAgIFBhcmFtTmFtZTogXCJvcmdhaWRcIixcclxuICAgICAgUGFyYW1WYWx1ZTogdGhpcy5mb3JtLk9yZ2FJRCxcclxuICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3Jtcy5HZXRBbGxGb3JtRW5kUG9pbnQsXHJcbiAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgIChyZXM6IEFycmF5PEZvcm0+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtcyA9IHJlcztcclxuICAgICAgICB0aGlzLmZvcm1zID0gdGhpcy5mb3Jtcy5zb3J0KCh1bm8sIGR1ZSkgPT4gdW5vLk5hbWUubG9jYWxlQ29tcGFyZShkdWUuTmFtZSkpO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUuZm9yRWFjaCgocmVzKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnR5cGUgPT0gVHJpZ2dlclByb3BlcnR5VHlwZUVudW0uRE1NT0RVTEUpe1xyXG4gICAgICAgICAgICByZXMub2JqZWN0ID0gdGhpcy5mb3Jtcy5maW5kKHggPT4geC5JRCA9PSByZXMudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4geyB9XHJcbiAgICApOyAgICBcclxuICB9ICBcclxuXHJcbiAgb25DaGFuZ2VGb3JtdWxhKGZvcm11bGE6IGFueSl7XHJcblxyXG4gICAgXHJcbiAgICBpZiAoZm9ybXVsYSA9PSBudWxsKXsgIFxyXG4gICAgICB0aGlzLmNoYW5nZVNvbWV0aGluZygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQEB0cmlnZ2VyLWNyZWF0b3I6b25DaGFuZ2VGb3JtdWxhIHNlbGVjdGVkIGZvcm11bGEnLGZvcm11bGEpXHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdAQHRyaWdnZXItY3JlYXRvcjpvbkNoYW5nZUZvcm11bGEgZm9ybXVsYXMnLHRoaXMuZm9ybXVsYXMpXHJcblxyXG4gICAgdGhpcy5mb3JtdWxhRmllbGRzU3RydWN0dXJlID0gbmV3IEFycmF5PGFueT4oKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIm9uQ2hhbmdlRm9ybXVsYVwiLCB0aGlzLmZvcm11bGFzLCBmb3JtdWxhLmtleSk7XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS1cclxuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybXVsYXNbZm9ybXVsYS5rZXldKS5mb3JFYWNoKChyZXMpID0+IHtcclxuICAgICAgdGhpcy5mb3JtdWxhRmllbGRzU3RydWN0dXJlLnB1c2goe1wia2V5XCI6IHJlcywgXCJ0eXBlXCI6IHRoaXMuZm9ybXVsYXNbZm9ybXVsYS5rZXldW3Jlc10udHlwZSwgXHJcbiAgICAgICAgXCJ0b29sdGlwXCI6IHRoaXMuZm9ybXVsYXNbZm9ybXVsYS5rZXldW3Jlc10udG9vbHRpcH0pO1xyXG4gICAgfSk7ICBcclxuICAgIC8vLS0tLS0tLS0tLS0tXHJcbiAgICAvKiAqKiogb3JpZ2luYWxlICoqKlxyXG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtdWxhc1tmb3JtdWxhLmtleV0pLmZvckVhY2goKHJlcykgPT4ge1xyXG4gICAgICB0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUucHVzaCh7XCJrZXlcIjogcmVzLCBcInR5cGVcIjogdGhpcy5mb3JtdWxhc1tmb3JtdWxhLmtleV1bcmVzXS50eXBlXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICAqKiogKi9cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0BAdHJpZ2dlci1jcmVhdG9yOm9uQ2hhbmdlRm9ybXVsYSBmb3JtdWxhRmllbGRzU3RydWN0dXJlJyx0aGlzLmZvcm11bGFGaWVsZHNTdHJ1Y3R1cmUpXHJcblxyXG5cclxuICAgIHRoaXMuY2hhbmdlU29tZXRoaW5nKCk7XHJcbiAgfSAgXHJcblxyXG59XHJcbiIsIlxyXG48bWF0LWNhcmQgY2xhc3M9XCJhZGQtZm9ybS1maWVsZFwiPlxyXG4gICAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cIiFJbkZpZWxkXCI+XHJcbiAgICAgICAgPG1hdC1jYXJkLXRpdGxlPlxyXG4gICAgICAgICAgICB7e2FjdGlvbkJ1dHRvbiAhPSBudWxsID8gXCJNb2RpZmljYVwiIDogXCJBZ2dpdW5naVwifX0gYWN0aW9uQnV0dG9uXHJcbiAgICAgICAgPC9tYXQtY2FyZC10aXRsZT5cclxuICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxyXG5cclxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgY29udGFpbmVyQ29udGVudCBwYWRkZXJcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5UaXBvIEFjdGlvbiBCdXR0b248L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC05XCI+XHJcbiAgICAgICAgICAgICAgICA8ZXFwLXNlbGVjdCBbYXJyYXlEYXRhXT1cImZvcm11bGFLZXlzXCIgWyhuZ01vZGVsSW5wdXQpXT1cInNlbGVjdGVkRm9ybXVsYVwiXHJcbiAgICAgICAgICAgICAgICBbYXJyYXlLZXlQcm9wZXJ0eV09XCIna2V5J1wiIFthcnJheVZhbHVlUHJvcGVydHldPVwiJ2tleSdcIiBbc2hvd0NhbmNlbEJ1dHRvbl09XCJ0cnVlXCIgKG5nTW9kZWxJbnB1dENoYW5nZSk9XCJvbkNoYW5nZUZvcm11bGEoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9lcXAtc2VsZWN0PiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+RXRpY2hldHRhPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgIGNsYXNzPVwicHQtMVwiPiBFdGljaGV0dGEgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFsobmdNb2RlbCldPVwiYWN0aW9uQnV0dG9uLkJ1dHRvbkxhYmVsXCIgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3JlcXVpcmVkXT1cInRydWVcIiAoa2V5dXApPVwiY2hhbmdlU29tZXRoaW5nKClcIj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPkljb25hICg8YSBocmVmPSdodHRwczovL3d3dy5hbmd1bGFyanN3aWtpLmNvbS9hbmd1bGFyL2FuZ3VsYXItbWF0ZXJpYWwtaWNvbnMtbGlzdC1tYXQtaWNvbi1saXN0JyB0YXJnZXQ9XCJfYmxhbmtcIj5saXN0YTwvYT4pPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgIGNsYXNzPVwicHQtMVwiPiBJY29uYSBNYXRlcmlhbCAoPGEgaHJlZj0naHR0cHM6Ly93d3cuYW5ndWxhcmpzd2lraS5jb20vYW5ndWxhci9hbmd1bGFyLW1hdGVyaWFsLWljb25zLWxpc3QtbWF0LWljb24tbGlzdCcgdGFyZ2V0PVwiX2JsYW5rXCI+bGlzdGE8L2E+KSA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJhY3Rpb25CdXR0b24uSWNvblwiIFtyZWFkb25seV09XCJmYWxzZVwiIFtyZXF1aXJlZF09XCJ0cnVlXCIgKGtleXVwKT1cImNoYW5nZVNvbWV0aGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PiAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCIhSW5GaWVsZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5TZXppb25pPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCAgY2xhc3M9XCJwdC0xXCI+IFNlemlvbmkgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZXFwLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICBbZW51bURhdGFdPVwiYWN0aW9uc0ZsYWdcIlxyXG4gICAgICAgICAgICAgICAgICBbaXNTZWFyY2hhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbaXNNdWx0aVNlbGVjdF0gPSBcInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWxJbnB1dCldPVwiYWN0aW9uQnV0dG9uLlNob3dJblwiICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxJbnB1dENoYW5nZSk9XCJjaGFuZ2VTb21ldGhpbmcoKVwiICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9lcXAtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PiAgIFxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IGZvcm11bGFGaWVsZCBvZiBmb3JtdWxhRmllbGRzU3RydWN0dXJlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPnt7Zm9ybXVsYUZpZWxkLmtleX19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiICpuZ0lmPVwiZm9ybXVsYUZpZWxkLnR5cGUgPT0gdHJpZ2dlclByb3BlcnR5VHlwZS5TVFJJTkdcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsICBjbGFzcz1cInB0LTFcIj4ge3tmb3JtdWxhRmllbGQua2V5fX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3JlcXVpcmVkXT1cImZhbHNlXCIgW21hdFRvb2x0aXBdPVwiZm9ybXVsYUZpZWxkLnRvb2x0aXBcIiAoY2xpY2spPVwib3BlbkZvcm11bGFEaWFsb2coZm9ybXVsYUZpZWxkKVwiIFsobmdNb2RlbCldPVwiZm9ybXVsYUZpZWxkLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtdWxhRmllbGRDaGFuZ2UoZm9ybXVsYUZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiICpuZ0lmPVwiZm9ybXVsYUZpZWxkLnR5cGUgPT0gdHJpZ2dlclByb3BlcnR5VHlwZS5ETU1PRFVMRVwiPlxyXG4gICAgICAgICAgICAgICAgPGVxcC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidTZWxlemlvbmEgbW9kdWxvJ1wiIFthcnJheURhdGFdPVwiZm9ybXNcIiBbKG5nTW9kZWxJbnB1dCldPVwiZm9ybXVsYUZpZWxkLm9iamVjdFwiIFtpc1NlYXJjaGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbYXJyYXlLZXlQcm9wZXJ0eV09XCInSUQnXCIgW2FycmF5VmFsdWVQcm9wZXJ0eV09XCInTmFtZSdcIiBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIiAobmdNb2RlbElucHV0Q2hhbmdlKT1cIm9uRXFwU2VsZWN0TW9kdWxlKCRldmVudCwgZm9ybXVsYUZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9lcXAtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICA8bWF0LWNhcmQtZm9vdGVyICpuZ0lmPVwiIUluRmllbGRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtMiBtYi0xIG1lLTNcIj4gXHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtci0yXCIgbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybSh0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgQW5udWxsYVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybShmYWxzZSlcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzU2F2aW5nXCI+U2FsdmE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU2F2aW5nXCI+U2FsdmF0YWdnaW8gaW4gQ29yc28uLi48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtY2FyZC1mb290ZXI+XHJcblxyXG48L21hdC1jYXJkPlxyXG5cclxuPCEtLURJQUxPRyBQRVIgU0VNUExJRklDQVJFIExBIFNDUklUVFVSQSBERUwgQ0FNUE8gRk9STVVMQS0tPlxyXG48bmctdGVtcGxhdGUgI2RpYWxvZ0Zvcm11bGE+XHJcbiAgICA8ZXFwLWR5bmFtaWMtbW9kdWxlLWFkZC1mb3JtdWxhLWNvbXBvbmVudD5cclxuICAgIDwvZXFwLWR5bmFtaWMtbW9kdWxlLWFkZC1mb3JtdWxhLWNvbXBvbmVudD5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=