@esfaenza/forms-and-validations 15.2.59 → 15.2.60

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 (80) hide show
  1. package/{esm2022 → esm2020}/lib/forms/base-form-control.mjs +4 -4
  2. package/{esm2022 → esm2020}/lib/forms/form-adaptive/form-adaptive.component.loc.mjs +4 -4
  3. package/{esm2022 → esm2020}/lib/forms/form-adaptive/form-adaptive.component.mjs +4 -4
  4. package/{esm2022 → esm2020}/lib/forms/form-autocomplete/form-autocomplete.component.loc.mjs +4 -4
  5. package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.mjs +286 -0
  6. package/{esm2022 → esm2020}/lib/forms/form-checkbox/form-checkbox.component.mjs +4 -4
  7. package/{esm2022 → esm2020}/lib/forms/form-date/form-date.component.mjs +4 -4
  8. package/{esm2022 → esm2020}/lib/forms/form-datetime/form-datetime.component.mjs +4 -4
  9. package/{esm2022 → esm2020}/lib/forms/form-empty/form-empty.component.mjs +4 -4
  10. package/{esm2022 → esm2020}/lib/forms/form-error/form-error.component.mjs +4 -4
  11. package/{esm2022 → esm2020}/lib/forms/form-file/form-file.component.loc.mjs +4 -4
  12. package/{esm2022 → esm2020}/lib/forms/form-file/form-file.component.mjs +4 -4
  13. package/{esm2022 → esm2020}/lib/forms/form-info/form-info.component.mjs +4 -4
  14. package/{esm2022 → esm2020}/lib/forms/form-input/form-input.component.mjs +4 -4
  15. package/{esm2022 → esm2020}/lib/forms/form-multiselect/form-multiselect.component.loc.mjs +4 -4
  16. package/{esm2022 → esm2020}/lib/forms/form-multiselect/form-multiselect.component.mjs +4 -4
  17. package/{esm2022 → esm2020}/lib/forms/form-select/form-select.component.loc.mjs +4 -4
  18. package/{esm2022 → esm2020}/lib/forms/form-select/form-select.component.mjs +4 -4
  19. package/{esm2022 → esm2020}/lib/forms/form-template/form-template.component.mjs +4 -4
  20. package/{esm2022 → esm2020}/lib/forms/form-textarea/form-textarea.component.mjs +4 -4
  21. package/{esm2022 → esm2020}/lib/forms/form-time/form-time.component.mjs +4 -4
  22. package/{esm2022 → esm2020}/lib/forms-and-validations.module.mjs +64 -64
  23. package/{esm2022 → esm2020}/lib/models/dayjs-adapter/dayjs-date-adapter.mjs +4 -4
  24. package/{esm2022 → esm2020}/lib/validations/base-validation.loc.mjs +4 -4
  25. package/{esm2022 → esm2020}/lib/validations/base-validation.mjs +4 -4
  26. package/{esm2022 → esm2020}/lib/validations/customValidators/CustomRequiredDirective.mjs +4 -4
  27. package/esm2020/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +147 -0
  28. package/esm2020/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.mjs +240 -0
  29. package/esm2020/lib/validations/validation-currency/validation-currency.component.mjs +75 -0
  30. package/esm2020/lib/validations/validation-date/validation-date.component.mjs +183 -0
  31. package/esm2020/lib/validations/validation-datetime/validation-datetime.component.mjs +212 -0
  32. package/esm2020/lib/validations/validation-input/validation-input.component.mjs +222 -0
  33. package/esm2020/lib/validations/validation-select/validation-select.component.mjs +183 -0
  34. package/esm2020/lib/validations/validation-text-area/validation-text-area.component.mjs +78 -0
  35. package/fesm2015/esfaenza-forms-and-validations.mjs +4319 -0
  36. package/{fesm2022 → fesm2015}/esfaenza-forms-and-validations.mjs.map +1 -1
  37. package/{fesm2022 → fesm2020}/esfaenza-forms-and-validations.mjs +219 -222
  38. package/fesm2020/esfaenza-forms-and-validations.mjs.map +1 -0
  39. package/lib/forms/base-form-control.d.ts +1 -1
  40. package/lib/forms/form-adaptive/form-adaptive.component.d.ts +1 -1
  41. package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +1 -1
  42. package/lib/forms/form-checkbox/form-checkbox.component.d.ts +1 -1
  43. package/lib/forms/form-date/form-date.component.d.ts +1 -1
  44. package/lib/forms/form-datetime/form-datetime.component.d.ts +1 -1
  45. package/lib/forms/form-empty/form-empty.component.d.ts +1 -1
  46. package/lib/forms/form-error/form-error.component.d.ts +1 -1
  47. package/lib/forms/form-file/form-file.component.d.ts +1 -1
  48. package/lib/forms/form-info/form-info.component.d.ts +1 -1
  49. package/lib/forms/form-input/form-input.component.d.ts +1 -1
  50. package/lib/forms/form-multiselect/form-multiselect.component.d.ts +1 -1
  51. package/lib/forms/form-select/form-select.component.d.ts +1 -1
  52. package/lib/forms/form-template/form-template.component.d.ts +1 -1
  53. package/lib/forms/form-textarea/form-textarea.component.d.ts +1 -1
  54. package/lib/forms/form-time/form-time.component.d.ts +1 -1
  55. package/lib/validations/base-validation.d.ts +1 -1
  56. package/lib/validations/customValidators/CustomRequiredDirective.d.ts +1 -1
  57. package/lib/validations/validation-autocomplete/validation-autocomplete.component.d.ts +1 -1
  58. package/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.d.ts +1 -1
  59. package/lib/validations/validation-currency/validation-currency.component.d.ts +1 -1
  60. package/lib/validations/validation-date/validation-date.component.d.ts +1 -1
  61. package/lib/validations/validation-datetime/validation-datetime.component.d.ts +1 -1
  62. package/lib/validations/validation-input/validation-input.component.d.ts +1 -1
  63. package/lib/validations/validation-select/validation-select.component.d.ts +1 -1
  64. package/lib/validations/validation-text-area/validation-text-area.component.d.ts +1 -1
  65. package/package.json +12 -5
  66. package/esm2022/lib/forms/form-autocomplete/form-autocomplete.component.mjs +0 -289
  67. package/esm2022/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +0 -147
  68. package/esm2022/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.mjs +0 -240
  69. package/esm2022/lib/validations/validation-currency/validation-currency.component.mjs +0 -75
  70. package/esm2022/lib/validations/validation-date/validation-date.component.mjs +0 -183
  71. package/esm2022/lib/validations/validation-datetime/validation-datetime.component.mjs +0 -212
  72. package/esm2022/lib/validations/validation-input/validation-input.component.mjs +0 -222
  73. package/esm2022/lib/validations/validation-select/validation-select.component.mjs +0 -183
  74. package/esm2022/lib/validations/validation-text-area/validation-text-area.component.mjs +0 -78
  75. /package/{esm2022 → esm2020}/esfaenza-forms-and-validations.mjs +0 -0
  76. /package/{esm2022 → esm2020}/lib/models/AppFile.mjs +0 -0
  77. /package/{esm2022 → esm2020}/lib/models/ChangeEvent.mjs +0 -0
  78. /package/{esm2022 → esm2020}/lib/models/FormsAndValidationsModuleConfig.mjs +0 -0
  79. /package/{esm2022 → esm2020}/lib/tokens.mjs +0 -0
  80. /package/{esm2022 → esm2020}/public-api.mjs +0 -0
