@esfaenza/forms-and-validations 15.2.57 → 15.2.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/lib/forms/base-form-control.mjs +10 -4
- package/{esm2020 → esm2022}/lib/forms/form-adaptive/form-adaptive.component.loc.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-adaptive/form-adaptive.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-autocomplete/form-autocomplete.component.loc.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-autocomplete/form-autocomplete.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-checkbox/form-checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-date/form-date.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-datetime/form-datetime.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-empty/form-empty.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-error/form-error.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-file/form-file.component.loc.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-file/form-file.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-info/form-info.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-input/form-input.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/forms/form-multiselect/form-multiselect.component.loc.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-multiselect/form-multiselect.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-select/form-select.component.loc.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-select/form-select.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-template/form-template.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-textarea/form-textarea.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms/form-time/form-time.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-and-validations.module.mjs +64 -64
- package/{esm2020 → esm2022}/lib/models/dayjs-adapter/dayjs-date-adapter.mjs +4 -4
- package/{esm2020 → esm2022}/lib/validations/base-validation.loc.mjs +4 -4
- package/{esm2020 → esm2022}/lib/validations/base-validation.mjs +4 -4
- package/{esm2020 → esm2022}/lib/validations/customValidators/CustomRequiredDirective.mjs +4 -4
- package/esm2022/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +147 -0
- package/esm2022/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.mjs +240 -0
- package/esm2022/lib/validations/validation-currency/validation-currency.component.mjs +75 -0
- package/esm2022/lib/validations/validation-date/validation-date.component.mjs +183 -0
- package/esm2022/lib/validations/validation-datetime/validation-datetime.component.mjs +212 -0
- package/esm2022/lib/validations/validation-input/validation-input.component.mjs +222 -0
- package/esm2022/lib/validations/validation-select/validation-select.component.mjs +183 -0
- package/esm2022/lib/validations/validation-text-area/validation-text-area.component.mjs +78 -0
- package/{fesm2020 → fesm2022}/esfaenza-forms-and-validations.mjs +235 -223
- package/fesm2022/esfaenza-forms-and-validations.mjs.map +1 -0
- package/lib/forms/base-form-control.d.ts +11 -1
- package/lib/forms/form-adaptive/form-adaptive.component.d.ts +1 -1
- package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +1 -1
- package/lib/forms/form-checkbox/form-checkbox.component.d.ts +1 -1
- package/lib/forms/form-date/form-date.component.d.ts +1 -1
- package/lib/forms/form-datetime/form-datetime.component.d.ts +1 -1
- package/lib/forms/form-empty/form-empty.component.d.ts +1 -1
- package/lib/forms/form-error/form-error.component.d.ts +1 -1
- package/lib/forms/form-file/form-file.component.d.ts +1 -1
- package/lib/forms/form-info/form-info.component.d.ts +1 -1
- package/lib/forms/form-input/form-input.component.d.ts +1 -1
- package/lib/forms/form-multiselect/form-multiselect.component.d.ts +1 -1
- package/lib/forms/form-select/form-select.component.d.ts +1 -1
- package/lib/forms/form-template/form-template.component.d.ts +1 -1
- package/lib/forms/form-textarea/form-textarea.component.d.ts +1 -1
- package/lib/forms/form-time/form-time.component.d.ts +1 -1
- package/lib/validations/base-validation.d.ts +1 -1
- package/lib/validations/customValidators/CustomRequiredDirective.d.ts +1 -1
- package/lib/validations/validation-autocomplete/validation-autocomplete.component.d.ts +1 -1
- package/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.d.ts +1 -1
- package/lib/validations/validation-currency/validation-currency.component.d.ts +1 -1
- package/lib/validations/validation-date/validation-date.component.d.ts +1 -1
- package/lib/validations/validation-datetime/validation-datetime.component.d.ts +1 -1
- package/lib/validations/validation-input/validation-input.component.d.ts +10 -2
- package/lib/validations/validation-select/validation-select.component.d.ts +1 -1
- package/lib/validations/validation-text-area/validation-text-area.component.d.ts +1 -1
- package/package.json +5 -11
- package/esm2020/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +0 -147
- package/esm2020/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.mjs +0 -240
- package/esm2020/lib/validations/validation-currency/validation-currency.component.mjs +0 -75
- package/esm2020/lib/validations/validation-date/validation-date.component.mjs +0 -183
- package/esm2020/lib/validations/validation-datetime/validation-datetime.component.mjs +0 -212
- package/esm2020/lib/validations/validation-input/validation-input.component.mjs +0 -216
- package/esm2020/lib/validations/validation-select/validation-select.component.mjs +0 -183
- package/esm2020/lib/validations/validation-text-area/validation-text-area.component.mjs +0 -78
- package/fesm2015/esfaenza-forms-and-validations.mjs +0 -4310
- package/fesm2015/esfaenza-forms-and-validations.mjs.map +0 -1
- package/fesm2020/esfaenza-forms-and-validations.mjs.map +0 -1
- /package/{esm2020 → esm2022}/esfaenza-forms-and-validations.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/AppFile.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/ChangeEvent.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/FormsAndValidationsModuleConfig.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -115,6 +115,8 @@ export declare abstract class BaseFormControl implements ControlValueAccessor {
|
|
|
115
115
|
DisplayLayout: 'form' | 'inline' | 'hidden';
|
|
116
116
|
/** Separatore da mettere in automatico fra un elemento Form e l'altro quando sono in **DisplayMode** con **DisplayLayout** inline */
|
|
117
117
|
InlineSeparator: string;
|
|
118
|
+
/** Type HTML (password/text/etc...) */
|
|
119
|
+
Type: string;
|
|
118
120
|
/**
|
|
119
121
|
* Espressione simil-Angular per cambiare il testo dei componenti che scelgono il proprio modello da una **Source**
|
|
120
122
|
*
|
|
@@ -129,6 +131,14 @@ export declare abstract class BaseFormControl implements ControlValueAccessor {
|
|
|
129
131
|
}[];
|
|
130
132
|
/** Indica se è il primo Bind della Source */
|
|
131
133
|
protected SourceFirstBind: boolean;
|
|
134
|
+
/**
|
|
135
|
+
* Max length
|
|
136
|
+
*/
|
|
137
|
+
maxlength: number;
|
|
138
|
+
/**
|
|
139
|
+
* Max length
|
|
140
|
+
*/
|
|
141
|
+
minlength: number;
|
|
132
142
|
/**
|
|
133
143
|
* Ottiene il valore della variabile **_readonly**
|
|
134
144
|
*
|
|
@@ -262,5 +272,5 @@ export declare abstract class BaseFormControl implements ControlValueAccessor {
|
|
|
262
272
|
/** @ignore */
|
|
263
273
|
abstract onNotNullValueSet(): void;
|
|
264
274
|
static ɵfac: i0.ɵɵFactoryDeclaration<BaseFormControl, never>;
|
|
265
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseFormControl, never, never, { "FocusSubject": "FocusSubject"; "SetValidationSubject": "SetValidationSubject"; "FieldAppearence": "FieldAppearence"; "FormLayout": "FormLayout"; "EmitPendingChanges": "EmitPendingChanges"; "Validation": "Validation"; "Frozen": "Frozen"; "Placeholder": "Placeholder"; "FormGroupClass": "FormGroupClass"; "FailedValidationMessage": "FailedValidationMessage"; "ForcedError": "ForcedError"; "Label": "Label"; "LabelColWidth": "LabelColWidth"; "InputColWidth": "InputColWidth"; "Last": "Last"; "Form": "Form"; "Source": "Source"; "IdField": "IdField"; "FloatingLabel": "FloatingLabel"; "DisplayMode": "DisplayMode"; "DisplayCondition": "DisplayCondition"; "DisplayModeTemplate": "DisplayModeTemplate"; "DisplayLayout": "DisplayLayout"; "InlineSeparator": "InlineSeparator"; "Display": "Display"; "Readonly": "Readonly"; "LabelInputRatio": "LabelInputRatio"; }, { "inputChange": "inputChange"; "inputFocus": "inputFocus"; "inputFinalized": "inputFinalized"; }, never, never, false, never>;
|
|
275
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseFormControl, never, never, { "FocusSubject": { "alias": "FocusSubject"; "required": false; }; "SetValidationSubject": { "alias": "SetValidationSubject"; "required": false; }; "FieldAppearence": { "alias": "FieldAppearence"; "required": false; }; "FormLayout": { "alias": "FormLayout"; "required": false; }; "EmitPendingChanges": { "alias": "EmitPendingChanges"; "required": false; }; "Validation": { "alias": "Validation"; "required": false; }; "Frozen": { "alias": "Frozen"; "required": false; }; "Placeholder": { "alias": "Placeholder"; "required": false; }; "FormGroupClass": { "alias": "FormGroupClass"; "required": false; }; "FailedValidationMessage": { "alias": "FailedValidationMessage"; "required": false; }; "ForcedError": { "alias": "ForcedError"; "required": false; }; "Label": { "alias": "Label"; "required": false; }; "LabelColWidth": { "alias": "LabelColWidth"; "required": false; }; "InputColWidth": { "alias": "InputColWidth"; "required": false; }; "Last": { "alias": "Last"; "required": false; }; "Form": { "alias": "Form"; "required": false; }; "Source": { "alias": "Source"; "required": false; }; "IdField": { "alias": "IdField"; "required": false; }; "FloatingLabel": { "alias": "FloatingLabel"; "required": false; }; "DisplayMode": { "alias": "DisplayMode"; "required": false; }; "DisplayCondition": { "alias": "DisplayCondition"; "required": false; }; "DisplayModeTemplate": { "alias": "DisplayModeTemplate"; "required": false; }; "DisplayLayout": { "alias": "DisplayLayout"; "required": false; }; "InlineSeparator": { "alias": "InlineSeparator"; "required": false; }; "Type": { "alias": "Type"; "required": false; }; "Display": { "alias": "Display"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "minlength": { "alias": "minlength"; "required": false; }; "Readonly": { "alias": "Readonly"; "required": false; }; "LabelInputRatio": { "alias": "LabelInputRatio"; "required": false; }; }, { "inputChange": "inputChange"; "inputFocus": "inputFocus"; "inputFinalized": "inputFinalized"; }, never, never, false, never>;
|
|
266
276
|
}
|
|
@@ -122,5 +122,5 @@ export declare class FormAdaptiveComponent extends BaseFormControl implements Co
|
|
|
122
122
|
/** @ignore */
|
|
123
123
|
private throttla;
|
|
124
124
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormAdaptiveComponent, [null, null, null, null, null, { optional: true; self: true; }, { optional: true; }, null, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
125
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormAdaptiveComponent, "form-adaptive", never, { "Type": "Type"; "TypeMissingMessage": "TypeMissingMessage"; "Pattern": "Pattern"; "AdjustNumber": "AdjustNumber"; "AllowDownload": "AllowDownload"; "Precision": "Precision"; "Alignment": "Alignment"; "SearchFunction": "SearchFunction"; "MinChars": "MinChars"; "CaseSensitive": "CaseSensitive"; "Options": "Options"; }, {}, never, never, false, never>;
|
|
125
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormAdaptiveComponent, "form-adaptive", never, { "Type": { "alias": "Type"; "required": false; }; "TypeMissingMessage": { "alias": "TypeMissingMessage"; "required": false; }; "Pattern": { "alias": "Pattern"; "required": false; }; "AdjustNumber": { "alias": "AdjustNumber"; "required": false; }; "AllowDownload": { "alias": "AllowDownload"; "required": false; }; "Precision": { "alias": "Precision"; "required": false; }; "Alignment": { "alias": "Alignment"; "required": false; }; "SearchFunction": { "alias": "SearchFunction"; "required": false; }; "MinChars": { "alias": "MinChars"; "required": false; }; "CaseSensitive": { "alias": "CaseSensitive"; "required": false; }; "Options": { "alias": "Options"; "required": false; }; }, {}, never, never, false, never>;
|
|
126
126
|
}
|
|
@@ -80,5 +80,5 @@ export declare class FormAutocompleteComponent extends BaseFormControl implement
|
|
|
80
80
|
/** @ignore */
|
|
81
81
|
private throttla;
|
|
82
82
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormAutocompleteComponent, [null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
83
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormAutocompleteComponent, "form-autocomplete", never, { "SelectLabel": "SelectLabel"; "SearchFunctionContext": "SearchFunctionContext"; "SearchFunction": "SearchFunction"; "MinChars": "MinChars"; "HideChoicesOnSelection": "HideChoicesOnSelection"; "RequiredPlaceholder": "RequiredPlaceholder"; "CaseSensitive": "CaseSensitive"; "Multi": "Multi"; "MultiElementsThreshold": "MultiElementsThreshold"; "UnboundMode": "UnboundMode"; }, {}, never, never, false, never>;
|
|
83
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormAutocompleteComponent, "form-autocomplete", never, { "SelectLabel": { "alias": "SelectLabel"; "required": false; }; "SearchFunctionContext": { "alias": "SearchFunctionContext"; "required": false; }; "SearchFunction": { "alias": "SearchFunction"; "required": false; }; "MinChars": { "alias": "MinChars"; "required": false; }; "HideChoicesOnSelection": { "alias": "HideChoicesOnSelection"; "required": false; }; "RequiredPlaceholder": { "alias": "RequiredPlaceholder"; "required": false; }; "CaseSensitive": { "alias": "CaseSensitive"; "required": false; }; "Multi": { "alias": "Multi"; "required": false; }; "MultiElementsThreshold": { "alias": "MultiElementsThreshold"; "required": false; }; "UnboundMode": { "alias": "UnboundMode"; "required": false; }; }, {}, never, never, false, never>;
|
|
84
84
|
}
|
|
@@ -19,5 +19,5 @@ export declare class FormCheckboxComponent extends BaseFormControl implements Co
|
|
|
19
19
|
/** @ignore */
|
|
20
20
|
onNotNullValueSet(): void;
|
|
21
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormCheckboxComponent, [null, null, { optional: true; self: true; }, { optional: true; }, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
22
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormCheckboxComponent, "form-checkbox", never, { "SliderMode": "SliderMode"; }, {}, never, never, false, never>;
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormCheckboxComponent, "form-checkbox", never, { "SliderMode": { "alias": "SliderMode"; "required": false; }; }, {}, never, never, false, never>;
|
|
23
23
|
}
|
|
@@ -17,5 +17,5 @@ export declare class FormDateComponent extends BaseFormControl implements Contro
|
|
|
17
17
|
/** @ignore */
|
|
18
18
|
onNotNullValueSet(): void;
|
|
19
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormDateComponent, [null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
20
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormDateComponent, "form-date", never, { "JsDates": "JsDates"; }, {}, never, never, false, never>;
|
|
20
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormDateComponent, "form-date", never, { "JsDates": { "alias": "JsDates"; "required": false; }; }, {}, never, never, false, never>;
|
|
21
21
|
}
|
|
@@ -19,5 +19,5 @@ export declare class FormDateTimeComponent extends BaseFormControl implements Co
|
|
|
19
19
|
/** @ignore */
|
|
20
20
|
onNotNullValueSet(): void;
|
|
21
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormDateTimeComponent, [null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
22
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormDateTimeComponent, "form-datetime", never, { "JsDates": "JsDates"; }, {}, never, never, false, never>;
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormDateTimeComponent, "form-datetime", never, { "JsDates": { "alias": "JsDates"; "required": false; }; }, {}, never, never, false, never>;
|
|
23
23
|
}
|
|
@@ -11,5 +11,5 @@ export declare class FormEmptyComponent {
|
|
|
11
11
|
/** Valore placeholder da mostrare */
|
|
12
12
|
PlaceholderModel: string;
|
|
13
13
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormEmptyComponent, never>;
|
|
14
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormEmptyComponent, "form-empty", never, { "Last": "Last"; "FormGroupClass": "FormGroupClass"; }, {}, never, never, false, never>;
|
|
14
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormEmptyComponent, "form-empty", never, { "Last": { "alias": "Last"; "required": false; }; "FormGroupClass": { "alias": "FormGroupClass"; "required": false; }; }, {}, never, never, false, never>;
|
|
15
15
|
}
|
|
@@ -15,5 +15,5 @@ export declare class FormErrorComponent {
|
|
|
15
15
|
/** Permette di settare in una volta solo gli input LabelColWidth e InputColWidth, basta scriverlo con la sintassi "X Y" */
|
|
16
16
|
set LabelInputRatio(input: string);
|
|
17
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormErrorComponent, never>;
|
|
18
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormErrorComponent, "form-error", never, { "LabelColWidth": "LabelColWidth"; "InputColWidth": "InputColWidth"; "Last": "Last"; "FormGroupClass": "FormGroupClass"; "LabelInputRatio": "LabelInputRatio"; }, {}, never, ["*"], false, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormErrorComponent, "form-error", never, { "LabelColWidth": { "alias": "LabelColWidth"; "required": false; }; "InputColWidth": { "alias": "InputColWidth"; "required": false; }; "Last": { "alias": "Last"; "required": false; }; "FormGroupClass": { "alias": "FormGroupClass"; "required": false; }; "LabelInputRatio": { "alias": "LabelInputRatio"; "required": false; }; }, {}, never, ["*"], false, never>;
|
|
19
19
|
}
|
|
@@ -42,5 +42,5 @@ export declare class FormFileComponent extends BaseFormControl implements Contro
|
|
|
42
42
|
onFileDragOver(event: DragEvent): void;
|
|
43
43
|
onFileDropped(event: DragEvent): void;
|
|
44
44
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormFileComponent, [null, null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, null, { optional: true; }]>;
|
|
45
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormFileComponent, "form-file", never, { "Multiple": "Multiple"; "AllowDownload": "AllowDownload"; "MaxSize": "MaxSize"; "FancyMode": "FancyMode"; "ReadFile": "ReadFile"; }, {}, never, never, false, never>;
|
|
45
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormFileComponent, "form-file", never, { "Multiple": { "alias": "Multiple"; "required": false; }; "AllowDownload": { "alias": "AllowDownload"; "required": false; }; "MaxSize": { "alias": "MaxSize"; "required": false; }; "FancyMode": { "alias": "FancyMode"; "required": false; }; "ReadFile": { "alias": "ReadFile"; "required": false; }; }, {}, never, never, false, never>;
|
|
46
46
|
}
|
|
@@ -15,5 +15,5 @@ export declare class FormInfoComponent {
|
|
|
15
15
|
/** Permette di settare in una volta solo gli input LabelColWidth e InputColWidth, basta scriverlo con la sintassi "X Y" */
|
|
16
16
|
set LabelInputRatio(input: string);
|
|
17
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormInfoComponent, never>;
|
|
18
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormInfoComponent, "form-info", never, { "LabelColWidth": "LabelColWidth"; "InputColWidth": "InputColWidth"; "Last": "Last"; "FormGroupClass": "FormGroupClass"; "LabelInputRatio": "LabelInputRatio"; }, {}, never, ["*"], false, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormInfoComponent, "form-info", never, { "LabelColWidth": { "alias": "LabelColWidth"; "required": false; }; "InputColWidth": { "alias": "InputColWidth"; "required": false; }; "Last": { "alias": "Last"; "required": false; }; "FormGroupClass": { "alias": "FormGroupClass"; "required": false; }; "LabelInputRatio": { "alias": "LabelInputRatio"; "required": false; }; }, {}, never, ["*"], false, never>;
|
|
19
19
|
}
|
|
@@ -29,5 +29,5 @@ export declare class FormInputComponent extends BaseFormControl implements Contr
|
|
|
29
29
|
/** @ignore */
|
|
30
30
|
onNotNullValueSet(): void;
|
|
31
31
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormInputComponent, [null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
32
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormInputComponent, "form-input", never, { "Password": "Password"; }, { "onSuffixAction": "onSuffixAction"; "onPrefixAction": "onPrefixAction"; }, ["suffix", "prefix"], never, false, never>;
|
|
32
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormInputComponent, "form-input", never, { "Password": { "alias": "Password"; "required": false; }; }, { "onSuffixAction": "onSuffixAction"; "onPrefixAction": "onPrefixAction"; }, ["suffix", "prefix"], never, false, never>;
|
|
33
33
|
}
|
|
@@ -63,5 +63,5 @@ export declare class FormMultiSelectComponent extends BaseFormControl implements
|
|
|
63
63
|
/** @ignore Override per gestire input in uscita */
|
|
64
64
|
changed(): void;
|
|
65
65
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormMultiSelectComponent, [null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
66
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormMultiSelectComponent, "form-multiselect", never, { "SelectLabel": "SelectLabel"; "UseKeyValues": "UseKeyValues"; "UseCommaSeparatedList": "UseCommaSeparatedList"; "UseJsonList": "UseJsonList"; }, {}, never, never, false, never>;
|
|
66
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormMultiSelectComponent, "form-multiselect", never, { "SelectLabel": { "alias": "SelectLabel"; "required": false; }; "UseKeyValues": { "alias": "UseKeyValues"; "required": false; }; "UseCommaSeparatedList": { "alias": "UseCommaSeparatedList"; "required": false; }; "UseJsonList": { "alias": "UseJsonList"; "required": false; }; }, {}, never, never, false, never>;
|
|
67
67
|
}
|
|
@@ -39,5 +39,5 @@ export declare class FormSelectComponent extends BaseFormControl implements Cont
|
|
|
39
39
|
/** @ignore */
|
|
40
40
|
onNotNullValueSet(): void;
|
|
41
41
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormSelectComponent, [null, null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
42
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormSelectComponent, "form-select", never, { "SelectLabel": "SelectLabel"; "PlaceholderValue": "PlaceholderValue"; "RequiredPlaceholder": "RequiredPlaceholder"; "EmptyFieldValue": "EmptyFieldValue"; "ShowValidationSymbol": "ShowValidationSymbol"; "OptionTemplate": "OptionTemplate"; }, {}, never, never, false, never>;
|
|
42
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormSelectComponent, "form-select", never, { "SelectLabel": { "alias": "SelectLabel"; "required": false; }; "PlaceholderValue": { "alias": "PlaceholderValue"; "required": false; }; "RequiredPlaceholder": { "alias": "RequiredPlaceholder"; "required": false; }; "EmptyFieldValue": { "alias": "EmptyFieldValue"; "required": false; }; "ShowValidationSymbol": { "alias": "ShowValidationSymbol"; "required": false; }; "OptionTemplate": { "alias": "OptionTemplate"; "required": false; }; }, {}, never, never, false, never>;
|
|
43
43
|
}
|
|
@@ -34,5 +34,5 @@ export declare class FormTemplateComponent {
|
|
|
34
34
|
/** Permette di settare in una volta solo gli input LabelColWidth e InputColWidth, basta scriverlo con la sintassi "X Y" */
|
|
35
35
|
set LabelInputRatio(input: string);
|
|
36
36
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormTemplateComponent, never>;
|
|
37
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormTemplateComponent, "form-template", never, { "Required": "Required"; "Label": "Label"; "LabelClass": "LabelClass"; "FormLayout": "FormLayout"; "LabelColWidth": "LabelColWidth"; "InputColWidth": "InputColWidth"; "Last": "Last"; "FormGroupClass": "FormGroupClass"; "DisplayMode": "DisplayMode"; "DisplayModeTemplate": "DisplayModeTemplate"; "DisplayLayout": "DisplayLayout"; "DisplayCondition": "DisplayCondition"; "InlineSeparator": "InlineSeparator"; "LabelInputRatio": "LabelInputRatio"; }, {}, never, ["*"], false, never>;
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormTemplateComponent, "form-template", never, { "Required": { "alias": "Required"; "required": false; }; "Label": { "alias": "Label"; "required": false; }; "LabelClass": { "alias": "LabelClass"; "required": false; }; "FormLayout": { "alias": "FormLayout"; "required": false; }; "LabelColWidth": { "alias": "LabelColWidth"; "required": false; }; "InputColWidth": { "alias": "InputColWidth"; "required": false; }; "Last": { "alias": "Last"; "required": false; }; "FormGroupClass": { "alias": "FormGroupClass"; "required": false; }; "DisplayMode": { "alias": "DisplayMode"; "required": false; }; "DisplayModeTemplate": { "alias": "DisplayModeTemplate"; "required": false; }; "DisplayLayout": { "alias": "DisplayLayout"; "required": false; }; "DisplayCondition": { "alias": "DisplayCondition"; "required": false; }; "InlineSeparator": { "alias": "InlineSeparator"; "required": false; }; "LabelInputRatio": { "alias": "LabelInputRatio"; "required": false; }; }, {}, never, ["*"], false, never>;
|
|
38
38
|
}
|
|
@@ -14,5 +14,5 @@ export declare class FormTextareaComponent extends BaseFormControl implements Co
|
|
|
14
14
|
/** @ignore */
|
|
15
15
|
onNotNullValueSet(): void;
|
|
16
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormTextareaComponent, [null, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
17
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormTextareaComponent, "form-textarea", never, { "Rows": "Rows"; }, {}, never, never, false, never>;
|
|
17
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormTextareaComponent, "form-textarea", never, { "Rows": { "alias": "Rows"; "required": false; }; }, {}, never, never, false, never>;
|
|
18
18
|
}
|
|
@@ -36,5 +36,5 @@ export declare class FormTimeComponent extends BaseFormControl implements Contro
|
|
|
36
36
|
/** @ignore */
|
|
37
37
|
onNotNullValueSet(): void;
|
|
38
38
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormTimeComponent, [null, null, { optional: true; self: true; }, { optional: true; }, null, { optional: true; }, { optional: true; }]>;
|
|
39
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormTimeComponent, "form-time", never, { "ShowSpinners": "ShowSpinners"; "StepHour": "StepHour"; "StepMinute": "StepMinute"; "StepSecond": "StepSecond"; "ShowSeconds": "ShowSeconds"; "InOutFormat": "InOutFormat"; }, {}, never, never, false, never>;
|
|
39
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormTimeComponent, "form-time", never, { "ShowSpinners": { "alias": "ShowSpinners"; "required": false; }; "StepHour": { "alias": "StepHour"; "required": false; }; "StepMinute": { "alias": "StepMinute"; "required": false; }; "StepSecond": { "alias": "StepSecond"; "required": false; }; "ShowSeconds": { "alias": "ShowSeconds"; "required": false; }; "InOutFormat": { "alias": "InOutFormat"; "required": false; }; }, {}, never, never, false, never>;
|
|
40
40
|
}
|
|
@@ -215,5 +215,5 @@ export declare abstract class BaseValidation {
|
|
|
215
215
|
*/
|
|
216
216
|
deregisterFocusRequest(): void;
|
|
217
217
|
static ɵfac: i0.ɵɵFactoryDeclaration<BaseValidation, never>;
|
|
218
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseValidation, never, never, { "FocusSubject": "FocusSubject"; "SetValidationSubject": "SetValidationSubject"; "InferErrorMessages": "InferErrorMessages"; "FieldAppearence": "FieldAppearence"; "FloatingLabel": "FloatingLabel"; "validationFailed": "validationFailed"; "Readonly": "Readonly"; "widthPx": "widthPx"; "disabled": "disabled"; "placeholder": "placeholder"; "class": "class"; "style": "style"; "pattern": "pattern"; "noValidate": "noValidate"; "autocomplete": "autocomplete"; "id": "id"; "submitted": "submitted"; "forceInvalid": "forceInvalid"; }, { "inputChange": "inputChange"; "inputFocus": "inputFocus"; "inputFinalized": "inputFinalized"; }, never, never, false, never>;
|
|
218
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseValidation, never, never, { "FocusSubject": { "alias": "FocusSubject"; "required": false; }; "SetValidationSubject": { "alias": "SetValidationSubject"; "required": false; }; "InferErrorMessages": { "alias": "InferErrorMessages"; "required": false; }; "FieldAppearence": { "alias": "FieldAppearence"; "required": false; }; "FloatingLabel": { "alias": "FloatingLabel"; "required": false; }; "validationFailed": { "alias": "validationFailed"; "required": false; }; "Readonly": { "alias": "Readonly"; "required": false; }; "widthPx": { "alias": "widthPx"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "class": { "alias": "class"; "required": false; }; "style": { "alias": "style"; "required": false; }; "pattern": { "alias": "pattern"; "required": false; }; "noValidate": { "alias": "noValidate"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "id": { "alias": "id"; "required": false; }; "submitted": { "alias": "submitted"; "required": false; }; "forceInvalid": { "alias": "forceInvalid"; "required": false; }; }, { "inputChange": "inputChange"; "inputFocus": "inputFocus"; "inputFinalized": "inputFinalized"; }, never, never, false, never>;
|
|
219
219
|
}
|
|
@@ -20,5 +20,5 @@ export declare class CustomRequiredDirective implements Validator {
|
|
|
20
20
|
[key: string]: any;
|
|
21
21
|
};
|
|
22
22
|
static ɵfac: i0.ɵɵFactoryDeclaration<CustomRequiredDirective, never>;
|
|
23
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<CustomRequiredDirective, "[customRequired]", never, { "NullValues": "CustomNullValues"; "customRequired": "customRequired"; }, {}, never, never, false, never>;
|
|
23
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<CustomRequiredDirective, "[customRequired]", never, { "NullValues": { "alias": "CustomNullValues"; "required": false; }; "customRequired": { "alias": "customRequired"; "required": false; }; }, {}, never, never, false, never>;
|
|
24
24
|
}
|
|
@@ -54,5 +54,5 @@ export declare class ValidationAutocompleteComponent extends BaseValidation impl
|
|
|
54
54
|
/** @ignore */
|
|
55
55
|
registerOnTouched(fn: any): void;
|
|
56
56
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationAutocompleteComponent, [null, { optional: true; }, { optional: true; }, null, null]>;
|
|
57
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationAutocompleteComponent, "val-autocomplete", never, { "FilteredSource": "FilteredSource"; "value": "value"; "label": "label"; }, { "optionChange": "optionChange"; }, never, never, false, never>;
|
|
57
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationAutocompleteComponent, "val-autocomplete", never, { "FilteredSource": { "alias": "FilteredSource"; "required": false; }; "value": { "alias": "value"; "required": false; }; "label": { "alias": "label"; "required": false; }; }, { "optionChange": "optionChange"; }, never, never, false, never>;
|
|
58
58
|
}
|
package/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.d.ts
CHANGED
|
@@ -84,5 +84,5 @@ export declare class ValidationAutocompleteMultiComponent extends BaseValidation
|
|
|
84
84
|
description: string;
|
|
85
85
|
}): void;
|
|
86
86
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationAutocompleteMultiComponent, [null, { optional: true; }, { optional: true; }, null, null]>;
|
|
87
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationAutocompleteMultiComponent, "val-autocomplete-multi", never, { "ChipThreshold": "ChipThreshold"; "FilteredSource": "FilteredSource"; "UnboundMode": "UnboundMode"; "value": "value"; "label": "label"; "HideChoicesOnSelection": "HideChoicesOnSelection"; }, { "optionChange": "optionChange"; }, never, never, false, never>;
|
|
87
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationAutocompleteMultiComponent, "val-autocomplete-multi", never, { "ChipThreshold": { "alias": "ChipThreshold"; "required": false; }; "FilteredSource": { "alias": "FilteredSource"; "required": false; }; "UnboundMode": { "alias": "UnboundMode"; "required": false; }; "value": { "alias": "value"; "required": false; }; "label": { "alias": "label"; "required": false; }; "HideChoicesOnSelection": { "alias": "HideChoicesOnSelection"; "required": false; }; }, { "optionChange": "optionChange"; }, never, never, false, never>;
|
|
88
88
|
}
|
|
@@ -24,5 +24,5 @@ export declare class ValidationCurrencyComponent extends ValidationInputComponen
|
|
|
24
24
|
*/
|
|
25
25
|
ngOnDestroy(): void;
|
|
26
26
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationCurrencyComponent, [null, { optional: true; }, { optional: true; }, null, null]>;
|
|
27
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationCurrencyComponent, "val-currency", never, { "CurrencyOptions": "CurrencyOptions"; }, {}, never, never, false, never>;
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationCurrencyComponent, "val-currency", never, { "CurrencyOptions": { "alias": "CurrencyOptions"; "required": false; }; }, {}, never, never, false, never>;
|
|
28
28
|
}
|
|
@@ -75,5 +75,5 @@ export declare class ValidationDateComponent extends BaseValidation implements C
|
|
|
75
75
|
*/
|
|
76
76
|
registerOnTouched(fn: any): void;
|
|
77
77
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationDateComponent, [null, { optional: true; }, { optional: true; }, null, null, null]>;
|
|
78
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationDateComponent, "val-date", never, { "useJsDates": "useJsDates"; }, {}, never, never, false, never>;
|
|
78
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationDateComponent, "val-date", never, { "useJsDates": { "alias": "useJsDates"; "required": false; }; }, {}, never, never, false, never>;
|
|
79
79
|
}
|
|
@@ -105,5 +105,5 @@ export declare class ValidationDateTimeComponent extends BaseValidation implemen
|
|
|
105
105
|
*/
|
|
106
106
|
registerOnTouched(fn: any): void;
|
|
107
107
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationDateTimeComponent, [null, { optional: true; }, { optional: true; }, null, null, null]>;
|
|
108
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationDateTimeComponent, "val-datetime", never, { "useJsDates": "useJsDates"; }, {}, never, never, false, never>;
|
|
108
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationDateTimeComponent, "val-datetime", never, { "useJsDates": { "alias": "useJsDates"; "required": false; }; }, {}, never, never, false, never>;
|
|
109
109
|
}
|
|
@@ -61,7 +61,15 @@ export declare class ValidationInputComponent extends BaseValidation implements
|
|
|
61
61
|
/**
|
|
62
62
|
* Tipo del componente, può essere "text" o "password" e viene impostato automaticamente dall'Input **Password**
|
|
63
63
|
*/
|
|
64
|
-
|
|
64
|
+
Type: string;
|
|
65
|
+
/**
|
|
66
|
+
* Maxlength html
|
|
67
|
+
*/
|
|
68
|
+
maxlength: number;
|
|
69
|
+
/**
|
|
70
|
+
* Minlength html
|
|
71
|
+
*/
|
|
72
|
+
minlength: number;
|
|
65
73
|
/**
|
|
66
74
|
* Indicazione se il componente ha o meno un suffisso.
|
|
67
75
|
*
|
|
@@ -122,5 +130,5 @@ export declare class ValidationInputComponent extends BaseValidation implements
|
|
|
122
130
|
*/
|
|
123
131
|
registerOnTouched(fn: any): void;
|
|
124
132
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationInputComponent, [null, { optional: true; }, { optional: true; }, null, null]>;
|
|
125
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationInputComponent, "val-input", never, { "Frozen": "Frozen"; "Password": "Password"; "showWarning": "showWarning"; "warningTitle": "warningTitle"; "warningClass": "warningClass"; "value": "value"; }, {}, ["suffix_internal", "prefix_internal"], never, false, never>;
|
|
133
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationInputComponent, "val-input", never, { "Frozen": { "alias": "Frozen"; "required": false; }; "Password": { "alias": "Password"; "required": false; }; "showWarning": { "alias": "showWarning"; "required": false; }; "warningTitle": { "alias": "warningTitle"; "required": false; }; "warningClass": { "alias": "warningClass"; "required": false; }; "value": { "alias": "value"; "required": false; }; "Type": { "alias": "Type"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "minlength": { "alias": "minlength"; "required": false; }; }, {}, ["suffix_internal", "prefix_internal"], never, false, never>;
|
|
126
134
|
}
|
|
@@ -91,5 +91,5 @@ export declare class ValidationSelectComponent extends BaseValidation implements
|
|
|
91
91
|
*/
|
|
92
92
|
registerOnTouched(fn: any): void;
|
|
93
93
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationSelectComponent, [{ optional: true; }, { optional: true; }, null, null, null]>;
|
|
94
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationSelectComponent, "val-select", never, { "emptyFieldValue": "emptyFieldValue"; "placeHolderValue": "placeHolderValue"; "emptyValue": "emptyValue"; "showValidationSymbol": "showValidationSymbol"; "label": "label"; }, { "onBlur": "onBlur"; }, never, ["*"], false, never>;
|
|
94
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationSelectComponent, "val-select", never, { "emptyFieldValue": { "alias": "emptyFieldValue"; "required": false; }; "placeHolderValue": { "alias": "placeHolderValue"; "required": false; }; "emptyValue": { "alias": "emptyValue"; "required": false; }; "showValidationSymbol": { "alias": "showValidationSymbol"; "required": false; }; "label": { "alias": "label"; "required": false; }; }, { "onBlur": "onBlur"; }, never, ["*"], false, never>;
|
|
95
95
|
}
|
|
@@ -24,5 +24,5 @@ export declare class ValidationTextAreaComponent extends ValidationInputComponen
|
|
|
24
24
|
*/
|
|
25
25
|
ngOnDestroy(): void;
|
|
26
26
|
static ɵfac: i0.ɵɵFactoryDeclaration<ValidationTextAreaComponent, [null, { optional: true; }, { optional: true; }, null, null]>;
|
|
27
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationTextAreaComponent, "val-textarea", never, { "rows": "rows"; }, {}, never, never, false, never>;
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ValidationTextAreaComponent, "val-textarea", never, { "rows": { "alias": "rows"; "required": false; }; }, {}, never, never, false, never>;
|
|
28
28
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@esfaenza/forms-and-validations",
|
|
3
|
-
"version": "15.2.
|
|
3
|
+
"version": "15.2.59",
|
|
4
4
|
"private": false,
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"tslib": "^2.0.0"
|
|
@@ -22,11 +22,7 @@
|
|
|
22
22
|
"dayjs": "1.11.8",
|
|
23
23
|
"sweetalert2": "11.7.12"
|
|
24
24
|
},
|
|
25
|
-
"module": "
|
|
26
|
-
"es2020": "fesm2020/esfaenza-forms-and-validations.mjs",
|
|
27
|
-
"esm2020": "esm2020/esfaenza-forms-and-validations.mjs",
|
|
28
|
-
"fesm2020": "fesm2020/esfaenza-forms-and-validations.mjs",
|
|
29
|
-
"fesm2015": "fesm2015/esfaenza-forms-and-validations.mjs",
|
|
25
|
+
"module": "fesm2022/esfaenza-forms-and-validations.mjs",
|
|
30
26
|
"typings": "index.d.ts",
|
|
31
27
|
"exports": {
|
|
32
28
|
"./package.json": {
|
|
@@ -34,11 +30,9 @@
|
|
|
34
30
|
},
|
|
35
31
|
".": {
|
|
36
32
|
"types": "./index.d.ts",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"node": "./fesm2015/esfaenza-forms-and-validations.mjs",
|
|
41
|
-
"default": "./fesm2020/esfaenza-forms-and-validations.mjs"
|
|
33
|
+
"esm2022": "./esm2022/esfaenza-forms-and-validations.mjs",
|
|
34
|
+
"esm": "./esm2022/esfaenza-forms-and-validations.mjs",
|
|
35
|
+
"default": "./fesm2022/esfaenza-forms-and-validations.mjs"
|
|
42
36
|
}
|
|
43
37
|
},
|
|
44
38
|
"sideEffects": false
|
package/esm2020/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
|
|
3
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, 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 "ngx-bootstrap/tooltip";
|
|
16
|
-
import * as i7 from "@angular/material/legacy-autocomplete";
|
|
17
|
-
import * as i8 from "@angular/material/legacy-core";
|
|
18
|
-
/**
|
|
19
|
-
* Componente di validaizone per gli input di Autocompletamento
|
|
20
|
-
*/
|
|
21
|
-
export class ValidationAutocompleteComponent extends BaseValidation {
|
|
22
|
-
/** @ignore */
|
|
23
|
-
constructor(cdr, _validators, _asyncValidators, injector, lc) {
|
|
24
|
-
super(cdr);
|
|
25
|
-
this._validators = _validators;
|
|
26
|
-
this._asyncValidators = _asyncValidators;
|
|
27
|
-
this.injector = injector;
|
|
28
|
-
this.lc = lc;
|
|
29
|
-
/** Sorgente da cui scegliere valori filtrata in base a quello che ha scritto l'utente */
|
|
30
|
-
this.FilteredSource = [];
|
|
31
|
-
/** Contenuto della label Floattante Material-Style */
|
|
32
|
-
this.label = "";
|
|
33
|
-
/** Evento che indica l'opzione selezionata dal componente. Il valore finale della selezione dovrà essere questo */
|
|
34
|
-
this.optionChange = new EventEmitter();
|
|
35
|
-
/** @ignore */
|
|
36
|
-
this.onTouched = () => { }; //placeholder on touched function
|
|
37
|
-
}
|
|
38
|
-
/** @ignore */
|
|
39
|
-
ngOnInit() {
|
|
40
|
-
super.ngOnInit();
|
|
41
|
-
this.registerFocusRequest();
|
|
42
|
-
this.checkRequiredness(this._validators);
|
|
43
|
-
}
|
|
44
|
-
/** @ignore */
|
|
45
|
-
ngOnDestroy() {
|
|
46
|
-
super.ngOnDestroy();
|
|
47
|
-
this.deregisterFocusRequest();
|
|
48
|
-
if (this.tooltipSubscription)
|
|
49
|
-
this.tooltipSubscription.unsubscribe();
|
|
50
|
-
}
|
|
51
|
-
/** @ignore */
|
|
52
|
-
ngAfterViewInit() {
|
|
53
|
-
this.postBinding();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Metodo che si occupa di collegare i validatori e la funzione di reset dal **ControlValueAccessor** rappresentato
|
|
57
|
-
* da questo componente al **ControlValueAccessor** rappresentato dall'effettivo elemento di Input presente lato HTML
|
|
58
|
-
*/
|
|
59
|
-
postBinding() {
|
|
60
|
-
this.CheckValidity();
|
|
61
|
-
const ngControl = this.injector.get(NgControl, null);
|
|
62
|
-
if (ngControl) {
|
|
63
|
-
this.parentControl = ngControl.control;
|
|
64
|
-
//se la variabile novalidate è true, elimino tutti i validatori eventualmente inseriti
|
|
65
|
-
if (this.noValidate) {
|
|
66
|
-
this.parentControl.clearValidators();
|
|
67
|
-
this.parentControl.clearAsyncValidators();
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
this.baseInput.control.setAsyncValidators(this._asyncValidators);
|
|
71
|
-
this.baseInput.control.setValidators(this._validators);
|
|
72
|
-
}
|
|
73
|
-
//faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
|
|
74
|
-
const origFunc = this.parentControl.reset;
|
|
75
|
-
this.parentControl.reset = () => {
|
|
76
|
-
origFunc.apply(this.parentControl);
|
|
77
|
-
this.baseInput.control.reset();
|
|
78
|
-
this.tooltip.hide();
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/** @ignore */
|
|
83
|
-
writeValue(value) {
|
|
84
|
-
var val = value && this.FilteredSource ? this.FilteredSource.find(t => t.id == value) : null;
|
|
85
|
-
if (val)
|
|
86
|
-
this.optionChange.emit(val.id);
|
|
87
|
-
this.propagateChange(val ? val.id : value);
|
|
88
|
-
this.value = val ? val.description : value;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* L'emit della modifica al valore viene gestito su un evento custom (**inputChange**) come workaround al malfunzionamento dell'**ngModelChange** nativo
|
|
92
|
-
*
|
|
93
|
-
* @param {any} toEmit valore da propagare all'esterno
|
|
94
|
-
*/
|
|
95
|
-
onModelChange(toEmit) {
|
|
96
|
-
this.writeValue(toEmit);
|
|
97
|
-
this.inputChange.emit(toEmit);
|
|
98
|
-
this.onTouched();
|
|
99
|
-
}
|
|
100
|
-
/** @ignore */
|
|
101
|
-
registerOnChange(fn) {
|
|
102
|
-
this.propagateChange = fn;
|
|
103
|
-
}
|
|
104
|
-
/** @ignore */
|
|
105
|
-
registerOnTouched(fn) {
|
|
106
|
-
this.onTouched = fn;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
ValidationAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ValidationAutocompleteComponent, 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 });
|
|
110
|
-
ValidationAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ValidationAutocompleteComponent, selector: "val-autocomplete", inputs: { FilteredSource: "FilteredSource", value: "value", label: "label" }, outputs: { optionChange: "optionChange" }, providers: [
|
|
111
|
-
{ provide: LocalizationService, useClass: BaseValidationLoc },
|
|
112
|
-
{
|
|
113
|
-
provide: NG_VALUE_ACCESSOR,
|
|
114
|
-
useExisting: forwardRef(() => ValidationAutocompleteComponent),
|
|
115
|
-
multi: true
|
|
116
|
-
}
|
|
117
|
-
], usesInheritance: true, ngImport: i0, template: "<!-- Val-Model: {{value}} -->\r\n<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 <input matInput\r\n #htmlInput\r\n #baseInput='ngModel'\r\n type=\"text\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n placeholder=\"{{placeholder}}\"\r\n [matAutocomplete]=\"auto\"\r\n name=\"val-input\"\r\n id=\"{{id}}\"\r\n class=\"form-control {{class}}\"\r\n [(ngModel)]=\"value\"\r\n [class.checking-field]=\"!noValidate\"\r\n [tooltip]=\"tolTemplate\"\r\n [disabled]=\"Readonly || disabled\"\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 <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of FilteredSource\" [value]=\"option.id\">\r\n {{option.description}}\r\n </mat-option>\r\n </mat-autocomplete>\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.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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"] }, { kind: "component", type: i7.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i7.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
118
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ValidationAutocompleteComponent, decorators: [{
|
|
119
|
-
type: Component,
|
|
120
|
-
args: [{ selector: "val-autocomplete", changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
121
|
-
{ provide: LocalizationService, useClass: BaseValidationLoc },
|
|
122
|
-
{
|
|
123
|
-
provide: NG_VALUE_ACCESSOR,
|
|
124
|
-
useExisting: forwardRef(() => ValidationAutocompleteComponent),
|
|
125
|
-
multi: true
|
|
126
|
-
}
|
|
127
|
-
], encapsulation: ViewEncapsulation.None, template: "<!-- Val-Model: {{value}} -->\r\n<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 <input matInput\r\n #htmlInput\r\n #baseInput='ngModel'\r\n type=\"text\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n placeholder=\"{{placeholder}}\"\r\n [matAutocomplete]=\"auto\"\r\n name=\"val-input\"\r\n id=\"{{id}}\"\r\n class=\"form-control {{class}}\"\r\n [(ngModel)]=\"value\"\r\n [class.checking-field]=\"!noValidate\"\r\n [tooltip]=\"tolTemplate\"\r\n [disabled]=\"Readonly || disabled\"\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 <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of FilteredSource\" [value]=\"option.id\">\r\n {{option.description}}\r\n </mat-option>\r\n </mat-autocomplete>\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"] }]
|
|
128
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: Array, decorators: [{
|
|
129
|
-
type: Optional
|
|
130
|
-
}, {
|
|
131
|
-
type: Inject,
|
|
132
|
-
args: [NG_VALIDATORS]
|
|
133
|
-
}] }, { type: Array, decorators: [{
|
|
134
|
-
type: Optional
|
|
135
|
-
}, {
|
|
136
|
-
type: Inject,
|
|
137
|
-
args: [NG_ASYNC_VALIDATORS]
|
|
138
|
-
}] }, { type: i0.Injector }, { type: i1.LocalizationService }]; }, propDecorators: { FilteredSource: [{
|
|
139
|
-
type: Input
|
|
140
|
-
}], value: [{
|
|
141
|
-
type: Input
|
|
142
|
-
}], label: [{
|
|
143
|
-
type: Input
|
|
144
|
-
}], optionChange: [{
|
|
145
|
-
type: Output
|
|
146
|
-
}] } });
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1hdXRvY29tcGxldGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1hdXRvY29tcGxldGUvdmFsaWRhdGlvbi1hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1hdXRvY29tcGxldGUvdmFsaWRhdGlvbi1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBNEMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvSixPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBWSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxTCxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7OztBQUczRDs7R0FFRztBQWdCSCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsY0FBYztJQXFCL0QsY0FBYztJQUNkLFlBQVksR0FBc0IsRUFBNkMsV0FBdUIsRUFBbUQsZ0JBQTRCLEVBQVUsUUFBa0IsRUFBWSxFQUF1QjtRQUNoUCxLQUFLLENBQUMsR0FBRyxD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Q0FBQzs0QkFDOUQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osaUJBQ2MsaUJBQWlCLENBQUMsSUFBSTs7MEJBeUJBLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsYUFBYTs7MEJBQW9DLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1CO3FHQWxCdEksY0FBYztzQkFBdEIsS0FBSztnQkFHVSxLQUFLO3NCQUFwQixLQUFLO2dCQUdVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFVudHlwZWRGb3JtQ29udHJvbCwgTkdfQVNZTkNfVkFMSURBVE9SUywgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5cclxuLy8gRGlyZXR0aXZlLCBDb21wb25lbnRpLCBMaWJyZXJpZVxyXG5pbXBvcnQgeyBCYXNlVmFsaWRhdGlvbiB9IGZyb20gXCIuLi9iYXNlLXZhbGlkYXRpb25cIjtcclxuaW1wb3J0IHsgQmFzZVZhbGlkYXRpb25Mb2MgfSBmcm9tICcuLi9iYXNlLXZhbGlkYXRpb24ubG9jJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGRpIHZhbGlkYWl6b25lIHBlciBnbGkgaW5wdXQgZGkgQXV0b2NvbXBsZXRhbWVudG9cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwidmFsLWF1dG9jb21wbGV0ZVwiLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwidmFsaWRhdGlvbi1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWxcIixcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogQmFzZVZhbGlkYXRpb25Mb2MgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBWYWxpZGF0aW9uQXV0b2NvbXBsZXRlQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHN0eWxlVXJsczogW1wiLi4vdmFsaWRhdGlvbi1zdHlsZS5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uQXV0b2NvbXBsZXRlQ29tcG9uZW50IGV4dGVuZHMgQmFzZVZhbGlkYXRpb24gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG5cclxuICAgIC8qKiBTb3JnZW50ZSBkYSBjdWkgc2NlZ2xpZXJlIHZhbG9yaSBmaWx0cmF0YSBpbiBiYXNlIGEgcXVlbGxvIGNoZSBoYSBzY3JpdHRvIGwndXRlbnRlICovXHJcbiAgICBASW5wdXQoKSBGaWx0ZXJlZFNvdXJjZTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBWYWxvcmUgZGVsIG1vZGVsbG8gKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZTogYW55O1xyXG5cclxuICAgIC8qKiBDb250ZW51dG8gZGVsbGEgbGFiZWwgRmxvYXR0YW50ZSBNYXRlcmlhbC1TdHlsZSAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGluZGljYSBsJ29wemlvbmUgc2VsZXppb25hdGEgZGFsIGNvbXBvbmVudGUuIElsIHZhbG9yZSBmaW5hbGUgZGVsbGEgc2VsZXppb25lIGRvdnLDoCBlc3NlcmUgcXVlc3RvICovXHJcbiAgICBAT3V0cHV0KCkgb3B0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIC8qKiBTdWJzY3JpcHRpb24gZGVsIHRvb3RsdGlwIGRhIHJpcHVsaXJlIGFsbGEgZGlzdHJ1emlvbmUgZGVsIGNvbXBvbmVudGUgKi9cclxuICAgIHByaXZhdGUgdG9vbHRpcFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKiBDb250cm9sbG8gZXNwb3N0byBvdHRlbnV0byB0cmFtaXRlIGluamVjdG9yICovXHJcbiAgICBwcml2YXRlIHBhcmVudENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgQE9wdGlvbmFsKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogQXJyYXk8YW55PiwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByb3RlY3RlZCBsYzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNkcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvY3VzUmVxdWVzdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRuZXNzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZGVyZWdpc3RlckZvY3VzUmVxdWVzdCgpO1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTdWJzY3JpcHRpb24pIHRoaXMudG9vbHRpcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5wb3N0QmluZGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY29sbGVnYXJlIGkgdmFsaWRhdG9yaSBlIGxhIGZ1bnppb25lIGRpIHJlc2V0IGRhbCAqKkNvbnRyb2xWYWx1ZUFjY2Vzc29yKiogcmFwcHJlc2VudGF0byBcclxuICAgICAqIGRhIHF1ZXN0byBjb21wb25lbnRlIGFsICoqQ29udHJvbFZhbHVlQWNjZXNzb3IqKiByYXBwcmVzZW50YXRvIGRhbGwnZWZmZXR0aXZvIGVsZW1lbnRvIGRpIElucHV0IHByZXNlbnRlIGxhdG8gSFRNTFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCaW5kaW5nKCkge1xyXG4gICAgICAgIHRoaXMuQ2hlY2tWYWxpZGl0eSgpO1xyXG4gICAgICAgIGNvbnN0IG5nQ29udHJvbDogTmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcclxuICAgICAgICBpZiAobmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAgICAgICAgIC8vc2UgbGEgdmFyaWFiaWxlIG5vdmFsaWRhdGUgw6ggdHJ1ZSwgZWxpbWlubyB0dXR0aSBpIHZhbGlkYXRvcmkgZXZlbnR1YWxtZW50ZSBpbnNlcml0aVxyXG4gICAgICAgICAgICBpZiAodGhpcy5ub1ZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUlucHV0LmNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMuX2FzeW5jVmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSB0aGlzLnBhcmVudENvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5yZXNldCA9ICgpID0+IHsgLy9mYWNjaW8gaW4gbW9kbyBjaGUgc2UgY2hpYW1vIGlsIHJlc2V0IGRlbCBjb250cm9sbG8gKG8gZGVsbGEgZm9ybSkgZGFsbCdlc3Rlcm5vIHNpIHJlc2V0dGkgYW5jaGUgaWwgY29udHJvbGxvIG5hdGl2b1xyXG4gICAgICAgICAgICAgICAgb3JpZ0Z1bmMuYXBwbHkodGhpcy5wYXJlbnRDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUlucHV0LmNvbnRyb2wucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHsgfTsgLy9wbGFjZWhvbGRlciBvbiB0b3VjaGVkIGZ1bmN0aW9uXHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHZhciB2YWwgPSB2YWx1ZSAmJiB0aGlzLkZpbHRlcmVkU291cmNlID8gdGhpcy5GaWx0ZXJlZFNvdXJjZS5maW5kKHQgPT4gdC5pZCA9PSB2YWx1ZSkgOiBudWxsO1xyXG4gICAgICAgIGlmKHZhbCkgdGhpcy5vcHRpb25DaGFuZ2UuZW1pdCh2YWwuaWQpO1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHZhbCA/IHZhbC5pZCA6IHZhbHVlKTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsID8gdmFsLmRlc2NyaXB0aW9uIDogdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMJ2VtaXQgZGVsbGEgbW9kaWZpY2EgYWwgdmFsb3JlIHZpZW5lIGdlc3RpdG8gc3UgdW4gZXZlbnRvIGN1c3RvbSAoKippbnB1dENoYW5nZSoqKSBjb21lIHdvcmthcm91bmQgYWwgbWFsZnVuemlvbmFtZW50byBkZWxsJyoqbmdNb2RlbENoYW5nZSoqIG5hdGl2b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdG9FbWl0IHZhbG9yZSBkYSBwcm9wYWdhcmUgYWxsJ2VzdGVybm9cclxuICAgICAqL1xyXG4gICAgb25Nb2RlbENoYW5nZSh0b0VtaXQpIHtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodG9FbWl0KTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQodG9FbWl0KTtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxufSIsIjwhLS0gVmFsLU1vZGVsOiB7e3ZhbHVlfX0gLS0+XHJcbjxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwie3tGaWVsZEFwcGVhcmVuY2V9fVwiIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGggbWF0LW5vLWJvcmRlci10b3AgbWF0LWhlaWdodC1maXhlZFwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFB4XCI+XHJcbiAgICA8bWF0LWxhYmVsICpuZ0lmPVwibGFiZWxcIj57e2xhYmVsfX08L21hdC1sYWJlbD5cclxuICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICNodG1sSW5wdXRcclxuICAgICAgICAgICAjYmFzZUlucHV0PSduZ01vZGVsJ1xyXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICB0cmlnZ2Vycz1cIlwiXHJcbiAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcclxuICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICBuYW1lPVwidmFsLWlucHV0XCJcclxuICAgICAgICAgICBpZD1cInt7aWR9fVwiXHJcbiAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wge3tjbGFzc319XCJcclxuICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcclxuICAgICAgICAgICBbY2xhc3MuY2hlY2tpbmctZmllbGRdPVwiIW5vVmFsaWRhdGVcIlxyXG4gICAgICAgICAgIFt0b29sdGlwXT1cInRvbFRlbXBsYXRlXCJcclxuICAgICAgICAgICBbZGlzYWJsZWRdPVwiUmVhZG9ubHkgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgKGZvY3VzKT1cImNoZWNrVG9vbHRpcCgpO1wiXHJcbiAgICAgICAgICAgKGtleXVwKT1cIigkZXZlbnQua2V5Q29kZSA9PSAxMyB8fCAkZXZlbnQua2V5Q29kZSA9PSAyNykgJiYgb25GaW5hbGl6ZSgpO1wiXHJcbiAgICAgICAgICAgKGJsdXIpPVwiY2xvc2VUb29sdGlwKCk7IG9uRmluYWxpemUoKTtcIj5cclxuXHJcbiAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIEZpbHRlcmVkU291cmNlXCIgW3ZhbHVlXT1cIm9wdGlvbi5pZFwiPlxyXG4gICAgICAgICAgICB7e29wdGlvbi5kZXNjcmlwdGlvbn19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG48L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0b2xUZW1wbGF0ZT5cclxuICAgIDxkaXYgKGNsaWNrKT1cImNsb3NlVG9vbHRpcCgpXCI+XHJcbiAgICAgICAgPHNwYW4+e3t2YWxpZGF0aW9uRmFpbGVkQmluZH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|