@@ -0,0 +1,222 @@
1
+ // Angular
2
+ import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
3
+ import { ChangeDetectionStrategy, Component, ContentChild, forwardRef, Inject, Input, Optional, ViewEncapsulation } from "@angular/core";
4
+ // Configurazioni
5
+ import { LocalizationService } from "@esfaenza/localizations";
6
+ // Direttive, Componenti, Librerie
7
+ import { BaseValidation } from "../base-validation";
8
+ import { BaseValidationLoc } from '../base-validation.loc';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@esfaenza/localizations";
11
+ import * as i2 from "@angular/common";
12
+ import * as i3 from "@angular/forms";
13
+ import * as i4 from "@angular/material/legacy-form-field";
14
+ import * as i5 from "@angular/material/legacy-input";
15
+ import * as i6 from "@angular/material/datepicker";
16
+ import * as i7 from "ngx-bootstrap/tooltip";
17
+ /**
18
+ * Componente di validaizone per gli input a semplice casella di testo
19
+ */
20
+ export class ValidationInputComponent extends BaseValidation {
21
+ /**
22
+ * @ignore
23
+ */
24
+ constructor(cdr, _validators, _asyncValidators, injector, lc) {
25
+ super(cdr);
26
+ this._validators = _validators;
27
+ this._asyncValidators = _asyncValidators;
28
+ this.injector = injector;
29
+ this.lc = lc;
30
+ /**
31
+ * Permette di scrivere o meno nel campo di Input. Si differenzia dal Readonly in quanto fisicamente l'Input è scrivibile e vengono mantenuti i temi della validazione
32
+ * ma interagire direttamente con la casella di Input per l'utente non è possibile
33
+ */
34
+ this.Frozen = false;
35
+ /**
36
+ * Indica se questo Comopnente deve rappresentare un oggetto di Input di tipo "Password"
37
+ */
38
+ this.Password = false;
39
+ /**
40
+ * Indica se deve mostrare un indicazione di warning nel suffisso
41
+ */
42
+ this.showWarning = false;
43
+ /**
44
+ * Classe del warning eventualmente modificabile.
45
+ *
46
+ * Default: "fa fa-warning"
47
+ */
48
+ this.warningClass = "fa fa-warning";
49
+ /**
50
+ * Identifica se il testo di un componente di tipo "password" dev'essere visualizzato o meno
51
+ */
52
+ this.passShown = false;
53
+ /**
54
+ * Tipo del componente, può essere "text" o "password" e viene impostato automaticamente dall'Input **Password**
55
+ */
56
+ this.Type = "text";
57
+ /**
58
+ * Indicazione se il componente ha o meno un suffisso.
59
+ *
60
+ * Valorizzato a **true** solo se viene trovata una proiezione su **suffix_internal** o se l'Input **showWarning** viene impostato a **true**
61
+ */
62
+ this.HasSuffix = false;
63
+ /**
64
+ * Indicazione se il componente ha o meno un prefisso.
65
+ *
66
+ * Valorizzato a **true** solo se viene trovata una proiezione su **prefix_internal**
67
+ */
68
+ this.HasPrefix = false;
69
+ /**
70
+ * @ignore
71
+ */
72
+ this.onTouched = () => { };
73
+ }
74
+ /**
75
+ * @ignore
76
+ */
77
+ ngOnInit() {
78
+ super.ngOnInit();
79
+ this.registerFocusRequest();
80
+ this.checkRequiredness(this._validators);
81
+ if (this.Password)
82
+ this.Type = "password";
83
+ }
84
+ /**
85
+ * @ignore
86
+ */
87
+ ngOnDestroy() {
88
+ super.ngOnDestroy();
89
+ this.deregisterFocusRequest();
90
+ if (this.tooltipSubscription)
91
+ this.tooltipSubscription.unsubscribe();
92
+ }
93
+ /**
94
+ * @ignore
95
+ */
96
+ ngAfterViewInit() {
97
+ this.HasSuffix = !!this.suffix_internal || this.showWarning;
98
+ this.HasPrefix = !!this.prefix_internal;
99
+ this.postBinding();
100
+ }
101
+ /**
102
+ * @ignore
103
+ */
104
+ ngOnChanges(changes) {
105
+ const newShowWarnings = changes["showWarning"];
106
+ if (newShowWarnings)
107
+ this.HasSuffix = !!this.suffix_internal || this.showWarning;
108
+ }
109
+ /**
110
+ * Metodo che si occupa di collegare i validatori e la funzione di reset dal **ControlValueAccessor** rappresentato
111
+ * da questo componente al **ControlValueAccessor** rappresentato dall'effettivo elemento di Input presente lato HTML
112
+ */
113
+ postBinding() {
114
+ this.CheckValidity();
115
+ const ngControl = this.injector.get(NgControl, null);
116
+ if (ngControl) {
117
+ this.parentControl = ngControl.control;
118
+ // Se la variabile novalidate è true, elimino tutti i validatori eventualmente inseriti
119
+ if (this.noValidate) {
120
+ this.parentControl.clearValidators();
121
+ this.parentControl.clearAsyncValidators();
122
+ }
123
+ else {
124
+ this.baseInput.control.setAsyncValidators(this._asyncValidators);
125
+ this.baseInput.control.setValidators(this._validators);
126
+ }
127
+ // Faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
128
+ const origFunc = this.parentControl.reset;
129
+ this.parentControl.reset = () => {
130
+ origFunc.apply(this.parentControl);
131
+ this.baseInput.control.reset();
132
+ this.tooltip.hide();
133
+ };
134
+ }
135
+ }
136
+ /**
137
+ * @ignore
138
+ */
139
+ writeValue(value) {
140
+ this.value = value;
141
+ this.propagateChange(value);
142
+ this.cdr.markForCheck();
143
+ }
144
+ /**
145
+ * L'emit della modifica al valore viene gestito su un evento custom (**inputChange**) come workaround al malfunzionamento dell'**ngModelChange** nativo
146
+ *
147
+ * @param {any} toEmit valore da propagare all'esterno
148
+ */
149
+ onModelChange(toEmit) {
150
+ this.writeValue(toEmit);
151
+ this.inputChange.emit(toEmit);
152
+ this.onTouched();
153
+ }
154
+ /**
155
+ * @ignore
156
+ */
157
+ registerOnChange(fn) {
158
+ this.propagateChange = fn;
159
+ }
160
+ /**
161
+ * @ignore
162
+ */
163
+ registerOnTouched(fn) {
164
+ this.onTouched = fn;
165
+ }
166
+ }
167
+ ValidationInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationInputComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: i0.Injector }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
168
+ ValidationInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ValidationInputComponent, selector: "val-input", inputs: { Frozen: "Frozen", Password: "Password", showWarning: "showWarning", warningTitle: "warningTitle", warningClass: "warningClass", value: "value", Type: "Type", maxlength: "maxlength", minlength: "minlength" }, providers: [
169
+ { provide: LocalizationService, useClass: BaseValidationLoc },
170
+ {
171
+ provide: NG_VALUE_ACCESSOR,
172
+ useExisting: forwardRef(() => ValidationInputComponent),
173
+ multi: true
174
+ }
175
+ ], queries: [{ propertyName: "suffix_internal", first: true, predicate: ["suffix_internal"], descendants: true }, { propertyName: "prefix_internal", first: true, predicate: ["prefix_internal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<mat-form-field floatLabel=\"never\" appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label [class.app-margin-left-25]=\"HasPrefix\" *ngIf=\"placeholder && FloatingLabel\">{{placeholder}}</mat-label>\r\n <ng-container *ngIf=\"HasPrefix\">\r\n <ng-container *ngTemplateOutlet=\"prefix_internal\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Bisogna fixare un po' l'uso di readonly, disabled, frozen cazzi e mazzi -->\r\n <input matInput\r\n #baseInput='ngModel'\r\n #htmlInput\r\n type=\"{{Type}}\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n autocomplete=\"{{autocomplete}}\"\r\n name=\"{{id}}\"\r\n class=\"form-control {{class}}\"\r\n id=\"{{id}}\"\r\n [attr.maxlength]=\"maxlength || undefined\"\r\n [attr.minlength]=\"minlength || undefined\"\r\n [class.app-margin-left-25]=\"HasPrefix\"\r\n [class.mat-input-with-suffix]=\"HasSuffix || Password || showWarning\"\r\n [(ngModel)]=\"value\"\r\n [class.checking-field]=\"!noValidate && !showWarning\"\r\n [tooltip]=\"tolTemplate\"\r\n [readonly]=\"Frozen\"\r\n [disabled]=\"Readonly || disabled || Frozen\"\r\n [placeholder]=\"FloatingLabel ? undefined : placeholder\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (keyup)=\"($event.keyCode == 13 || $event.keyCode == 27) && onFinalize();\"\r\n (blur)=\"closeTooltip(); onFinalize();\"\r\n >\r\n <ng-container *ngIf=\"HasSuffix || Password || showWarning\">\r\n <ng-container *ngIf=\"!Password && !showWarning\">\r\n <ng-container *ngTemplateOutlet=\"suffix_internal\"></ng-container>\r\n </ng-container>\r\n\r\n <span class=\"form-input-suffix\" *ngIf=\"Password || showWarning\">\r\n <ng-container *ngIf=\"Password\" matSuffix>\r\n <a *ngIf=\"passShown\" class=\"fa fa-eye-slash app-fs-16 app-pointer\" (click)=\"Type = 'password'; passShown = !passShown; $event.preventDefault()\"></a>\r\n <a *ngIf=\"!passShown\" class=\"fa fa-eye app-fs-16 app-pointer\" (click)=\"Type = 'text'; passShown = !passShown; $event.preventDefault()\"></a>\r\n </ng-container>\r\n <ng-container *ngIf=\"showWarning\" matSuffix>\r\n <span title=\"{{warningTitle}}\" class=\"{{warningClass}} text-warning app-fs-16\"></span>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n</mat-form-field>\r\n\r\n<!-- Questo compoennte nascosto serve solamente per assicurarsi che angular carichi gli stili dei mat-button che altrimenti non caricherebbe... dunno why -->\r\n<div hidden><mat-datepicker-toggle></mat-datepicker-toggle></div>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationInputComponent, decorators: [{
177
+ type: Component,
178
+ args: [{ selector: "val-input", changeDetection: ChangeDetectionStrategy.OnPush, providers: [
179
+ { provide: LocalizationService, useClass: BaseValidationLoc },
180
+ {
181
+ provide: NG_VALUE_ACCESSOR,
182
+ useExisting: forwardRef(() => ValidationInputComponent),
183
+ multi: true
184
+ }
185
+ ], encapsulation: ViewEncapsulation.None, template: "<mat-form-field floatLabel=\"never\" appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label [class.app-margin-left-25]=\"HasPrefix\" *ngIf=\"placeholder && FloatingLabel\">{{placeholder}}</mat-label>\r\n <ng-container *ngIf=\"HasPrefix\">\r\n <ng-container *ngTemplateOutlet=\"prefix_internal\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Bisogna fixare un po' l'uso di readonly, disabled, frozen cazzi e mazzi -->\r\n <input matInput\r\n #baseInput='ngModel'\r\n #htmlInput\r\n type=\"{{Type}}\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n autocomplete=\"{{autocomplete}}\"\r\n name=\"{{id}}\"\r\n class=\"form-control {{class}}\"\r\n id=\"{{id}}\"\r\n [attr.maxlength]=\"maxlength || undefined\"\r\n [attr.minlength]=\"minlength || undefined\"\r\n [class.app-margin-left-25]=\"HasPrefix\"\r\n [class.mat-input-with-suffix]=\"HasSuffix || Password || showWarning\"\r\n [(ngModel)]=\"value\"\r\n [class.checking-field]=\"!noValidate && !showWarning\"\r\n [tooltip]=\"tolTemplate\"\r\n [readonly]=\"Frozen\"\r\n [disabled]=\"Readonly || disabled || Frozen\"\r\n [placeholder]=\"FloatingLabel ? undefined : placeholder\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (keyup)=\"($event.keyCode == 13 || $event.keyCode == 27) && onFinalize();\"\r\n (blur)=\"closeTooltip(); onFinalize();\"\r\n >\r\n <ng-container *ngIf=\"HasSuffix || Password || showWarning\">\r\n <ng-container *ngIf=\"!Password && !showWarning\">\r\n <ng-container *ngTemplateOutlet=\"suffix_internal\"></ng-container>\r\n </ng-container>\r\n\r\n <span class=\"form-input-suffix\" *ngIf=\"Password || showWarning\">\r\n <ng-container *ngIf=\"Password\" matSuffix>\r\n <a *ngIf=\"passShown\" class=\"fa fa-eye-slash app-fs-16 app-pointer\" (click)=\"Type = 'password'; passShown = !passShown; $event.preventDefault()\"></a>\r\n <a *ngIf=\"!passShown\" class=\"fa fa-eye app-fs-16 app-pointer\" (click)=\"Type = 'text'; passShown = !passShown; $event.preventDefault()\"></a>\r\n </ng-container>\r\n <ng-container *ngIf=\"showWarning\" matSuffix>\r\n <span title=\"{{warningTitle}}\" class=\"{{warningClass}} text-warning app-fs-16\"></span>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n</mat-form-field>\r\n\r\n<!-- Questo compoennte nascosto serve solamente per assicurarsi che angular carichi gli stili dei mat-button che altrimenti non caricherebbe... dunno why -->\r\n<div hidden><mat-datepicker-toggle></mat-datepicker-toggle></div>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"] }]
186
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: Array, decorators: [{
187
+ type: Optional
188
+ }, {
189
+ type: Inject,
190
+ args: [NG_VALIDATORS]
191
+ }] }, { type: Array, decorators: [{
192
+ type: Optional
193
+ }, {
194
+ type: Inject,
195
+ args: [NG_ASYNC_VALIDATORS]
196
+ }] }, { type: i0.Injector }, { type: i1.LocalizationService }]; }, propDecorators: { Frozen: [{
197
+ type: Input
198
+ }], Password: [{
199
+ type: Input
200
+ }], showWarning: [{
201
+ type: Input
202
+ }], warningTitle: [{
203
+ type: Input
204
+ }], warningClass: [{
205
+ type: Input
206
+ }], value: [{
207
+ type: Input,
208
+ args: ["value"]
209
+ }], suffix_internal: [{
210
+ type: ContentChild,
211
+ args: ["suffix_internal", { static: false }]
212
+ }], prefix_internal: [{
213
+ type: ContentChild,
214
+ args: ["prefix_internal", { static: false }]
215
+ }], Type: [{
216
+ type: Input
217
+ }], maxlength: [{
218
+ type: Input
219
+ }], minlength: [{
220
+ type: Input
221
+ }] } });
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi92YWxpZGF0aW9ucy92YWxpZGF0aW9uLWlucHV0L3ZhbGlkYXRpb24taW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1pbnB1dC92YWxpZGF0aW9uLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQTRDLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0osT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFFLFFBQVEsRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckwsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7OztBQUczRDs7R0FFRztBQWdCSCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsY0FBYztJQXlGeEQ7O09BRUc7SUFDSCxZQUFZLEdBQXNCLEVBQTZDLFdBQXVCLEVBQW1ELGdCQUE0QixFQUFVLFFBQWtCLEVBQVksRUFBdUI7UUFDaFAsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRGdFLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQW1ELHFC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Yzs0RkQzQkQsd0JBQXdCO2tCQWZwQyxTQUFTOytCQUNJLFdBQVcsbUJBRUosdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUU7d0JBQzdEOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDOzRCQUN2RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJOzswQkErRkEsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxhQUFhOzswQkFBb0MsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7cUdBdEZ0SSxNQUFNO3NCQUFkLEtBQUs7Z0JBS1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBT1UsWUFBWTtzQkFBM0IsS0FBSztnQkFLaUIsS0FBSztzQkFBM0IsS0FBSzt1QkFBQyxPQUFPO2dCQUtzQyxlQUFlO3NCQUFsRSxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFLRSxlQUFlO3NCQUFsRSxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFvQmxDLElBQUk7c0JBQW5CLEtBQUs7Z0JBS1UsU0FBUztzQkFBeEIsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVW50eXBlZEZvcm1Db250cm9sLCBOR19BU1lOQ19WQUxJREFUT1JTLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdDb250cm9sLCBSZXF1aXJlZFZhbGlkYXRvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT3B0aW9uYWwsIFNpbXBsZUNoYW5nZXMsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIERpcmV0dGl2ZSwgQ29tcG9uZW50aSwgTGlicmVyaWVcclxuaW1wb3J0IHsgQmFzZVZhbGlkYXRpb24gfSBmcm9tIFwiLi4vYmFzZS12YWxpZGF0aW9uXCI7XHJcbmltcG9ydCB7IEJhc2VWYWxpZGF0aW9uTG9jIH0gZnJvbSAnLi4vYmFzZS12YWxpZGF0aW9uLmxvYyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBkaSB2YWxpZGFpem9uZSBwZXIgZ2xpIGlucHV0IGEgc2VtcGxpY2UgY2FzZWxsYSBkaSB0ZXN0b1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJ2YWwtaW5wdXRcIixcclxuICAgIHRlbXBsYXRlVXJsOiBcInZhbGlkYXRpb24taW5wdXQuY29tcG9uZW50Lmh0bWxcIixcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogQmFzZVZhbGlkYXRpb25Mb2MgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBWYWxpZGF0aW9uSW5wdXRDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuLi92YWxpZGF0aW9uLXN0eWxlLnNjc3NcIl1cclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25JbnB1dENvbXBvbmVudCBleHRlbmRzIEJhc2VWYWxpZGF0aW9uIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKiBcclxuICAgICogUGVybWV0dGUgZGkgc2NyaXZlcmUgbyBtZW5vIG5lbCBjYW1wbyBkaSBJbnB1dC4gU2kgZGlmZmVyZW56aWEgZGFsIFJlYWRvbmx5IGluIHF1YW50byBmaXNpY2FtZW50ZSBsJ0lucHV0IMOoIHNjcml2aWJpbGUgZSB2ZW5nb25vIG1hbnRlbnV0aSBpIHRlbWkgZGVsbGEgdmFsaWRhemlvbmVcclxuICAgICogbWEgaW50ZXJhZ2lyZSBkaXJldHRhbWVudGUgY29uIGxhIGNhc2VsbGEgZGkgSW5wdXQgcGVyIGwndXRlbnRlIG5vbiDDqCBwb3NzaWJpbGVcclxuICAgICovXHJcbiAgICBASW5wdXQoKSBGcm96ZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBxdWVzdG8gQ29tb3BuZW50ZSBkZXZlIHJhcHByZXNlbnRhcmUgdW4gb2dnZXR0byBkaSBJbnB1dCBkaSB0aXBvIFwiUGFzc3dvcmRcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgUGFzc3dvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBkZXZlIG1vc3RyYXJlIHVuIGluZGljYXppb25lIGRpIHdhcm5pbmcgbmVsIHN1ZmZpc3NvXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93V2FybmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGl0b2xvIGRlbCBXYXJuaW5nIGRhIGltcG9zdGFyZSBzZSAqKnNob3dXYXJuaW5nKiogw6ggaW1wb3N0YXRvIGEgKip0cnVlKipcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHdhcm5pbmdUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3NlIGRlbCB3YXJuaW5nIGV2ZW50dWFsbWVudGUgbW9kaWZpY2FiaWxlLiBcclxuICAgICAqIFxyXG4gICAgICogRGVmYXVsdDogXCJmYSBmYS13YXJuaW5nXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHdhcm5pbmdDbGFzczogc3RyaW5nID0gXCJmYSBmYS13YXJuaW5nXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxvcmUgZGVsIG1vZGVsbG8gcmFwcHJlc2VudGF0byBkYSBxdWVzdG8gaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KFwidmFsdWVcIikgcHVibGljIHZhbHVlOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250aWVuZSBsYSBwcm9pZXppb25lIGRlbCBzdWZmaXNzbyBxdWFsb3JhIGZvc3NlIGZvcm5pdGFcclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZChcInN1ZmZpeF9pbnRlcm5hbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc3VmZml4X2ludGVybmFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGllbmUgbGEgcHJvaWV6aW9uZSBkZWwgcHJlZmlzc28gcXVhbG9yYSBmb3NzZSBmb3JuaXRhXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoXCJwcmVmaXhfaW50ZXJuYWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHByZWZpeF9pbnRlcm5hbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnNjcmlwdGlvbiBkZWwgdG9vbHRpcCBkYSByaXB1bGlyZSBhbCBkZXN0cm95IGRlbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdG9vbHRpcFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbGxvIGVzcG9zdG8gb3R0ZW51dG8gdHJhbWl0ZSBpbmplY3RvclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcmVudENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkZW50aWZpY2Egc2UgaWwgdGVzdG8gZGkgdW4gY29tcG9uZW50ZSBkaSB0aXBvIFwicGFzc3dvcmRcIiBkZXYnZXNzZXJlIHZpc3VhbGl6emF0byBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhc3NTaG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGlwbyBkZWwgY29tcG9uZW50ZSwgcHXDsiBlc3NlcmUgXCJ0ZXh0XCIgbyBcInBhc3N3b3JkXCIgZSB2aWVuZSBpbXBvc3RhdG8gYXV0b21hdGljYW1lbnRlIGRhbGwnSW5wdXQgKipQYXNzd29yZCoqXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBUeXBlOiBzdHJpbmcgPSBcInRleHRcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1heGxlbmd0aCBodG1sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhsZW5ndGg6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1pbmxlbmd0aCBodG1sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5sZW5ndGg6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXppb25lIHNlIGlsIGNvbXBvbmVudGUgaGEgbyBtZW5vIHVuIHN1ZmZpc3NvLiBcclxuICAgICAqIFxyXG4gICAgICogVmFsb3JpenphdG8gYSAqKnRydWUqKiBzb2xvIHNlIHZpZW5lIHRyb3ZhdGEgdW5hIHByb2llemlvbmUgc3UgKipzdWZmaXhfaW50ZXJuYWwqKiBvIHNlIGwnSW5wdXQgKipzaG93V2FybmluZyoqIHZpZW5lIGltcG9zdGF0byBhICoqdHJ1ZSoqXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBIYXNTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXppb25lIHNlIGlsIGNvbXBvbmVudGUgaGEgbyBtZW5vIHVuIHByZWZpc3NvLiBcclxuICAgICAqIFxyXG4gICAgICogVmFsb3JpenphdG8gYSAqKnRydWUqKiBzb2xvIHNlIHZpZW5lIHRyb3ZhdGEgdW5hIHByb2llemlvbmUgc3UgKipwcmVmaXhfaW50ZXJuYWwqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgSGFzUHJlZml4OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihjZHI6IENoYW5nZURldGVjdG9yUmVmLCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgcHJpdmF0ZSBfYXN5bmNWYWxpZGF0b3JzOiBBcnJheTxhbnk+LCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJvdGVjdGVkIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoY2RyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb2N1c1JlcXVlc3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkbmVzcyh0aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuUGFzc3dvcmQpXHJcbiAgICAgICAgICAgIHRoaXMuVHlwZSA9IFwicGFzc3dvcmRcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVyZWdpc3RlckZvY3VzUmVxdWVzdCgpO1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTdWJzY3JpcHRpb24pIHRoaXMudG9vbHRpcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuSGFzU3VmZml4ID0gISF0aGlzLnN1ZmZpeF9pbnRlcm5hbCB8fCB0aGlzLnNob3dXYXJuaW5nO1xyXG4gICAgICAgIHRoaXMuSGFzUHJlZml4ID0gISF0aGlzLnByZWZpeF9pbnRlcm5hbDtcclxuXHJcbiAgICAgICAgdGhpcy5wb3N0QmluZGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgbmV3U2hvd1dhcm5pbmdzID0gY2hhbmdlc1tcInNob3dXYXJuaW5nXCJdO1xyXG4gICAgICAgIGlmIChuZXdTaG93V2FybmluZ3MpXHJcbiAgICAgICAgICAgIHRoaXMuSGFzU3VmZml4ID0gISF0aGlzLnN1ZmZpeF9pbnRlcm5hbCB8fCB0aGlzLnNob3dXYXJuaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY29sbGVnYXJlIGkgdmFsaWRhdG9yaSBlIGxhIGZ1bnppb25lIGRpIHJlc2V0IGRhbCAqKkNvbnRyb2xWYWx1ZUFjY2Vzc29yKiogcmFwcHJlc2VudGF0byBcclxuICAgICAqIGRhIHF1ZXN0byBjb21wb25lbnRlIGFsICoqQ29udHJvbFZhbHVlQWNjZXNzb3IqKiByYXBwcmVzZW50YXRvIGRhbGwnZWZmZXR0aXZvIGVsZW1lbnRvIGRpIElucHV0IHByZXNlbnRlIGxhdG8gSFRNTFxyXG4gICAgICovXHJcbiAgICBwb3N0QmluZGluZygpIHtcclxuICAgICAgICB0aGlzLkNoZWNrVmFsaWRpdHkoKTtcclxuICAgICAgICBjb25zdCBuZ0NvbnRyb2w6IE5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCk7XHJcbiAgICAgICAgaWYgKG5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbCBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBsYSB2YXJpYWJpbGUgbm92YWxpZGF0ZSDDqCB0cnVlLCBlbGltaW5vIHR1dHRpIGkgdmFsaWRhdG9yaSBldmVudHVhbG1lbnRlIGluc2VyaXRpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5vVmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUlucHV0LmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSB0aGlzLnBhcmVudENvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5yZXNldCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KHRoaXMucGFyZW50Q29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEwnZW1pdCBkZWxsYSBtb2RpZmljYSBhbCB2YWxvcmUgdmllbmUgZ2VzdGl0byBzdSB1biBldmVudG8gY3VzdG9tICgqKmlucHV0Q2hhbmdlKiopIGNvbWUgd29ya2Fyb3VuZCBhbCBtYWxmdW56aW9uYW1lbnRvIGRlbGwnKipuZ01vZGVsQ2hhbmdlKiogbmF0aXZvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSB0b0VtaXQgdmFsb3JlIGRhIHByb3BhZ2FyZSBhbGwnZXN0ZXJub1xyXG4gICAgICovXHJcbiAgICBvbk1vZGVsQ2hhbmdlKHRvRW1pdCkge1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0b0VtaXQpO1xyXG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh0b0VtaXQpO1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgICB9XHJcbn0iLCI8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCIgYXBwZWFyYW5jZT1cInt7RmllbGRBcHBlYXJlbmNlfX1cIiBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIG1hdC1uby1ib3JkZXItdG9wIG1hdC1oZWlnaHQtZml4ZWRcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhQeFwiPlxyXG4gICAgPG1hdC1sYWJlbCBbY2xhc3MuYXBwLW1hcmdpbi1sZWZ0LTI1XT1cIkhhc1ByZWZpeFwiICpuZ0lmPVwicGxhY2Vob2xkZXIgJiYgRmxvYXRpbmdMYWJlbFwiPnt7cGxhY2Vob2xkZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkhhc1ByZWZpeFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcmVmaXhfaW50ZXJuYWxcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQmlzb2duYSBmaXhhcmUgdW4gcG8nIGwndXNvIGRpIHJlYWRvbmx5LCBkaXNhYmxlZCwgZnJvemVuIGNhenppIGUgbWF6emkgLS0+XHJcbiAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAjYmFzZUlucHV0PSduZ01vZGVsJ1xyXG4gICAgICAgICAgICNodG1sSW5wdXRcclxuICAgICAgICAgICB0eXBlPVwie3tUeXBlfX1cIlxyXG4gICAgICAgICAgIHRyaWdnZXJzPVwiXCJcclxuICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxyXG4gICAgICAgICAgIGF1dG9jb21wbGV0ZT1cInt7YXV0b2NvbXBsZXRlfX1cIlxyXG4gICAgICAgICAgIG5hbWU9XCJ7e2lkfX1cIlxyXG4gICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHt7Y2xhc3N9fVwiXHJcbiAgICAgICAgICAgaWQ9XCJ7e2lkfX1cIlxyXG4gICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJtYXhsZW5ndGggfHwgdW5kZWZpbmVkXCJcclxuICAgICAgICAgICBbYXR0ci5taW5sZW5ndGhdPVwibWlubGVuZ3RoIHx8IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgW2NsYXNzLmFwcC1tYXJnaW4tbGVmdC0yNV09XCJIYXNQcmVmaXhcIlxyXG4gICAgICAgICAgIFtjbGFzcy5tYXQtaW5wdXQtd2l0aC1zdWZmaXhdPVwiSGFzU3VmZml4IHx8IFBhc3N3b3JkIHx8IHNob3dXYXJuaW5nXCJcclxuICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcclxuICAgICAgICAgICBbY2xhc3MuY2hlY2tpbmctZmllbGRdPVwiIW5vVmFsaWRhdGUgJiYgIXNob3dXYXJuaW5nXCJcclxuICAgICAgICAgICBbdG9vbHRpcF09XCJ0b2xUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgW3JlYWRvbmx5XT1cIkZyb3plblwiXHJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cIlJlYWRvbmx5IHx8IGRpc2FibGVkIHx8IEZyb3plblwiXHJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIkZsb2F0aW5nTGFiZWwgPyB1bmRlZmluZWQgOiBwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAoY2xpY2spPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAoZm9jdXMpPVwiY2hlY2tUb29sdGlwKCk7XCJcclxuICAgICAgICAgICAoa2V5dXApPVwiKCRldmVudC5rZXlDb2RlID09IDEzIHx8ICRldmVudC5rZXlDb2RlID09IDI3KSAmJiBvbkZpbmFsaXplKCk7XCJcclxuICAgICAgICAgICAoYmx1cik9XCJjbG9zZVRvb2x0aXAoKTsgb25GaW5hbGl6ZSgpO1wiXHJcbiAgICAgICAgICAgPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkhhc1N1ZmZpeCB8fCBQYXNzd29yZCB8fCBzaG93V2FybmluZ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhUGFzc3dvcmQgJiYgIXNob3dXYXJuaW5nXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdWZmaXhfaW50ZXJuYWxcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWlucHV0LXN1ZmZpeFwiICpuZ0lmPVwiUGFzc3dvcmQgfHwgc2hvd1dhcm5pbmdcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlBhc3N3b3JkXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJwYXNzU2hvd25cIiBjbGFzcz1cImZhIGZhLWV5ZS1zbGFzaCBhcHAtZnMtMTYgYXBwLXBvaW50ZXJcIiAoY2xpY2spPVwiVHlwZSA9ICdwYXNzd29yZCc7IHBhc3NTaG93biA9ICFwYXNzU2hvd247ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgKm5nSWY9XCIhcGFzc1Nob3duXCIgY2xhc3M9XCJmYSBmYS1leWUgYXBwLWZzLTE2IGFwcC1wb2ludGVyXCIgKGNsaWNrKT1cIlR5cGUgPSAndGV4dCc7IHBhc3NTaG93biA9ICFwYXNzU2hvd247ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+PC9hPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dXYXJuaW5nXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJ7e3dhcm5pbmdUaXRsZX19XCIgY2xhc3M9XCJ7e3dhcm5pbmdDbGFzc319IHRleHQtd2FybmluZyBhcHAtZnMtMTZcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuPCEtLSBRdWVzdG8gY29tcG9lbm50ZSBuYXNjb3N0byBzZXJ2ZSBzb2xhbWVudGUgcGVyIGFzc2ljdXJhcnNpIGNoZSBhbmd1bGFyIGNhcmljaGkgZ2xpIHN0aWxpIGRlaSBtYXQtYnV0dG9uIGNoZSBhbHRyaW1lbnRpIG5vbiBjYXJpY2hlcmViYmUuLi4gZHVubm8gd2h5IC0tPlxyXG48ZGl2IGhpZGRlbj48bWF0LWRhdGVwaWNrZXItdG9nZ2xlPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICN0b2xUZW1wbGF0ZT5cclxuICAgIDxkaXYgKGNsaWNrKT1cImNsb3NlVG9vbHRpcCgpXCI+XHJcbiAgICAgICAgPHNwYW4+e3t2YWxpZGF0aW9uRmFpbGVkQmluZH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
@@ -0,0 +1,183 @@
1
+ // Angular
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewEncapsulation } from "@angular/core";
3
+ import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
4
+ // Configurazioni
5
+ import { LocalizationService } from "@esfaenza/localizations";
6
+ // Direttive, Componenti, Librerie
7
+ import { BaseValidation } from '../base-validation';
8
+ import { BaseValidationLoc } from '../base-validation.loc';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@esfaenza/localizations";
11
+ import * as i2 from "@angular/common";
12
+ import * as i3 from "@angular/forms";
13
+ import * as i4 from "@angular/material/legacy-form-field";
14
+ import * as i5 from "@angular/material/legacy-input";
15
+ import * as i6 from "ngx-bootstrap/tooltip";
16
+ import * as i7 from "../customValidators/CustomRequiredDirective";
17
+ /**
18
+ * Componente di validaizone per gli input a selezione singola
19
+ */
20
+ export class ValidationSelectComponent extends BaseValidation {
21
+ /**
22
+ * @ignore
23
+ */
24
+ constructor(_validators, _asyncValidators, injector, cdr, lc) {
25
+ super(cdr);
26
+ this._validators = _validators;
27
+ this._asyncValidators = _asyncValidators;
28
+ this.injector = injector;
29
+ this.lc = lc;
30
+ /**
31
+ * valore del campo vuoto della select
32
+ */
33
+ this.emptyFieldValue = "-2000";
34
+ /**
35
+ * Valore del placeholder
36
+ */
37
+ this.placeHolderValue = "-1000";
38
+ /**
39
+ * Per i componenti non obbligatori indica se fornire un "valore vuoto"
40
+ */
41
+ this.emptyValue = true;
42
+ /**
43
+ * Indica se mostrare o nascondere il simboletto di validazione (Tic verde o Croce rossa)
44
+ */
45
+ this.showValidationSymbol = true;
46
+ /**
47
+ * Contenuto della label Floattante Material-Style
48
+ */
49
+ this.label = "";
50
+ /**
51
+ * Evento richiamato quando si perde il focus sull'input di inserimento
52
+ */
53
+ this.onBlur = new EventEmitter();
54
+ /**
55
+ * @ignore
56
+ */
57
+ this.onTouched = () => { }; //placeholder on touched function
58
+ }
59
+ /**
60
+ * @ignore
61
+ */
62
+ ngOnInit() {
63
+ super.ngOnInit();
64
+ this.registerFocusRequest();
65
+ this.checkRequiredness(this._validators);
66
+ }
67
+ /**
68
+ * @ignore
69
+ */
70
+ ngOnDestroy() {
71
+ super.ngOnDestroy();
72
+ this.deregisterFocusRequest();
73
+ if (this.tooltipSubscription)
74
+ this.tooltipSubscription.unsubscribe();
75
+ }
76
+ /**
77
+ * @ignore
78
+ */
79
+ ngAfterViewInit() {
80
+ this.postBinding();
81
+ }
82
+ /**
83
+ * Metodo che si occupa di collegare i validatori e la funzione di reset dal **ControlValueAccessor** rappresentato
84
+ * da questo componente al **ControlValueAccessor** rappresentato dall'effettivo elemento di Input presente lato HTML
85
+ */
86
+ postBinding() {
87
+ // Eredito i validatori
88
+ if (!this.noValidate) {
89
+ this.baseInput.control.setAsyncValidators(this._asyncValidators);
90
+ this.baseInput.control.setValidators(this._validators);
91
+ }
92
+ this.CheckValidity();
93
+ const ngControl = this.injector.get(NgControl, null);
94
+ if (ngControl) {
95
+ this.parentControl = ngControl.control;
96
+ // se la variabile novalidate è true, elimino tutti i validatori eventualmente inseriti
97
+ if (this.noValidate) {
98
+ this.parentControl.clearValidators();
99
+ this.parentControl.clearAsyncValidators();
100
+ }
101
+ // faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
102
+ const origFunc = this.parentControl.reset;
103
+ this.parentControl.reset = () => {
104
+ origFunc.apply(this.parentControl);
105
+ this.baseInput.control.reset();
106
+ this.tooltip.hide();
107
+ };
108
+ }
109
+ }
110
+ /**
111
+ * @ignore
112
+ */
113
+ writeValue(value) {
114
+ this.value = value;
115
+ this.propagateChange(value);
116
+ this.cdr.markForCheck();
117
+ }
118
+ /**
119
+ * L'emit della modifica al valore viene gestito su un evento custom (**inputChange**) come workaround al malfunzionamento dell'**ngModelChange** nativo
120
+ *
121
+ * @param {any} toEmit valore da propagare all'esterno
122
+ */
123
+ onModelChange(toEmit) {
124
+ this.writeValue(toEmit);
125
+ this.inputChange.emit(toEmit);
126
+ this.onTouched();
127
+ }
128
+ /**
129
+ * @ignore
130
+ */
131
+ registerOnChange(fn) {
132
+ this.propagateChange = fn;
133
+ }
134
+ /**
135
+ * @ignore
136
+ */
137
+ registerOnTouched(fn) {
138
+ this.onTouched = fn;
139
+ }
140
+ }
141
+ ValidationSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationSelectComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
142
+ ValidationSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ValidationSelectComponent, selector: "val-select", inputs: { emptyFieldValue: "emptyFieldValue", placeHolderValue: "placeHolderValue", emptyValue: "emptyValue", showValidationSymbol: "showValidationSymbol", label: "label" }, outputs: { onBlur: "onBlur" }, providers: [
143
+ { provide: LocalizationService, useClass: BaseValidationLoc },
144
+ {
145
+ provide: NG_VALUE_ACCESSOR,
146
+ useExisting: forwardRef(() => ValidationSelectComponent),
147
+ multi: true
148
+ }
149
+ ], usesInheritance: true, ngImport: i0, template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <select matNativeControl\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n name=\"val-select\"\r\n class=\"form-control\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n id=\"{{id}}\"\r\n [customRequired]=\"required\"\r\n [CustomNullValues]=\"[placeHolderValue, emptyFieldValue]\"\r\n [(ngModel)]=\"value\"\r\n [tooltip]=\"tolTemplate\"\r\n [class.checking-combo]=\"!noValidate\"\r\n [class.app-option-placeholder]=\"baseInput.value === placeHolderValue\"\r\n [class.no-bg-img]=\"!showValidationSymbol\"\r\n [disabled]=\"Readonly\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (blur)=\"closeTooltip(); onBlur.emit(true);\"\r\n (ngModelChange)=\"onModelChange($event); onFinalize()\">\r\n\r\n <option *ngIf=\"placeholder\" [value]=\"placeHolderValue\" disabled selected hidden>{{placeholder}}</option>\r\n <option *ngIf=\"required == false && emptyValue\" [value]=\"emptyFieldValue\"></option>\r\n <ng-content></ng-content>\r\n </select>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i7.CustomRequiredDirective, selector: "[customRequired]", inputs: ["CustomNullValues", "customRequired"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationSelectComponent, decorators: [{
151
+ type: Component,
152
+ args: [{ selector: "val-select", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
153
+ { provide: LocalizationService, useClass: BaseValidationLoc },
154
+ {
155
+ provide: NG_VALUE_ACCESSOR,
156
+ useExisting: forwardRef(() => ValidationSelectComponent),
157
+ multi: true
158
+ }
159
+ ], template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <select matNativeControl\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n name=\"val-select\"\r\n class=\"form-control\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n id=\"{{id}}\"\r\n [customRequired]=\"required\"\r\n [CustomNullValues]=\"[placeHolderValue, emptyFieldValue]\"\r\n [(ngModel)]=\"value\"\r\n [tooltip]=\"tolTemplate\"\r\n [class.checking-combo]=\"!noValidate\"\r\n [class.app-option-placeholder]=\"baseInput.value === placeHolderValue\"\r\n [class.no-bg-img]=\"!showValidationSymbol\"\r\n [disabled]=\"Readonly\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (blur)=\"closeTooltip(); onBlur.emit(true);\"\r\n (ngModelChange)=\"onModelChange($event); onFinalize()\">\r\n\r\n <option *ngIf=\"placeholder\" [value]=\"placeHolderValue\" disabled selected hidden>{{placeholder}}</option>\r\n <option *ngIf=\"required == false && emptyValue\" [value]=\"emptyFieldValue\"></option>\r\n <ng-content></ng-content>\r\n </select>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"] }]
160
+ }], ctorParameters: function () { return [{ type: Array, decorators: [{
161
+ type: Optional
162
+ }, {
163
+ type: Inject,
164
+ args: [NG_VALIDATORS]
165
+ }] }, { type: Array, decorators: [{
166
+ type: Optional
167
+ }, {
168
+ type: Inject,
169
+ args: [NG_ASYNC_VALIDATORS]
170
+ }] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i1.LocalizationService }]; }, propDecorators: { emptyFieldValue: [{
171
+ type: Input
172
+ }], placeHolderValue: [{
173
+ type: Input
174
+ }], emptyValue: [{
175
+ type: Input
176
+ }], showValidationSymbol: [{
177
+ type: Input
178
+ }], label: [{
179
+ type: Input
180
+ }], onBlur: [{
181
+ type: Output
182
+ }] } });
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1zZWxlY3QvdmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1zZWxlY3QvdmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFhLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JNLE9BQU8sRUFBNEMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvSixpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBSXpEOztHQUVHO0FBZ0JILE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxjQUFjO0lBK0N6RDs7T0FFRztJQUNILFlBQXVELFdBQXVCLEVBQW1ELGdCQUE0QixFQUFVLFFBQWtCLEVBQUUsR0FBc0IsRUFBWSxFQUF1QjtRQUNoUCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEd0MsZ0JBQVcsR0FBWCxXQUFX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QS9CLEtBQUs7Z0JBS1UsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBS1UsS0FBSztzQkFBcEIsS0FBSztnQkFLVyxNQUFNO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBVbnR5cGVkRm9ybUNvbnRyb2wsIE5HX0FTWU5DX1ZBTElEQVRPUlMsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBOZ0NvbnRyb2wsIFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7QmFzZVZhbGlkYXRpb259IGZyb20gJy4uL2Jhc2UtdmFsaWRhdGlvbic7XHJcbmltcG9ydCB7QmFzZVZhbGlkYXRpb25Mb2N9IGZyb20gJy4uL2Jhc2UtdmFsaWRhdGlvbi5sb2MnO1xyXG5cclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGRpIHZhbGlkYWl6b25lIHBlciBnbGkgaW5wdXQgYSBzZWxlemlvbmUgc2luZ29sYVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJ2YWwtc2VsZWN0XCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCJ2YWxpZGF0aW9uLXNlbGVjdC5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHN0eWxlVXJsczogW1wiLi4vdmFsaWRhdGlvbi1zdHlsZS5zY3NzXCJdLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBCYXNlVmFsaWRhdGlvbkxvYyB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFZhbGlkYXRpb25TZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBCYXNlVmFsaWRhdGlvbiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiB2YWxvcmUgZGVsIGNhbXBvIHZ1b3RvIGRlbGxhIHNlbGVjdFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW1wdHlGaWVsZFZhbHVlID0gXCItMjAwMFwiO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZSBkZWwgcGxhY2Vob2xkZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlSG9sZGVyVmFsdWUgPSBcIi0xMDAwXCI7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUGVyIGkgY29tcG9uZW50aSBub24gb2JibGlnYXRvcmkgaW5kaWNhIHNlIGZvcm5pcmUgdW4gXCJ2YWxvcmUgdnVvdG9cIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW1wdHlWYWx1ZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgbW9zdHJhcmUgbyBuYXNjb25kZXJlIGlsIHNpbWJvbGV0dG8gZGkgdmFsaWRhemlvbmUgKFRpYyB2ZXJkZSBvIENyb2NlIHJvc3NhKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ZhbGlkYXRpb25TeW1ib2w6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGVudXRvIGRlbGxhIGxhYmVsIEZsb2F0dGFudGUgTWF0ZXJpYWwtU3R5bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIHJpY2hpYW1hdG8gcXVhbmRvIHNpIHBlcmRlIGlsIGZvY3VzIHN1bGwnaW5wdXQgZGkgaW5zZXJpbWVudG9cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkJsdXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xsbyBlc3Bvc3RvIG90dGVudXRvIHRyYW1pdGUgaW5qZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcmVudENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZSBkZWwgbW9kZWxsbyByYXBwcmVzZW50YXRvIGRhbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaXB0aW9uIGRlbCB0b290bHRpcCBkYSByaXB1bGlyZSBhbGxhIGRpc3RydXppb25lIGRlbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdG9vbHRpcFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogQXJyYXk8YW55PiwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCBsYzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNkcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZG5lc3ModGhpcy5fdmFsaWRhdG9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRlcmVnaXN0ZXJGb2N1c1JlcXVlc3QoKTtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU3Vic2NyaXB0aW9uKSB0aGlzLnRvb2x0aXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnBvc3RCaW5kaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBjb2xsZWdhcmUgaSB2YWxpZGF0b3JpIGUgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGFsICoqQ29udHJvbFZhbHVlQWNjZXNzb3IqKiByYXBwcmVzZW50YXRvIFxyXG4gICAgICogZGEgcXVlc3RvIGNvbXBvbmVudGUgYWwgKipDb250cm9sVmFsdWVBY2Nlc3NvcioqIHJhcHByZXNlbnRhdG8gZGFsbCdlZmZldHRpdm8gZWxlbWVudG8gZGkgSW5wdXQgcHJlc2VudGUgbGF0byBIVE1MXHJcbiAgICAgKi9cclxuICAgIHBvc3RCaW5kaW5nKCkge1xyXG4gICAgICAgIC8vIEVyZWRpdG8gaSB2YWxpZGF0b3JpXHJcbiAgICAgICAgaWYgKCF0aGlzLm5vVmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5DaGVja1ZhbGlkaXR5KCk7XHJcbiAgICAgICAgY29uc3QgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRDb250cm9sID0gbmdDb250cm9sLmNvbnRyb2wgYXMgVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgICAgICAgICAgLy8gc2UgbGEgdmFyaWFiaWxlIG5vdmFsaWRhdGUgw6ggdHJ1ZSwgZWxpbWlubyB0dXR0aSBpIHZhbGlkYXRvcmkgZXZlbnR1YWxtZW50ZSBpbnNlcml0aVxyXG4gICAgICAgICAgICBpZiAodGhpcy5ub1ZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSB0aGlzLnBhcmVudENvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5yZXNldCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KHRoaXMucGFyZW50Q29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4geyB9OyAvL3BsYWNlaG9sZGVyIG9uIHRvdWNoZWQgZnVuY3Rpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMJ2VtaXQgZGVsbGEgbW9kaWZpY2EgYWwgdmFsb3JlIHZpZW5lIGdlc3RpdG8gc3UgdW4gZXZlbnRvIGN1c3RvbSAoKippbnB1dENoYW5nZSoqKSBjb21lIHdvcmthcm91bmQgYWwgbWFsZnVuemlvbmFtZW50byBkZWxsJyoqbmdNb2RlbENoYW5nZSoqIG5hdGl2b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdG9FbWl0IHZhbG9yZSBkYSBwcm9wYWdhcmUgYWxsJ2VzdGVybm9cclxuICAgICAqL1xyXG4gICAgb25Nb2RlbENoYW5nZSh0b0VtaXQpIHtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodG9FbWl0KTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQodG9FbWl0KTtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG59IiwiPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJ7e0ZpZWxkQXBwZWFyZW5jZX19XCIgY2xhc3M9XCJtYXQtZnVsbC13aWR0aCBtYXQtbm8tYm9yZGVyLXRvcCBtYXQtaGVpZ2h0LWZpeGVkXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoUHhcIj5cclxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7bGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sXHJcbiAgICAgICAgICAgICNiYXNlSW5wdXQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgI2h0bWxJbnB1dFxyXG4gICAgICAgICAgICBuYW1lPVwidmFsLXNlbGVjdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgdHJpZ2dlcnM9XCJcIlxyXG4gICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxyXG4gICAgICAgICAgICBpZD1cInt7aWR9fVwiXHJcbiAgICAgICAgICAgIFtjdXN0b21SZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIFtDdXN0b21OdWxsVmFsdWVzXT1cIltwbGFjZUhvbGRlclZhbHVlLCBlbXB0eUZpZWxkVmFsdWVdXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgIFt0b29sdGlwXT1cInRvbFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmNoZWNraW5nLWNvbWJvXT1cIiFub1ZhbGlkYXRlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFwcC1vcHRpb24tcGxhY2Vob2xkZXJdPVwiYmFzZUlucHV0LnZhbHVlID09PSBwbGFjZUhvbGRlclZhbHVlXCJcclxuICAgICAgICAgICAgW2NsYXNzLm5vLWJnLWltZ109XCIhc2hvd1ZhbGlkYXRpb25TeW1ib2xcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cImNoZWNrVG9vbHRpcCgpO1wiXHJcbiAgICAgICAgICAgIChibHVyKT1cImNsb3NlVG9vbHRpcCgpOyBvbkJsdXIuZW1pdCh0cnVlKTtcIlxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudCk7IG9uRmluYWxpemUoKVwiPlxyXG5cclxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwicGxhY2Vob2xkZXJcIiBbdmFsdWVdPVwicGxhY2VIb2xkZXJWYWx1ZVwiIGRpc2FibGVkIHNlbGVjdGVkIGhpZGRlbj57e3BsYWNlaG9sZGVyfX08L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwicmVxdWlyZWQgPT0gZmFsc2UgJiYgZW1wdHlWYWx1ZVwiIFt2YWx1ZV09XCJlbXB0eUZpZWxkVmFsdWVcIj48L29wdGlvbj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L3NlbGVjdD5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdG9sVGVtcGxhdGU+XHJcbiAgICA8ZGl2IChjbGljayk9XCJjbG9zZVRvb2x0aXAoKVwiPlxyXG4gICAgICAgIDxzcGFuPnt7dmFsaWRhdGlvbkZhaWxlZEJpbmR9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
@@ -0,0 +1,78 @@
1
+ // Angular
2
+ import { ChangeDetectionStrategy, Component, forwardRef, Inject, Input, Optional, ViewEncapsulation } from "@angular/core";
3
+ import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR } from "@angular/forms";
4
+ // Configurazioni
5
+ import { LocalizationService } from "@esfaenza/localizations";
6
+ // Direttive, Componenti, Librerie
7
+ import { BaseValidationLoc } from "../base-validation.loc";
8
+ import { ValidationInputComponent } from "../validation-input/validation-input.component";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@esfaenza/localizations";
11
+ import * as i2 from "@angular/common";
12
+ import * as i3 from "@angular/forms";
13
+ import * as i4 from "@angular/material/legacy-form-field";
14
+ import * as i5 from "@angular/material/legacy-input";
15
+ import * as i6 from "ngx-bootstrap/tooltip";
16
+ /**
17
+ * Componente di validaizone per gli input ad area di testo
18
+ */
19
+ export class ValidationTextAreaComponent extends ValidationInputComponent {
20
+ /**
21
+ * @ignore
22
+ */
23
+ constructor(cdr, validators, asyncValidators, injector, lc) {
24
+ super(cdr, validators, asyncValidators, injector, lc);
25
+ this.lc = lc;
26
+ /**
27
+ * Righe da mostrare di default per l'area di inserimento
28
+ */
29
+ this.rows = 2;
30
+ }
31
+ /**
32
+ * @ignore
33
+ */
34
+ ngOnInit() {
35
+ super.ngOnInit();
36
+ this.registerFocusRequest();
37
+ }
38
+ /**
39
+ * @ignore
40
+ */
41
+ ngOnDestroy() {
42
+ super.ngOnDestroy();
43
+ this.deregisterFocusRequest();
44
+ }
45
+ }
46
+ ValidationTextAreaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationTextAreaComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: i0.Injector }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
47
+ ValidationTextAreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ValidationTextAreaComponent, selector: "val-textarea", inputs: { rows: "rows" }, providers: [
48
+ { provide: LocalizationService, useClass: BaseValidationLoc },
49
+ {
50
+ provide: NG_VALUE_ACCESSOR,
51
+ useExisting: forwardRef(() => ValidationTextAreaComponent),
52
+ multi: true
53
+ }
54
+ ], usesInheritance: true, ngImport: i0, template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-full-height mat-no-border-top mat-height-auto\">\r\n <mat-label *ngIf=\"placeholder && FloatingLabel\">{{placeholder}}</mat-label>\r\n <textarea matInput\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n [(ngModel)]=\"value\"\r\n name=\"val-textarea\"\r\n triggers=\"\"\r\n class=\"app-no-resize form-control {{class}}\"\r\n id=\"{{id}}\"\r\n [class.checking-field]=\"!noValidate\"\r\n rows=\"{{rows}}\"\r\n [tooltip]=\"tolTemplate\"\r\n [placeholder]=\"FloatingLabel ? undefined : placeholder\"\r\n placement=\"top\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (keyup)=\"($event.keyCode == 13 || $event.keyCode == 27) && onFinalize();\"\r\n (blur)=\"closeTooltip(); onFinalize();\"\r\n (ngModelChange)=\"onModelChange($event)\">\r\n </textarea>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationTextAreaComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: "val-textarea", providers: [
58
+ { provide: LocalizationService, useClass: BaseValidationLoc },
59
+ {
60
+ provide: NG_VALUE_ACCESSOR,
61
+ useExisting: forwardRef(() => ValidationTextAreaComponent),
62
+ multi: true
63
+ }
64
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-full-height mat-no-border-top mat-height-auto\">\r\n <mat-label *ngIf=\"placeholder && FloatingLabel\">{{placeholder}}</mat-label>\r\n <textarea matInput\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n [(ngModel)]=\"value\"\r\n name=\"val-textarea\"\r\n triggers=\"\"\r\n class=\"app-no-resize form-control {{class}}\"\r\n id=\"{{id}}\"\r\n [class.checking-field]=\"!noValidate\"\r\n rows=\"{{rows}}\"\r\n [tooltip]=\"tolTemplate\"\r\n [placeholder]=\"FloatingLabel ? undefined : placeholder\"\r\n placement=\"top\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (keyup)=\"($event.keyCode == 13 || $event.keyCode == 27) && onFinalize();\"\r\n (blur)=\"closeTooltip(); onFinalize();\"\r\n (ngModelChange)=\"onModelChange($event)\">\r\n </textarea>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"] }]
65
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: Array, decorators: [{
66
+ type: Optional
67
+ }, {
68
+ type: Inject,
69
+ args: [NG_VALIDATORS]
70
+ }] }, { type: Array, decorators: [{
71
+ type: Optional
72
+ }, {
73
+ type: Inject,
74
+ args: [NG_ASYNC_VALIDATORS]
75
+ }] }, { type: i0.Injector }, { type: i1.LocalizationService }]; }, propDecorators: { rows: [{
76
+ type: Input
77
+ }] } });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi10ZXh0LWFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi10ZXh0LWFyZWEvdmFsaWRhdGlvbi10ZXh0LWFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi10ZXh0LWFyZWEvdmFsaWRhdGlvbi10ZXh0LWFyZWEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7Ozs7QUFFMUY7O0dBRUc7QUFnQkgsTUFBTSxPQUFPLDJCQUE0QixTQUFRLHdCQUF3QjtJQU9yRTs7T0FFRztJQUNILFlBQVksR0FBc0IsRUFBcUMsVUFBc0IsRUFBMkMsZUFBMkIsRUFBRSxRQUFrQixFQUFZLEVBQXVCO1FBQ3ROLEtBQUssQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFEeUksT0FBRSxHQUFGLEVBQUUsQ0FBcUI7UUFSMU47O1dBRUc7UUFDTSxTQUFJLEdBQVcsQ0FBQyxDQUFDO0lBTzFCLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzt5SEE5QlEsMkJBQTJCLG1EQVVvQixhQUFhLDZCQUE4QyxtQkFBbUI7NkdBVjdILDJCQUEyQixpRUFaekI7UUFDUCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUU7UUFDN0Q7WUFDSSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7WUFDMUQsS0FBSyxFQUFFLElBQUk7U0FDZDtLQUNKLGlEQ3hCTCxtdUNBMkJjOzRGREVELDJCQUEyQjtrQkFmdkMsU0FBUzsrQkFDSSxjQUFjLGFBRWI7d0JBQ1AsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFO3dCQUM3RDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQzs0QkFDMUQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFFcEIsdUJBQXVCLENBQUMsTUFBTTs7MEJBWVYsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxhQUFhOzswQkFBMkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7cUdBTDdILElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPcHRpb25hbCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOR19BU1lOQ19WQUxJREFUT1JTLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5cclxuLy8gRGlyZXR0aXZlLCBDb21wb25lbnRpLCBMaWJyZXJpZVxyXG5pbXBvcnQgeyBCYXNlVmFsaWRhdGlvbkxvYyB9IGZyb20gXCIuLi9iYXNlLXZhbGlkYXRpb24ubG9jXCI7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25JbnB1dENvbXBvbmVudCB9IGZyb20gXCIuLi92YWxpZGF0aW9uLWlucHV0L3ZhbGlkYXRpb24taW5wdXQuY29tcG9uZW50XCI7XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBkaSB2YWxpZGFpem9uZSBwZXIgZ2xpIGlucHV0IGFkIGFyZWEgZGkgdGVzdG9cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwidmFsLXRleHRhcmVhXCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCJ2YWxpZGF0aW9uLXRleHQtYXJlYS5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogQmFzZVZhbGlkYXRpb25Mb2MgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBWYWxpZGF0aW9uVGV4dEFyZWFDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuLi92YWxpZGF0aW9uLXN0eWxlLnNjc3NcIl0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvblRleHRBcmVhQ29tcG9uZW50IGV4dGVuZHMgVmFsaWRhdGlvbklucHV0Q29tcG9uZW50IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpZ2hlIGRhIG1vc3RyYXJlIGRpIGRlZmF1bHQgcGVyIGwnYXJlYSBkaSBpbnNlcmltZW50b1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSByb3dzOiBudW1iZXIgPSAyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihjZHI6IENoYW5nZURldGVjdG9yUmVmLCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgYXN5bmNWYWxpZGF0b3JzOiBBcnJheTxhbnk+LCBpbmplY3RvcjogSW5qZWN0b3IsIHByb3RlY3RlZCBsYzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNkciwgdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzLCBpbmplY3RvciwgbGMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5kZXJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcbiAgICB9XHJcbn0iLCI8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cInt7RmllbGRBcHBlYXJlbmNlfX1cIiBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIG1hdC1mdWxsLWhlaWdodCBtYXQtbm8tYm9yZGVyLXRvcCBtYXQtaGVpZ2h0LWF1dG9cIj5cclxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJwbGFjZWhvbGRlciAmJiBGbG9hdGluZ0xhYmVsXCI+e3twbGFjZWhvbGRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICA8dGV4dGFyZWEgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAjYmFzZUlucHV0PVwibmdNb2RlbFwiXHJcbiAgICAgICAgICAgICAgI2h0bWxJbnB1dFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgIG5hbWU9XCJ2YWwtdGV4dGFyZWFcIlxyXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwiXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFwcC1uby1yZXNpemUgZm9ybS1jb250cm9sIHt7Y2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgaWQ9XCJ7e2lkfX1cIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5jaGVja2luZy1maWVsZF09XCIhbm9WYWxpZGF0ZVwiXHJcbiAgICAgICAgICAgICAgcm93cz1cInt7cm93c319XCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcF09XCJ0b2xUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIkZsb2F0aW5nTGFiZWwgPyB1bmRlZmluZWQgOiBwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoZm9jdXMpPVwiY2hlY2tUb29sdGlwKCk7XCJcclxuICAgICAgICAgICAgICAoa2V5dXApPVwiKCRldmVudC5rZXlDb2RlID09IDEzIHx8ICRldmVudC5rZXlDb2RlID09IDI3KSAmJiBvbkZpbmFsaXplKCk7XCJcclxuICAgICAgICAgICAgICAoYmx1cik9XCJjbG9zZVRvb2x0aXAoKTsgb25GaW5hbGl6ZSgpO1wiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICA8L3RleHRhcmVhPlxyXG48L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0b2xUZW1wbGF0ZT5cclxuICAgIDxkaXYgKGNsaWNrKT1cImNsb3NlVG9vbHRpcCgpXCI+XHJcbiAgICAgICAgPHNwYW4+e3t2YWxpZGF0aW9uRmFpbGVkQmluZH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19