@esfaenza/parameters 20.3.28 → 20.3.29
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.
|
@@ -24,6 +24,7 @@ class EsParametersLoc extends LocalizationService {
|
|
|
24
24
|
super(injector);
|
|
25
25
|
super.set("it->en", "Seleziona", ["Select"]);
|
|
26
26
|
super.set("it->en", "Aggiungi", ["Add"]);
|
|
27
|
+
super.set("it->en", "Rimuovi", ["Remove"]);
|
|
27
28
|
}
|
|
28
29
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.28", ngImport: i0, type: EsParametersLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
29
30
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.28", ngImport: i0, type: EsParametersLoc }); }
|
|
@@ -119,8 +120,18 @@ class EsParametersComponent {
|
|
|
119
120
|
this.dates = dates;
|
|
120
121
|
/** Indica se si lavora a singolo parametro forzato dentro un array for the glory of satan */
|
|
121
122
|
this.SingleParameterMode = false;
|
|
122
|
-
/** Mappa tipo parametro -> TemplateRef custom
|
|
123
|
+
/** Mappa tipo parametro -> TemplateRef custom registrati localmente tramite direttiva */
|
|
123
124
|
this.CustomTemplates = {};
|
|
125
|
+
/**
|
|
126
|
+
* Template custom ereditati da un **es-parameters** genitore (es. istanze di un repeater),
|
|
127
|
+
* così i template registrati sul componente esterno sono disponibili anche nei componenti annidati
|
|
128
|
+
*/
|
|
129
|
+
this.ParentCustomTemplates = {};
|
|
130
|
+
/**
|
|
131
|
+
* Unione dei template custom locali (**CustomTemplates**) e di quelli ereditati (**ParentCustomTemplates**).
|
|
132
|
+
* È la mappa effettivamente usata per il lookup e propagata ai componenti annidati.
|
|
133
|
+
*/
|
|
134
|
+
this.MergedCustomTemplates = {};
|
|
124
135
|
/**
|
|
125
136
|
* Pipeline di Angular
|
|
126
137
|
*
|
|
@@ -203,15 +214,34 @@ class EsParametersComponent {
|
|
|
203
214
|
else
|
|
204
215
|
this.CustomTemplates[dir.parameterType] = dir.templateRef;
|
|
205
216
|
});
|
|
217
|
+
this.mergeCustomTemplates();
|
|
206
218
|
}
|
|
207
219
|
/**
|
|
208
|
-
*
|
|
220
|
+
* Ricalcola **MergedCustomTemplates** come unione di quelli ereditati e di quelli locali
|
|
221
|
+
* (i locali hanno la precedenza)
|
|
222
|
+
*
|
|
223
|
+
* @ignore
|
|
224
|
+
*/
|
|
225
|
+
mergeCustomTemplates() {
|
|
226
|
+
this.MergedCustomTemplates = { ...(this.ParentCustomTemplates ?? {}), ...this.CustomTemplates };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Pipeline di Angular: ricalcola i template ereditati quando cambiano dall'esterno (es. componenti annidati)
|
|
230
|
+
*
|
|
231
|
+
* @ignore
|
|
232
|
+
*/
|
|
233
|
+
ngOnChanges(changes) {
|
|
234
|
+
if (changes["ParentCustomTemplates"])
|
|
235
|
+
this.mergeCustomTemplates();
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Restituisce il template custom (locale o ereditato) registrato per un determinato tipo di parametro, se presente
|
|
209
239
|
*
|
|
210
240
|
* @param {string} type Tipo del parametro (**GenericParameter.type**)
|
|
211
241
|
* @returns Il **TemplateRef** custom associato, oppure **null** se non ne esiste uno
|
|
212
242
|
*/
|
|
213
243
|
getCustomTemplate(type) {
|
|
214
|
-
return this.
|
|
244
|
+
return this.MergedCustomTemplates[type] ?? null;
|
|
215
245
|
}
|
|
216
246
|
/**
|
|
217
247
|
* Aggiunge una nuova istanza ad un parametro di tipo **repeater**, clonandola dal prototipo **subparameters**
|
|
@@ -243,18 +273,18 @@ class EsParametersComponent {
|
|
|
243
273
|
return par.canadd !== false;
|
|
244
274
|
}
|
|
245
275
|
/**
|
|
246
|
-
* Indica se è possibile rimuovere
|
|
247
|
-
*
|
|
276
|
+
* Indica se è possibile rimuovere le istanze di un parametro repeater (**candelete** true se non esplicitamente false).
|
|
277
|
+
* L'eventuale obbligatorietà (**required**) è demandata alla validazione del form, non al blocco della rimozione.
|
|
248
278
|
*/
|
|
249
279
|
canDeleteRepeaterItem(par) {
|
|
250
|
-
return par.candelete !== false
|
|
280
|
+
return par.candelete !== false;
|
|
251
281
|
}
|
|
252
282
|
/**
|
|
253
283
|
* Reidrata il valore di un parametro **repeater** dalla sua forma "wire" (stringa JSON values-only)
|
|
254
284
|
* al modello interno **GenericParameter[][]**, clonando il prototipo **subparameters** per ogni istanza.
|
|
255
285
|
*
|
|
256
286
|
* Regole:
|
|
257
|
-
* - null / undefined / stringa vuota:
|
|
287
|
+
* - null / undefined / stringa vuota: nessuna istanza (parte vuoto, l'utente aggiunge con "Aggiungi")
|
|
258
288
|
* - stringa JSON: parse in una lista di mappe id-valore (una per istanza)
|
|
259
289
|
* - **GenericParameter[][]** già interno (writeValue rientrante): lasciato invariato
|
|
260
290
|
*
|
|
@@ -266,14 +296,12 @@ class EsParametersComponent {
|
|
|
266
296
|
return par.value;
|
|
267
297
|
let valueMaps;
|
|
268
298
|
if (par.value == null || par.value === "")
|
|
269
|
-
valueMaps =
|
|
299
|
+
valueMaps = []; // parte senza istanze
|
|
270
300
|
else if (typeof par.value === "string")
|
|
271
301
|
valueMaps = JSON.parse(par.value);
|
|
272
302
|
else
|
|
273
303
|
valueMaps = par.value; // già lista di mappe id->valore
|
|
274
|
-
|
|
275
|
-
return par.subparameters ? [this.hydrateRepeaterInstance(par, null)] : [];
|
|
276
|
-
return valueMaps.map(vm => this.hydrateRepeaterInstance(par, vm));
|
|
304
|
+
return (valueMaps ?? []).map(vm => this.hydrateRepeaterInstance(par, vm));
|
|
277
305
|
}
|
|
278
306
|
/**
|
|
279
307
|
* Costruisce una singola istanza di repeater clonando **subparameters** e applicando i valori dalla mappa id->valore
|
|
@@ -607,14 +635,14 @@ class EsParametersComponent {
|
|
|
607
635
|
this.inputFinalized.emit(parameter);
|
|
608
636
|
}
|
|
609
637
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.28", ngImport: i0, type: EsParametersComponent, deps: [{ token: i1.UtilityService }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i1.DateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
610
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.28", type: EsParametersComponent, isStandalone: false, selector: "es-parameters", inputs: { BooleanSliderMode: "BooleanSliderMode", DisplayMode: "DisplayMode", HideEmpty: "HideEmpty", LastParameterNoMargin: "LastParameterNoMargin", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", submitted: "submitted", EmptyMessage: "EmptyMessage", Removal: "Removal", Readonly: "Readonly", ListFormat: "ListFormat", Form: "Form", AutocompleteHideChoicesOnSelection: "AutocompleteHideChoicesOnSelection", AutoCompleteDataRetrieve: "AutoCompleteDataRetrieve", MultiselectMode: "MultiselectMode", LabelInputRatio: "LabelInputRatio" }, outputs: { inputFinalized: "inputFinalized" }, providers: [
|
|
638
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.28", type: EsParametersComponent, isStandalone: false, selector: "es-parameters", inputs: { ParentCustomTemplates: "ParentCustomTemplates", BooleanSliderMode: "BooleanSliderMode", DisplayMode: "DisplayMode", HideEmpty: "HideEmpty", LastParameterNoMargin: "LastParameterNoMargin", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", submitted: "submitted", EmptyMessage: "EmptyMessage", Removal: "Removal", Readonly: "Readonly", ListFormat: "ListFormat", Form: "Form", AutocompleteHideChoicesOnSelection: "AutocompleteHideChoicesOnSelection", AutoCompleteDataRetrieve: "AutoCompleteDataRetrieve", MultiselectMode: "MultiselectMode", LabelInputRatio: "LabelInputRatio" }, outputs: { inputFinalized: "inputFinalized" }, providers: [
|
|
611
639
|
{ provide: LocalizationService, useClass: EsParametersLoc },
|
|
612
640
|
{
|
|
613
641
|
provide: NG_VALUE_ACCESSOR,
|
|
614
642
|
useExisting: forwardRef(() => EsParametersComponent),
|
|
615
643
|
multi: true
|
|
616
644
|
}
|
|
617
|
-
], queries: [{ propertyName: "CustomTemplateDirectives", predicate: ParameterTypeDirective }], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\" class=\"row\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\" class=\"col-md-{{group.size ?? 12}}\">\r\n <div style=\"{{ group.groupName ? 'border: 1px solid #ddd; padding-left: 15px; padding-right: 15px' : '' }}\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n @if(item.group && Initialized){\r\n\r\n <div *ngIf=\"item.group.groupName\" style=\"margin-left: -15px; margin-right: -15px;\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">{{item.group.groupName}}</div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\" class=\"row\">\r\n @for (par of item.group.parameters; track $index; let i = $index; let last = $last) {\r\n\r\n @if (!DisplayMode || !HideEmpty || par.value) {\r\n\r\n @if (par.visible) {\r\n\r\n <div class=\"row form-group\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" class=\"col-md-{{par.parametersize ?? 12}}\" >\r\n\r\n @if(par.type != 'text' && par.type != 'repeater'){\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">\r\n @if (Removal) {\r\n <span class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>\r\n }\r\n {{ par.description }}{{ par.required ? '*' : '' }}:\r\n </label>\r\n }\r\n @switch (par.type) {\r\n\r\n @case ('date') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('datetime') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('string') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('number') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('integer') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('boolean') {\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\">\r\n <form-checkbox [SliderMode]=\"BooleanSliderMode\" [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" \r\n (inputChange)=\"evaluateRadioButtons(par); changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-checkbox>\r\n </div>\r\n }\r\n\r\n @case ('text') {\r\n <div class=\"col-md-12 m-t-5\">\r\n <form-info [LabelInputRatio]=\"'0 12'\"><span style=\"font-size: 16px;\">{{par.value}}</span></form-info>\r\n </div>\r\n }\r\n\r\n @case ('enum') {\r\n @if (!par.sourceapi) {\r\n\r\n @if (!par.multienum) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator [Source]=\"par.enumvalues\">\r\n </form-select>\r\n </div>\r\n }\r\n @else {\r\n\r\n @if (par.enumvalues) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [InOutFormat]=\"MultiselectMode == 'JsonArray'\r\n ? 'JsonList'\r\n : MultiselectMode == 'CommaSeparated'\r\n ? 'CommaSeparatedList'\r\n : 'List'\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [disabled]=\"Readonly || par.isreadonly\"\r\n [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-multiselect>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" multiple forceSelection [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [multiple]=\"par.multienum\" [disabled]=\"Readonly || par.isreadonly\"\r\n [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n\r\n @case ('file') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n #validator (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\">\r\n </form-file>\r\n </div>\r\n }\r\n\r\n @case ('repeater') {\r\n <div class=\"col-md-12 pars-repeater\">\r\n @if (par.description) {\r\n <div class=\"pars-subgroup-title\">{{ par.description }}{{ par.required ? '*' : '' }}</div>\r\n }\r\n\r\n @for (item_rep of par.value; track $index; let j = $index) {\r\n <div class=\"pars-subgroup pars-repeater-item\">\r\n @if (!Readonly && !par.isreadonly && canDeleteRepeaterItem(par)) {\r\n <span class=\"fa fa-remove text-danger pars-repeater-remove\" (click)=\"removeRepeaterItem(par, j)\"> </span>\r\n }\r\n <es-parameters [(ngModel)]=\"par.value[j]\" name=\"{{item.index}}par{{i}}_{{par.id}}_rep{{j}}\" [ngModelOptions]=\"{ standalone: true }\"\r\n [Form]=\"Form\" [DisplayMode]=\"DisplayMode\" [Readonly]=\"Readonly || par.isreadonly\"\r\n [ListFormat]=\"ListFormat\" [MultiselectMode]=\"MultiselectMode\"\r\n [LabelColWidth]=\"LabelColWidth\" [InputColWidth]=\"InputColWidth\"\r\n [BooleanSliderMode]=\"BooleanSliderMode\" [AutocompleteHideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\"\r\n [AutoCompleteDataRetrieve]=\"AutoCompleteDataRetrieve\"\r\n (ngModelChange)=\"changed();\" (inputFinalized)=\"onInputFinalized($event);\">\r\n </es-parameters>\r\n </div>\r\n }\r\n\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canAddRepeaterItem(par)) {\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary pars-repeater-add\" (click)=\"addRepeaterItem(par)\">\r\n <span class=\"fa fa-plus\"> </span>{{ 'Aggiungi' | localize : lc }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n @if (getCustomTemplate(par.type)) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"getCustomTemplate(par.type); context: {\r\n $implicit: par,\r\n par: par,\r\n changed: boundChanged,\r\n finalized: boundFinalized,\r\n Form: Form,\r\n DisplayMode: DisplayMode,\r\n Readonly: Readonly,\r\n InputColWidth: InputColWidth\r\n }\"></ng-container>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n }\r\n }\r\n }\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non è presente nulla da visualizzare\r\n </div>\r\n </div>\r\n }\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}.pars-repeater-item{position:relative;border:1px solid #ddd;border-radius:4px;padding:10px 10px 10px 15px;margin-bottom:10px}.pars-repeater-remove{position:absolute;top:8px;right:8px;cursor:pointer}.pars-repeater-add{margin-top:5px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.EsFormInputComponent, selector: "form-input", inputs: ["minlength", "maxlength", "pattern", "Password", "Type"] }, { kind: "component", type: i5.EsFormSelectComponent, selector: "form-select", inputs: ["OptionsTemplate"] }, { kind: "component", type: i5.EsFormDateComponent, selector: "form-date", inputs: ["InOutFormat", "FloatingLabel", "DateFormat"] }, { kind: "component", type: i5.EsFormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.EsFormInfoComponent, selector: "form-info", inputs: ["LabelColWidth", "InputColWidth", "Last", "FormGroupClass", "LabelInputRatio"] }, { kind: "component", type: i5.EsFormFileComponent, selector: "form-file", inputs: ["Multiple", "AllowDownload", "MaxSize", "FancyMode", "ReadFile"] }, { kind: "component", type: i5.EsFormMultiselectComponent, selector: "form-multiselect", inputs: ["display", "InOutFormat", "FloatingLabel", "MaxShownElements"] }, { kind: "component", type: i5.EsFormAutocompleteComponent, selector: "form-autocomplete", inputs: ["MinChars", "SearchFunctionContext", "SearchFunction", "multiple", "forceSelection"] }, { kind: "component", type: EsParametersComponent, selector: "es-parameters", inputs: ["BooleanSliderMode", "DisplayMode", "HideEmpty", "LastParameterNoMargin", "LabelColWidth", "InputColWidth", "submitted", "EmptyMessage", "Removal", "Readonly", "ListFormat", "Form", "AutocompleteHideChoicesOnSelection", "AutoCompleteDataRetrieve", "MultiselectMode", "LabelInputRatio"], outputs: ["inputFinalized"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
645
|
+
], queries: [{ propertyName: "CustomTemplateDirectives", predicate: ParameterTypeDirective }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\" class=\"row\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\" class=\"col-md-{{group.size ?? 12}}\">\r\n <div style=\"{{ group.groupName ? 'border: 1px solid #ddd; padding-left: 15px; padding-right: 15px' : '' }}\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n @if(item.group && Initialized){\r\n\r\n <div *ngIf=\"item.group.groupName\" style=\"margin-left: -15px; margin-right: -15px;\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">{{item.group.groupName}}</div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\" class=\"row\">\r\n @for (par of item.group.parameters; track $index; let i = $index; let last = $last) {\r\n\r\n @if (!DisplayMode || !HideEmpty || par.value) {\r\n\r\n @if (par.visible) {\r\n\r\n <div class=\"row form-group\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" class=\"col-md-{{par.parametersize ?? 12}}\" >\r\n\r\n @if(par.type != 'text' && par.type != 'repeater'){\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">\r\n @if (Removal) {\r\n <span class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>\r\n }\r\n {{ par.description }}{{ par.required ? '*' : '' }}:\r\n </label>\r\n }\r\n @switch (par.type) {\r\n\r\n @case ('date') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('datetime') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('string') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('number') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('integer') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('boolean') {\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\">\r\n <form-checkbox [SliderMode]=\"BooleanSliderMode\" [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" \r\n (inputChange)=\"evaluateRadioButtons(par); changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-checkbox>\r\n </div>\r\n }\r\n\r\n @case ('text') {\r\n <div class=\"col-md-12 m-t-5\">\r\n <form-info [LabelInputRatio]=\"'0 12'\"><span style=\"font-size: 16px;\">{{par.value}}</span></form-info>\r\n </div>\r\n }\r\n\r\n @case ('enum') {\r\n @if (!par.sourceapi) {\r\n\r\n @if (!par.multienum) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator [Source]=\"par.enumvalues\">\r\n </form-select>\r\n </div>\r\n }\r\n @else {\r\n\r\n @if (par.enumvalues) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [InOutFormat]=\"MultiselectMode == 'JsonArray'\r\n ? 'JsonList'\r\n : MultiselectMode == 'CommaSeparated'\r\n ? 'CommaSeparatedList'\r\n : 'List'\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [disabled]=\"Readonly || par.isreadonly\"\r\n [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-multiselect>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" multiple forceSelection [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [multiple]=\"par.multienum\" [disabled]=\"Readonly || par.isreadonly\"\r\n [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n\r\n @case ('file') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n #validator (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\">\r\n </form-file>\r\n </div>\r\n }\r\n\r\n @case ('repeater') {\r\n <div class=\"col-md-12 pars-repeater\">\r\n @if (par.description) {\r\n <div class=\"pars-subgroup-title\">{{ par.description }}{{ par.required ? '*' : '' }}</div>\r\n }\r\n\r\n @for (item_rep of par.value; track $index; let j = $index) {\r\n <div class=\"pars-subgroup pars-repeater-item\">\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canDeleteRepeaterItem(par)) {\r\n <div class=\"pars-repeater-item-header\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger pars-repeater-remove\" (click)=\"removeRepeaterItem(par, j)\">\r\n <span class=\"fa fa-remove\"> </span>{{ 'Rimuovi' | localize : lc }}\r\n </button>\r\n </div>\r\n }\r\n <es-parameters [(ngModel)]=\"par.value[j]\" name=\"{{item.index}}par{{i}}_{{par.id}}_rep{{j}}\" [ngModelOptions]=\"{ standalone: true }\"\r\n [Form]=\"Form\" [DisplayMode]=\"DisplayMode\" [Readonly]=\"Readonly || par.isreadonly\"\r\n [ListFormat]=\"ListFormat\" [MultiselectMode]=\"MultiselectMode\"\r\n [LabelColWidth]=\"LabelColWidth\" [InputColWidth]=\"InputColWidth\"\r\n [BooleanSliderMode]=\"BooleanSliderMode\" [AutocompleteHideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\"\r\n [AutoCompleteDataRetrieve]=\"AutoCompleteDataRetrieve\" [ParentCustomTemplates]=\"MergedCustomTemplates\"\r\n (ngModelChange)=\"changed();\" (inputFinalized)=\"onInputFinalized($event);\">\r\n </es-parameters>\r\n </div>\r\n }\r\n\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canAddRepeaterItem(par)) {\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary pars-repeater-add\" (click)=\"addRepeaterItem(par)\">\r\n <span class=\"fa fa-plus\"> </span>{{ 'Aggiungi' | localize : lc }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n @if (getCustomTemplate(par.type)) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"getCustomTemplate(par.type); context: {\r\n $implicit: par,\r\n par: par,\r\n changed: boundChanged,\r\n finalized: boundFinalized,\r\n Form: Form,\r\n DisplayMode: DisplayMode,\r\n Readonly: Readonly,\r\n InputColWidth: InputColWidth\r\n }\"></ng-container>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n }\r\n }\r\n }\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non è presente nulla da visualizzare\r\n </div>\r\n </div>\r\n }\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}.pars-repeater-item{border:1px solid #ddd;border-radius:4px;padding:10px 10px 10px 15px;margin-bottom:10px}.pars-repeater-item-header{display:flex;justify-content:flex-end;margin-bottom:8px}.pars-repeater-remove{cursor:pointer}.pars-repeater-add{margin-top:5px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.EsFormInputComponent, selector: "form-input", inputs: ["minlength", "maxlength", "pattern", "Password", "Type"] }, { kind: "component", type: i5.EsFormSelectComponent, selector: "form-select", inputs: ["OptionsTemplate"] }, { kind: "component", type: i5.EsFormDateComponent, selector: "form-date", inputs: ["InOutFormat", "FloatingLabel", "DateFormat"] }, { kind: "component", type: i5.EsFormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.EsFormInfoComponent, selector: "form-info", inputs: ["LabelColWidth", "InputColWidth", "Last", "FormGroupClass", "LabelInputRatio"] }, { kind: "component", type: i5.EsFormFileComponent, selector: "form-file", inputs: ["Multiple", "AllowDownload", "MaxSize", "FancyMode", "ReadFile"] }, { kind: "component", type: i5.EsFormMultiselectComponent, selector: "form-multiselect", inputs: ["display", "InOutFormat", "FloatingLabel", "MaxShownElements"] }, { kind: "component", type: i5.EsFormAutocompleteComponent, selector: "form-autocomplete", inputs: ["MinChars", "SearchFunctionContext", "SearchFunction", "multiple", "forceSelection"] }, { kind: "component", type: EsParametersComponent, selector: "es-parameters", inputs: ["ParentCustomTemplates", "BooleanSliderMode", "DisplayMode", "HideEmpty", "LastParameterNoMargin", "LabelColWidth", "InputColWidth", "submitted", "EmptyMessage", "Removal", "Readonly", "ListFormat", "Form", "AutocompleteHideChoicesOnSelection", "AutoCompleteDataRetrieve", "MultiselectMode", "LabelInputRatio"], outputs: ["inputFinalized"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
618
646
|
}
|
|
619
647
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.28", ngImport: i0, type: EsParametersComponent, decorators: [{
|
|
620
648
|
type: Component,
|
|
@@ -625,10 +653,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.28", ngImpo
|
|
|
625
653
|
useExisting: forwardRef(() => EsParametersComponent),
|
|
626
654
|
multi: true
|
|
627
655
|
}
|
|
628
|
-
], encapsulation: ViewEncapsulation.None, standalone: false, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\" class=\"row\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\" class=\"col-md-{{group.size ?? 12}}\">\r\n <div style=\"{{ group.groupName ? 'border: 1px solid #ddd; padding-left: 15px; padding-right: 15px' : '' }}\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n @if(item.group && Initialized){\r\n\r\n <div *ngIf=\"item.group.groupName\" style=\"margin-left: -15px; margin-right: -15px;\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">{{item.group.groupName}}</div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\" class=\"row\">\r\n @for (par of item.group.parameters; track $index; let i = $index; let last = $last) {\r\n\r\n @if (!DisplayMode || !HideEmpty || par.value) {\r\n\r\n @if (par.visible) {\r\n\r\n <div class=\"row form-group\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" class=\"col-md-{{par.parametersize ?? 12}}\" >\r\n\r\n @if(par.type != 'text' && par.type != 'repeater'){\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">\r\n @if (Removal) {\r\n <span class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>\r\n }\r\n {{ par.description }}{{ par.required ? '*' : '' }}:\r\n </label>\r\n }\r\n @switch (par.type) {\r\n\r\n @case ('date') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('datetime') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('string') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('number') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('integer') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('boolean') {\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\">\r\n <form-checkbox [SliderMode]=\"BooleanSliderMode\" [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" \r\n (inputChange)=\"evaluateRadioButtons(par); changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-checkbox>\r\n </div>\r\n }\r\n\r\n @case ('text') {\r\n <div class=\"col-md-12 m-t-5\">\r\n <form-info [LabelInputRatio]=\"'0 12'\"><span style=\"font-size: 16px;\">{{par.value}}</span></form-info>\r\n </div>\r\n }\r\n\r\n @case ('enum') {\r\n @if (!par.sourceapi) {\r\n\r\n @if (!par.multienum) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator [Source]=\"par.enumvalues\">\r\n </form-select>\r\n </div>\r\n }\r\n @else {\r\n\r\n @if (par.enumvalues) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [InOutFormat]=\"MultiselectMode == 'JsonArray'\r\n ? 'JsonList'\r\n : MultiselectMode == 'CommaSeparated'\r\n ? 'CommaSeparatedList'\r\n : 'List'\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [disabled]=\"Readonly || par.isreadonly\"\r\n [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-multiselect>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" multiple forceSelection [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [multiple]=\"par.multienum\" [disabled]=\"Readonly || par.isreadonly\"\r\n [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n\r\n @case ('file') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n #validator (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\">\r\n </form-file>\r\n </div>\r\n }\r\n\r\n @case ('repeater') {\r\n <div class=\"col-md-12 pars-repeater\">\r\n @if (par.description) {\r\n <div class=\"pars-subgroup-title\">{{ par.description }}{{ par.required ? '*' : '' }}</div>\r\n }\r\n\r\n @for (item_rep of par.value; track $index; let j = $index) {\r\n <div class=\"pars-subgroup pars-repeater-item\">\r\n @if (!Readonly && !par.isreadonly && canDeleteRepeaterItem(par)) {\r\n <span class=\"fa fa-remove text-danger pars-repeater-remove\" (click)=\"removeRepeaterItem(par, j)\"> </span>\r\n }\r\n <es-parameters [(ngModel)]=\"par.value[j]\" name=\"{{item.index}}par{{i}}_{{par.id}}_rep{{j}}\" [ngModelOptions]=\"{ standalone: true }\"\r\n [Form]=\"Form\" [DisplayMode]=\"DisplayMode\" [Readonly]=\"Readonly || par.isreadonly\"\r\n [ListFormat]=\"ListFormat\" [MultiselectMode]=\"MultiselectMode\"\r\n [LabelColWidth]=\"LabelColWidth\" [InputColWidth]=\"InputColWidth\"\r\n [BooleanSliderMode]=\"BooleanSliderMode\" [AutocompleteHideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\"\r\n [AutoCompleteDataRetrieve]=\"AutoCompleteDataRetrieve\"\r\n (ngModelChange)=\"changed();\" (inputFinalized)=\"onInputFinalized($event);\">\r\n </es-parameters>\r\n </div>\r\n }\r\n\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canAddRepeaterItem(par)) {\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary pars-repeater-add\" (click)=\"addRepeaterItem(par)\">\r\n <span class=\"fa fa-plus\"> </span>{{ 'Aggiungi' | localize : lc }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n @if (getCustomTemplate(par.type)) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"getCustomTemplate(par.type); context: {\r\n $implicit: par,\r\n par: par,\r\n changed: boundChanged,\r\n finalized: boundFinalized,\r\n Form: Form,\r\n DisplayMode: DisplayMode,\r\n Readonly: Readonly,\r\n InputColWidth: InputColWidth\r\n }\"></ng-container>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n }\r\n }\r\n }\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non è presente nulla da visualizzare\r\n </div>\r\n </div>\r\n }\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}.pars-repeater-item{position:relative;border:1px solid #ddd;border-radius:4px;padding:10px 10px 10px 15px;margin-bottom:10px}.pars-repeater-remove{position:absolute;top:8px;right:8px;cursor:pointer}.pars-repeater-add{margin-top:5px}\n"] }]
|
|
656
|
+
], encapsulation: ViewEncapsulation.None, standalone: false, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\" class=\"row\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\" class=\"col-md-{{group.size ?? 12}}\">\r\n <div style=\"{{ group.groupName ? 'border: 1px solid #ddd; padding-left: 15px; padding-right: 15px' : '' }}\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n @if(item.group && Initialized){\r\n\r\n <div *ngIf=\"item.group.groupName\" style=\"margin-left: -15px; margin-right: -15px;\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">{{item.group.groupName}}</div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\" class=\"row\">\r\n @for (par of item.group.parameters; track $index; let i = $index; let last = $last) {\r\n\r\n @if (!DisplayMode || !HideEmpty || par.value) {\r\n\r\n @if (par.visible) {\r\n\r\n <div class=\"row form-group\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" class=\"col-md-{{par.parametersize ?? 12}}\" >\r\n\r\n @if(par.type != 'text' && par.type != 'repeater'){\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">\r\n @if (Removal) {\r\n <span class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>\r\n }\r\n {{ par.description }}{{ par.required ? '*' : '' }}:\r\n </label>\r\n }\r\n @switch (par.type) {\r\n\r\n @case ('date') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('datetime') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('string') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('number') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('integer') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('boolean') {\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\">\r\n <form-checkbox [SliderMode]=\"BooleanSliderMode\" [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" \r\n (inputChange)=\"evaluateRadioButtons(par); changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-checkbox>\r\n </div>\r\n }\r\n\r\n @case ('text') {\r\n <div class=\"col-md-12 m-t-5\">\r\n <form-info [LabelInputRatio]=\"'0 12'\"><span style=\"font-size: 16px;\">{{par.value}}</span></form-info>\r\n </div>\r\n }\r\n\r\n @case ('enum') {\r\n @if (!par.sourceapi) {\r\n\r\n @if (!par.multienum) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator [Source]=\"par.enumvalues\">\r\n </form-select>\r\n </div>\r\n }\r\n @else {\r\n\r\n @if (par.enumvalues) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [InOutFormat]=\"MultiselectMode == 'JsonArray'\r\n ? 'JsonList'\r\n : MultiselectMode == 'CommaSeparated'\r\n ? 'CommaSeparatedList'\r\n : 'List'\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [disabled]=\"Readonly || par.isreadonly\"\r\n [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-multiselect>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" multiple forceSelection [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [multiple]=\"par.multienum\" [disabled]=\"Readonly || par.isreadonly\"\r\n [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n\r\n @case ('file') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n #validator (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\">\r\n </form-file>\r\n </div>\r\n }\r\n\r\n @case ('repeater') {\r\n <div class=\"col-md-12 pars-repeater\">\r\n @if (par.description) {\r\n <div class=\"pars-subgroup-title\">{{ par.description }}{{ par.required ? '*' : '' }}</div>\r\n }\r\n\r\n @for (item_rep of par.value; track $index; let j = $index) {\r\n <div class=\"pars-subgroup pars-repeater-item\">\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canDeleteRepeaterItem(par)) {\r\n <div class=\"pars-repeater-item-header\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger pars-repeater-remove\" (click)=\"removeRepeaterItem(par, j)\">\r\n <span class=\"fa fa-remove\"> </span>{{ 'Rimuovi' | localize : lc }}\r\n </button>\r\n </div>\r\n }\r\n <es-parameters [(ngModel)]=\"par.value[j]\" name=\"{{item.index}}par{{i}}_{{par.id}}_rep{{j}}\" [ngModelOptions]=\"{ standalone: true }\"\r\n [Form]=\"Form\" [DisplayMode]=\"DisplayMode\" [Readonly]=\"Readonly || par.isreadonly\"\r\n [ListFormat]=\"ListFormat\" [MultiselectMode]=\"MultiselectMode\"\r\n [LabelColWidth]=\"LabelColWidth\" [InputColWidth]=\"InputColWidth\"\r\n [BooleanSliderMode]=\"BooleanSliderMode\" [AutocompleteHideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\"\r\n [AutoCompleteDataRetrieve]=\"AutoCompleteDataRetrieve\" [ParentCustomTemplates]=\"MergedCustomTemplates\"\r\n (ngModelChange)=\"changed();\" (inputFinalized)=\"onInputFinalized($event);\">\r\n </es-parameters>\r\n </div>\r\n }\r\n\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canAddRepeaterItem(par)) {\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary pars-repeater-add\" (click)=\"addRepeaterItem(par)\">\r\n <span class=\"fa fa-plus\"> </span>{{ 'Aggiungi' | localize : lc }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n @if (getCustomTemplate(par.type)) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"getCustomTemplate(par.type); context: {\r\n $implicit: par,\r\n par: par,\r\n changed: boundChanged,\r\n finalized: boundFinalized,\r\n Form: Form,\r\n DisplayMode: DisplayMode,\r\n Readonly: Readonly,\r\n InputColWidth: InputColWidth\r\n }\"></ng-container>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n }\r\n }\r\n }\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non è presente nulla da visualizzare\r\n </div>\r\n </div>\r\n }\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}.pars-repeater-item{border:1px solid #ddd;border-radius:4px;padding:10px 10px 10px 15px;margin-bottom:10px}.pars-repeater-item-header{display:flex;justify-content:flex-end;margin-bottom:8px}.pars-repeater-remove{cursor:pointer}.pars-repeater-add{margin-top:5px}\n"] }]
|
|
629
657
|
}], ctorParameters: () => [{ type: i1.UtilityService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.DateService }], propDecorators: { CustomTemplateDirectives: [{
|
|
630
658
|
type: ContentChildren,
|
|
631
659
|
args: [ParameterTypeDirective]
|
|
660
|
+
}], ParentCustomTemplates: [{
|
|
661
|
+
type: Input
|
|
632
662
|
}], BooleanSliderMode: [{
|
|
633
663
|
type: Input
|
|
634
664
|
}], DisplayMode: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/parameter-type.directive.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Seleziona\", [\"Select\"])\r\n super.set(\"it->en\", \"Aggiungi\", [\"Add\"])\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupId ID del gruppo\r\n * @param {string} groupName Descrizione del gruppo\r\n * @param {number} order ordine del gruppo\r\n */\r\n constructor(public groupId: string, public groupName: string, public order: number, public size?: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n}","import { Directive, Input, TemplateRef } from \"@angular/core\";\n\n/**\n * Direttiva strutturale che permette di registrare un template custom per un\n * determinato tipo di parametro all'interno di **es-parameters**.\n *\n * La direttiva non renderizza nulla di per sé: espone soltanto il proprio\n * **TemplateRef** al componente {@link EsParametersComponent}, che lo utilizza\n * per graficare i parametri il cui **type** corrisponde a quello indicato.\n *\n * Esempio di utilizzo:\n * ```html\n * <es-parameters [(ngModel)]=\"parameters\" [Form]=\"form\" name=\"parameters\">\n * <span *parameterType=\"'customProduct'; let par; let changed = changed\">\n * <my-widget [(ngModel)]=\"par.value\" (change)=\"changed()\"></my-widget>\n * </span>\n * </es-parameters>\n * ```\n *\n * Il contesto passato al template contiene:\n * - **$implicit** / **par**: il {@link GenericParameter} da graficare\n * - **changed**: funzione da richiamare per propagare le modifiche via ngModel\n * - **finalized**: funzione da richiamare quando l'input è finalizzato\n * - **Form**, **DisplayMode**, **Readonly**, **InputColWidth**: input del componente ospitante\n */\n@Directive({\n selector: \"[parameterType]\",\n standalone: false\n})\nexport class ParameterTypeDirective {\n\n /** Tipo di parametro (**GenericParameter.type**) a cui associare questo template custom */\n @Input() parameterType: string;\n\n /**\n * Costruttore\n *\n * @ignore\n */\n constructor(public templateRef: TemplateRef<any>) { }\n}\n","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { AfterContentInit, ChangeDetectorRef, Component, ContentChildren, EventEmitter, forwardRef, Injector, Input, Output, QueryList, TemplateRef, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\nimport { ParameterTypeDirective } from \"./parameter-type.directive\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\",\r\n standalone: false\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, AfterContentInit {\r\n\r\n /** Indica se si lavora a singolo parametro forzato dentro un array for the glory of satan */\r\n private SingleParameterMode: boolean = false;\r\n\r\n /**\r\n * Template custom registrati dai consumer tramite la direttiva **[parameterType]**,\r\n * proiettati come content children dentro **es-parameters**\r\n *\r\n * @ignore\r\n */\r\n @ContentChildren(ParameterTypeDirective) private CustomTemplateDirectives: QueryList<ParameterTypeDirective>;\r\n\r\n /** Mappa tipo parametro -> TemplateRef custom, usata per il lookup in fase di graficazione */\r\n private CustomTemplates: { [type: string]: TemplateRef<any> } = {};\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: { [id: string]: GenericParameter };\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n @Input() BooleanSliderMode:boolean = false;\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che il parametro (In Display mode!!) non appare se vuoto. In più, se tutti sono vuoti, fa vedere una bella card \"non ci sono parametri presenti\" */\r\n @Input() HideEmpty: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica il formato lista che dev'essere utilizzato */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form: NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Indica come deve funzionare la multiselect */\r\n @Input() MultiselectMode: 'CommaSeparated' | 'Array' | 'JsonArray' = 'CommaSeparated';\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /** Emette l'ID del parametro modificato */\r\n @Output() inputFinalized: EventEmitter<GenericParameter> = new EventEmitter<GenericParameter>();\r\n\r\n public AllParametersEmpty: boolean = false;\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n ngOnInit() {\r\n // Qui gli input dovrebbero essere settati. Alcuni form-roba non prendono bene i cambi di input\r\n // Non sta funzionando come speravo... da rivedere\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Pipeline di Angular: raccoglie i template custom registrati tramite **[parameterType]**\r\n * e li indicizza per tipo. Si riaggiorna se la lista dei template proiettati cambia.\r\n *\r\n * @ignore\r\n */\r\n ngAfterContentInit() {\r\n this.buildCustomTemplates();\r\n this.CustomTemplateDirectives.changes.subscribe(() => {\r\n this.buildCustomTemplates();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * (Ri)costruisce la mappa tipo parametro -> TemplateRef a partire dalle direttive proiettate\r\n *\r\n * @ignore\r\n */\r\n private buildCustomTemplates() {\r\n this.CustomTemplates = {};\r\n this.CustomTemplateDirectives.forEach(dir => {\r\n if (!dir.parameterType)\r\n console.warn(\"@esfaenza/parameters: direttiva [parameterType] senza tipo specificato, verrà ignorata\");\r\n else\r\n this.CustomTemplates[dir.parameterType] = dir.templateRef;\r\n });\r\n }\r\n\r\n /**\r\n * Restituisce il template custom registrato per un determinato tipo di parametro, se presente\r\n *\r\n * @param {string} type Tipo del parametro (**GenericParameter.type**)\r\n * @returns Il **TemplateRef** custom associato, oppure **null** se non ne esiste uno\r\n */\r\n public getCustomTemplate(type: string): TemplateRef<any> | null {\r\n return this.CustomTemplates[type] ?? null;\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova istanza ad un parametro di tipo **repeater**, clonandola dal prototipo **subparameters**\r\n *\r\n * @param {GenericParameter} par Parametro repeater a cui aggiungere l'istanza\r\n */\r\n public addRepeaterItem(par: GenericParameter) {\r\n if (!par.subparameters)\r\n return;\r\n\r\n if (!Array.isArray(par.value))\r\n par.value = [];\r\n\r\n par.value.push(this.utiExts.deepClone(par.subparameters));\r\n this.changed();\r\n }\r\n\r\n /**\r\n * Rimuove l'istanza indicata da un parametro di tipo **repeater**\r\n *\r\n * @param {GenericParameter} par Parametro repeater da cui rimuovere l'istanza\r\n * @param {number} index Indice dell'istanza da rimuovere\r\n */\r\n public removeRepeaterItem(par: GenericParameter, index: number) {\r\n par.value.splice(index, 1);\r\n this.changed();\r\n }\r\n\r\n /**\r\n * Indica se è possibile aggiungere istanze ad un parametro repeater (**canadd** true se non esplicitamente false)\r\n */\r\n public canAddRepeaterItem(par: GenericParameter): boolean {\r\n return par.canadd !== false;\r\n }\r\n\r\n /**\r\n * Indica se è possibile rimuovere l'istanza indicata da un parametro repeater.\r\n * Rispetta **candelete** e, per i repeater obbligatori, impedisce di scendere sotto una istanza.\r\n */\r\n public canDeleteRepeaterItem(par: GenericParameter): boolean {\r\n return par.candelete !== false && ((par.value?.length ?? 0) > 1 || !par.required);\r\n }\r\n\r\n /**\r\n * Reidrata il valore di un parametro **repeater** dalla sua forma \"wire\" (stringa JSON values-only)\r\n * al modello interno **GenericParameter[][]**, clonando il prototipo **subparameters** per ogni istanza.\r\n *\r\n * Regole:\r\n * - null / undefined / stringa vuota: seed di una singola istanza vuota\r\n * - stringa JSON: parse in una lista di mappe id-valore (una per istanza)\r\n * - **GenericParameter[][]** già interno (writeValue rientrante): lasciato invariato\r\n *\r\n * @ignore\r\n */\r\n private hydrateRepeaterValue(par: GenericParameter): GenericParameter[][] {\r\n // Valore già interno (array di istanze, ognuna un array di parametri): non lo ritocco\r\n if (Array.isArray(par.value) && (par.value.length == 0 || Array.isArray(par.value[0])))\r\n return par.value;\r\n\r\n let valueMaps: { [id: string]: any }[];\r\n\r\n if (par.value == null || par.value === \"\")\r\n valueMaps = null; // -> seed di una istanza\r\n else if (typeof par.value === \"string\")\r\n valueMaps = JSON.parse(par.value);\r\n else\r\n valueMaps = par.value; // già lista di mappe id->valore\r\n\r\n if (!valueMaps)\r\n return par.subparameters ? [this.hydrateRepeaterInstance(par, null)] : [];\r\n\r\n return valueMaps.map(vm => this.hydrateRepeaterInstance(par, vm));\r\n }\r\n\r\n /**\r\n * Costruisce una singola istanza di repeater clonando **subparameters** e applicando i valori dalla mappa id->valore\r\n *\r\n * @ignore\r\n */\r\n private hydrateRepeaterInstance(par: GenericParameter, valueMap: { [id: string]: any } | null): GenericParameter[] {\r\n let instance = this.utiExts.deepClone(par.subparameters ?? []) as GenericParameter[];\r\n if (valueMap)\r\n instance.forEach(p => { if (Object.prototype.hasOwnProperty.call(valueMap, p.id)) p.value = valueMap[p.id]; });\r\n return instance;\r\n }\r\n\r\n /**\r\n * Serializza il modello interno di un repeater (**GenericParameter[][]**) nella stringa JSON \"values-only\"\r\n * (lista di mappe id->valore, una per istanza) da propagare via ngModel\r\n *\r\n * @ignore\r\n */\r\n private serializeRepeaterValue(instances: GenericParameter[][]): string {\r\n let maps = (instances ?? []).map(instance =>\r\n (instance ?? []).reduce((acc, p) => { acc[p.id] = p.value; return acc; }, {} as { [id: string]: any })\r\n );\r\n return JSON.stringify(maps);\r\n }\r\n\r\n /**\r\n * Riferimento stabile a **changed()** da passare nel contesto dei template custom,\r\n * così i consumer possono propagare le modifiche via ngModel\r\n *\r\n * @ignore\r\n */\r\n public boundChanged = () => this.changed();\r\n\r\n /**\r\n * Riferimento stabile a **onInputFinalized()** da passare nel contesto dei template custom\r\n *\r\n * @ignore\r\n */\r\n public boundFinalized = (par: GenericParameter) => this.onInputFinalized(par);\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n\r\n if (!obj)\r\n return;\r\n\r\n if(!Array.isArray(obj))\r\n this.SingleParameterMode = true;\r\n \r\n this.Parameters = Array.isArray(obj) ? obj : [obj];\r\n\r\n this.ParametersCache = {};\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value) && (t.sourceapi || !t.enumvalues))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n\r\n // Repeater: il valore viaggia SEMPRE come stringa JSON \"values-only\" (una lista di mappe id->valore\r\n // per istanza) e viene reidratato internamente in un GenericParameter[][] clonando il prototipo subparameters.\r\n if (t.type == 'repeater')\r\n t.value = this.hydrateRepeaterValue(t);\r\n });\r\n\r\n this.AllParametersEmpty = this.Parameters.every(t => !t.value);\r\n this.reviewParametersBindings();\r\n this.generateGroups();\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups() {\r\n this.Groups = [];\r\n\r\n if (this.Parameters?.length > 0) {\r\n this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for (let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupId = par.group ?? par.id;\r\n let parGroupName = par.groupdescription ?? \"\";\r\n\r\n // Nel caso di più ordinamenti nello stesso gruppo, vince quello piu \"alto\"\r\n let groupOrder = par.order;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n // ATTENZIONE: Tutti i par.groupsize devono corrispondere, o verrà letto solo uno a caso di loro.\r\n if (!this.Groups.some(x => x.groupId == parGroupId))\r\n this.Groups.push(new GenericParameterGroup(parGroupId, parGroupName, groupOrder, par.groupsize));\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupId == parGroupId)!.parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupId.includes('§'));\r\n for (let _; subgroups.length > 0; () => { }) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupId.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for (let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupId.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupId.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n\r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupId == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupId = sub.groupId.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupId == parentGroupName);\r\n if (parentGroup?.subgroups.some(s => s.groupId == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupId == sub.groupId);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n public evaluateRadioButtons(par: GenericParameter) {\r\n if (par.radiobuttonsource) {\r\n var allRadios = this.Parameters.filter(t => t.radiobuttonsource == par.radiobuttonsource);\r\n // Se dopo una checkata su radiobuttons sono tutti a false, quello che ho decheckettato deve essere richeckato dato che uno è sempre obbligatorio\r\n if (allRadios.every(t => !t.value || t.value == \"false\"))\r\n par.value = true;\r\n else {\r\n // Altrimenti dechecko tutti e richecko solo me stesso\r\n allRadios.forEach(t => { t.value = false; })\r\n par.value = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n if(!this.Groups)\r\n this.generateGroups();\r\n \r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n\r\n // In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)\r\n // distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.\r\n // 1: Faccio una copia del parametro corrente\r\n // 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia\r\n // 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n let parameterCopy = this.utiExts.deepClone(this.Parameters[index]) as GenericParameter;\r\n\r\n let parameterRefFixed = false;\r\n for (let ig = 0; ig < this.Groups.length; ig++) {\r\n var g = this.Groups[ig];\r\n for (let ip = 0; ip < g.parameters.length; ip++) {\r\n var p = g.parameters[ip]\r\n if (p === this.Parameters[index]) {\r\n this.Groups[ig].parameters[ip] = parameterCopy;\r\n parameterRefFixed = true;\r\n break;\r\n }\r\n }\r\n if (parameterRefFixed)\r\n break;\r\n }\r\n \r\n this.Parameters[index] = parameterCopy\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = this.utiExts.deepClone(this.Parameters) as GenericParameter[];\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n else if (t.type == \"enum\" && this.MultiselectMode == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n else if (t.type == \"enum\" && this.MultiselectMode == 'Array' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = JSON.stringify(t.value);\r\n else if (t.type == \"enum\" && this.MultiselectMode == 'JsonArray' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = \"[\" + t.value.map(t => `\\\"${t}\\\"`).join(',') + \"]\";\r\n // Repeater: serializzo le istanze come stringa JSON \"values-only\" (lista di mappe id->valore)\r\n else if (t.type == \"repeater\")\r\n t.value = this.serializeRepeaterValue(t.value);\r\n });\r\n\r\n this.propagateChange(this.SingleParameterMode ? ParametersClone[0] : ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n\r\n public onInputFinalized(parameter: GenericParameter) {\r\n this.inputFinalized.emit(parameter);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\" class=\"row\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\" class=\"col-md-{{group.size ?? 12}}\">\r\n <div style=\"{{ group.groupName ? 'border: 1px solid #ddd; padding-left: 15px; padding-right: 15px' : '' }}\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n @if(item.group && Initialized){\r\n\r\n <div *ngIf=\"item.group.groupName\" style=\"margin-left: -15px; margin-right: -15px;\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">{{item.group.groupName}}</div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\" class=\"row\">\r\n @for (par of item.group.parameters; track $index; let i = $index; let last = $last) {\r\n\r\n @if (!DisplayMode || !HideEmpty || par.value) {\r\n\r\n @if (par.visible) {\r\n\r\n <div class=\"row form-group\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" class=\"col-md-{{par.parametersize ?? 12}}\" >\r\n\r\n @if(par.type != 'text' && par.type != 'repeater'){\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">\r\n @if (Removal) {\r\n <span class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>\r\n }\r\n {{ par.description }}{{ par.required ? '*' : '' }}:\r\n </label>\r\n }\r\n @switch (par.type) {\r\n\r\n @case ('date') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('datetime') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('string') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('number') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('integer') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('boolean') {\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\">\r\n <form-checkbox [SliderMode]=\"BooleanSliderMode\" [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" \r\n (inputChange)=\"evaluateRadioButtons(par); changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-checkbox>\r\n </div>\r\n }\r\n\r\n @case ('text') {\r\n <div class=\"col-md-12 m-t-5\">\r\n <form-info [LabelInputRatio]=\"'0 12'\"><span style=\"font-size: 16px;\">{{par.value}}</span></form-info>\r\n </div>\r\n }\r\n\r\n @case ('enum') {\r\n @if (!par.sourceapi) {\r\n\r\n @if (!par.multienum) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator [Source]=\"par.enumvalues\">\r\n </form-select>\r\n </div>\r\n }\r\n @else {\r\n\r\n @if (par.enumvalues) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [InOutFormat]=\"MultiselectMode == 'JsonArray'\r\n ? 'JsonList'\r\n : MultiselectMode == 'CommaSeparated'\r\n ? 'CommaSeparatedList'\r\n : 'List'\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [disabled]=\"Readonly || par.isreadonly\"\r\n [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-multiselect>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" multiple forceSelection [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [multiple]=\"par.multienum\" [disabled]=\"Readonly || par.isreadonly\"\r\n [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n\r\n @case ('file') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n #validator (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\">\r\n </form-file>\r\n </div>\r\n }\r\n\r\n @case ('repeater') {\r\n <div class=\"col-md-12 pars-repeater\">\r\n @if (par.description) {\r\n <div class=\"pars-subgroup-title\">{{ par.description }}{{ par.required ? '*' : '' }}</div>\r\n }\r\n\r\n @for (item_rep of par.value; track $index; let j = $index) {\r\n <div class=\"pars-subgroup pars-repeater-item\">\r\n @if (!Readonly && !par.isreadonly && canDeleteRepeaterItem(par)) {\r\n <span class=\"fa fa-remove text-danger pars-repeater-remove\" (click)=\"removeRepeaterItem(par, j)\"> </span>\r\n }\r\n <es-parameters [(ngModel)]=\"par.value[j]\" name=\"{{item.index}}par{{i}}_{{par.id}}_rep{{j}}\" [ngModelOptions]=\"{ standalone: true }\"\r\n [Form]=\"Form\" [DisplayMode]=\"DisplayMode\" [Readonly]=\"Readonly || par.isreadonly\"\r\n [ListFormat]=\"ListFormat\" [MultiselectMode]=\"MultiselectMode\"\r\n [LabelColWidth]=\"LabelColWidth\" [InputColWidth]=\"InputColWidth\"\r\n [BooleanSliderMode]=\"BooleanSliderMode\" [AutocompleteHideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\"\r\n [AutoCompleteDataRetrieve]=\"AutoCompleteDataRetrieve\"\r\n (ngModelChange)=\"changed();\" (inputFinalized)=\"onInputFinalized($event);\">\r\n </es-parameters>\r\n </div>\r\n }\r\n\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canAddRepeaterItem(par)) {\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary pars-repeater-add\" (click)=\"addRepeaterItem(par)\">\r\n <span class=\"fa fa-plus\"> </span>{{ 'Aggiungi' | localize : lc }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n @if (getCustomTemplate(par.type)) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"getCustomTemplate(par.type); context: {\r\n $implicit: par,\r\n par: par,\r\n changed: boundChanged,\r\n finalized: boundFinalized,\r\n Form: Form,\r\n DisplayMode: DisplayMode,\r\n Readonly: Readonly,\r\n InputColWidth: InputColWidth\r\n }\"></ng-container>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n }\r\n }\r\n }\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non è presente nulla da visualizzare\r\n </div>\r\n </div>\r\n }\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\nimport { ParameterTypeDirective } from './parameter-type.directive';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent, ParameterTypeDirective],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent, ParameterTypeDirective]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","import { AppFile } from \"@esfaenza/forms-and-validations\";\r\n\r\n/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'text' | 'number' | 'boolean' | 'file' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'file' | 'enum' | 'integer' | 'datetime' | string;\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n public radiobuttonsource: string =\"\";\r\n\r\n public radiobuttonunderlyingvalue?: any;\r\n\r\n public radiobuttonunderlyingdatatype?: 'date' | 'string' | 'number' | 'boolean' | 'file' | 'enum' | 'integer' | 'datetime' | string;\r\n\r\n /** File del parametro */\r\n public file: AppFile;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n\r\n /** descrizione del gruppo per scrivere qualcosa come separatore */\r\n public groupdescription: string;\r\n\r\n /** Grandezza del gruppo di appartenenza del parametro */\r\n public groupsize: number;\r\n\r\n /** Grandezza dei parametri */\r\n public parametersize: number;\r\n\r\n /** Valori extra se da passare da una parte all'altra */\r\n public extras: {[id:string] : string};\r\n\r\n /**\r\n * Prototipo dei parametri figli di un parametro di tipo **repeater**.\r\n * Definisce i campi di una singola istanza; ogni nuova istanza aggiunta è un clone di questo template.\r\n */\r\n public subparameters?: GenericParameter[];\r\n\r\n /** Solo per **repeater**: indica se è possibile aggiungere nuove istanze. Considerato **true** se non esplicitamente **false** */\r\n public canadd?: boolean;\r\n\r\n /** Solo per **repeater**: indica se è possibile rimuovere le istanze. Considerato **true** se non esplicitamente **false** */\r\n public candelete?: boolean;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\nexport * from './lib/parameter-type.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"esfaenza-parameters.mjs","sources":["../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/models/GenericParameterGroup.ts","../../../projects/parameters/src/lib/parameter-type.directive.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../projects/parameters/src/lib/es_parameters.component.html","../../../projects/parameters/src/lib/es_parameters.module.ts","../../../projects/parameters/src/lib/models/GenericParameter.ts","../../../projects/parameters/src/public-api.ts","../../../projects/parameters/src/esfaenza-parameters.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/**\r\n * Classe di localizzazione per il componente **EsParametersComponent**\r\n */\r\n@Injectable()\r\nexport class EsParametersLoc extends LocalizationService {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Seleziona\", [\"Select\"])\r\n super.set(\"it->en\", \"Aggiungi\", [\"Add\"])\r\n super.set(\"it->en\", \"Rimuovi\", [\"Remove\"])\r\n }\r\n}","import { GenericParameter } from \"./GenericParameter\";\r\n\r\n/**\r\n * Classe che rappresenta un gruppo di parametri generico\r\n */\r\nexport class GenericParameterGroup {\r\n\r\n /**\r\n * Costruttore\r\n * @param {string} groupId ID del gruppo\r\n * @param {string} groupName Descrizione del gruppo\r\n * @param {number} order ordine del gruppo\r\n */\r\n constructor(public groupId: string, public groupName: string, public order: number, public size?: number) {\r\n this.parameters = [];\r\n this.subgroups = [];\r\n }\r\n\r\n /** Lista di Generic Parameters */\r\n public parameters: GenericParameter[];\r\n\r\n /** Eventuale lista di sottogruppi */\r\n public subgroups: GenericParameterGroup[];\r\n}","import { Directive, Input, TemplateRef } from \"@angular/core\";\n\n/**\n * Direttiva strutturale che permette di registrare un template custom per un\n * determinato tipo di parametro all'interno di **es-parameters**.\n *\n * La direttiva non renderizza nulla di per sé: espone soltanto il proprio\n * **TemplateRef** al componente {@link EsParametersComponent}, che lo utilizza\n * per graficare i parametri il cui **type** corrisponde a quello indicato.\n *\n * Esempio di utilizzo:\n * ```html\n * <es-parameters [(ngModel)]=\"parameters\" [Form]=\"form\" name=\"parameters\">\n * <span *parameterType=\"'customProduct'; let par; let changed = changed\">\n * <my-widget [(ngModel)]=\"par.value\" (change)=\"changed()\"></my-widget>\n * </span>\n * </es-parameters>\n * ```\n *\n * Il contesto passato al template contiene:\n * - **$implicit** / **par**: il {@link GenericParameter} da graficare\n * - **changed**: funzione da richiamare per propagare le modifiche via ngModel\n * - **finalized**: funzione da richiamare quando l'input è finalizzato\n * - **Form**, **DisplayMode**, **Readonly**, **InputColWidth**: input del componente ospitante\n */\n@Directive({\n selector: \"[parameterType]\",\n standalone: false\n})\nexport class ParameterTypeDirective {\n\n /** Tipo di parametro (**GenericParameter.type**) a cui associare questo template custom */\n @Input() parameterType: string;\n\n /**\n * Costruttore\n *\n * @ignore\n */\n constructor(public templateRef: TemplateRef<any>) { }\n}\n","// Angular\r\nimport { ControlValueAccessor, UntypedFormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { AfterContentInit, ChangeDetectorRef, Component, ContentChildren, EventEmitter, forwardRef, Injector, Input, OnChanges, Output, QueryList, SimpleChanges, TemplateRef, ViewEncapsulation } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { DateService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Classi\r\nimport { GenericParameter } from './models/GenericParameter';\r\n\r\n// Applicazione\r\nimport { EsParametersLoc } from \"./es_parameters.component.loc\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { GenericParameterGroup } from \"./models/GenericParameterGroup\";\r\nimport { ParameterTypeDirective } from \"./parameter-type.directive\";\r\n\r\n/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */\r\n@Component({\r\n selector: \"es-parameters\",\r\n providers: [\r\n { provide: LocalizationService, useClass: EsParametersLoc },\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }\r\n ],\r\n styleUrls: [\"./es_parameters.component.scss\"],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: \"./es_parameters.component.html\",\r\n standalone: false\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, AfterContentInit, OnChanges {\r\n\r\n /** Indica se si lavora a singolo parametro forzato dentro un array for the glory of satan */\r\n private SingleParameterMode: boolean = false;\r\n\r\n /**\r\n * Template custom registrati dai consumer tramite la direttiva **[parameterType]**,\r\n * proiettati come content children dentro **es-parameters**\r\n *\r\n * @ignore\r\n */\r\n @ContentChildren(ParameterTypeDirective) private CustomTemplateDirectives: QueryList<ParameterTypeDirective>;\r\n\r\n /** Mappa tipo parametro -> TemplateRef custom registrati localmente tramite direttiva */\r\n private CustomTemplates: { [type: string]: TemplateRef<any> } = {};\r\n\r\n /**\r\n * Template custom ereditati da un **es-parameters** genitore (es. istanze di un repeater),\r\n * così i template registrati sul componente esterno sono disponibili anche nei componenti annidati\r\n */\r\n @Input() ParentCustomTemplates: { [type: string]: TemplateRef<any> } = {};\r\n\r\n /**\r\n * Unione dei template custom locali (**CustomTemplates**) e di quelli ereditati (**ParentCustomTemplates**).\r\n * È la mappa effettivamente usata per il lookup e propagata ai componenti annidati.\r\n */\r\n public MergedCustomTemplates: { [type: string]: TemplateRef<any> } = {};\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Parameters: GenericParameter[];\r\n\r\n /** Modello del componente su cui vengono effettuate le graficazioni */\r\n public Groups: GenericParameterGroup[];\r\n\r\n /** Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà */\r\n private ParametersCache: { [id: string]: GenericParameter };\r\n\r\n /**\r\n * Pipeline di Angular \r\n * \r\n * @ignore\r\n */\r\n propagateChange = (_: any) => { };\r\n\r\n @Input() BooleanSliderMode:boolean = false;\r\n /** Indica che il parametro deve essere in modalità display */\r\n @Input() DisplayMode: boolean = false;\r\n\r\n /** Indica che il parametro (In Display mode!!) non appare se vuoto. In più, se tutti sono vuoti, fa vedere una bella card \"non ci sono parametri presenti\" */\r\n @Input() HideEmpty: boolean = false;\r\n\r\n /** Indica che l'ultimo parametro non deve avere margine in fondo */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /** col-md-X per la label */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /** col-md-X per l'input */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */\r\n @Input() submitted: boolean = false;\r\n\r\n /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */\r\n @Input() Removal: boolean = false;\r\n\r\n /** Indica se i componenti di Input generati sono Readonly o no */\r\n @Input() Readonly: boolean = false;\r\n\r\n /** Indica il formato lista che dev'essere utilizzato */\r\n @Input() ListFormat: 'CommaSeparated' | 'Array' = 'Array';\r\n\r\n /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */\r\n @Input() Form: NgForm = null;\r\n\r\n /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */\r\n @Input() AutocompleteHideChoicesOnSelection: boolean = false;\r\n\r\n /** Funzione da utilizzare per tirare fuori i dati di un autocomplete */\r\n @Input() AutoCompleteDataRetrieve: (parameter: GenericParameter, search: string, byid: boolean) => Observable<{ id: string, description: string }[]>\r\n\r\n /** Indica come deve funzionare la multiselect */\r\n @Input() MultiselectMode: 'CommaSeparated' | 'Array' | 'JsonArray' = 'CommaSeparated';\r\n\r\n /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi \"X Y\" */\r\n @Input() set LabelInputRatio(input: string) {\r\n var ratio = input.split(/\\s/);\r\n this.LabelColWidth = parseInt(ratio[0]);\r\n this.InputColWidth = parseInt(ratio[1]);\r\n }\r\n\r\n /** Emette l'ID del parametro modificato */\r\n @Output() inputFinalized: EventEmitter<GenericParameter> = new EventEmitter<GenericParameter>();\r\n\r\n public AllParametersEmpty: boolean = false;\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(private utiExts: UtilityService, public lc: LocalizationService, public cdr: ChangeDetectorRef, private inj: Injector, public dates: DateService) { }\r\n\r\n ngOnInit() {\r\n // Qui gli input dovrebbero essere settati. Alcuni form-roba non prendono bene i cambi di input\r\n // Non sta funzionando come speravo... da rivedere\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Pipeline di Angular: raccoglie i template custom registrati tramite **[parameterType]**\r\n * e li indicizza per tipo. Si riaggiorna se la lista dei template proiettati cambia.\r\n *\r\n * @ignore\r\n */\r\n ngAfterContentInit() {\r\n this.buildCustomTemplates();\r\n this.CustomTemplateDirectives.changes.subscribe(() => {\r\n this.buildCustomTemplates();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * (Ri)costruisce la mappa tipo parametro -> TemplateRef a partire dalle direttive proiettate\r\n *\r\n * @ignore\r\n */\r\n private buildCustomTemplates() {\r\n this.CustomTemplates = {};\r\n this.CustomTemplateDirectives.forEach(dir => {\r\n if (!dir.parameterType)\r\n console.warn(\"@esfaenza/parameters: direttiva [parameterType] senza tipo specificato, verrà ignorata\");\r\n else\r\n this.CustomTemplates[dir.parameterType] = dir.templateRef;\r\n });\r\n this.mergeCustomTemplates();\r\n }\r\n\r\n /**\r\n * Ricalcola **MergedCustomTemplates** come unione di quelli ereditati e di quelli locali\r\n * (i locali hanno la precedenza)\r\n *\r\n * @ignore\r\n */\r\n private mergeCustomTemplates() {\r\n this.MergedCustomTemplates = { ...(this.ParentCustomTemplates ?? {}), ...this.CustomTemplates };\r\n }\r\n\r\n /**\r\n * Pipeline di Angular: ricalcola i template ereditati quando cambiano dall'esterno (es. componenti annidati)\r\n *\r\n * @ignore\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes[\"ParentCustomTemplates\"])\r\n this.mergeCustomTemplates();\r\n }\r\n\r\n /**\r\n * Restituisce il template custom (locale o ereditato) registrato per un determinato tipo di parametro, se presente\r\n *\r\n * @param {string} type Tipo del parametro (**GenericParameter.type**)\r\n * @returns Il **TemplateRef** custom associato, oppure **null** se non ne esiste uno\r\n */\r\n public getCustomTemplate(type: string): TemplateRef<any> | null {\r\n return this.MergedCustomTemplates[type] ?? null;\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova istanza ad un parametro di tipo **repeater**, clonandola dal prototipo **subparameters**\r\n *\r\n * @param {GenericParameter} par Parametro repeater a cui aggiungere l'istanza\r\n */\r\n public addRepeaterItem(par: GenericParameter) {\r\n if (!par.subparameters)\r\n return;\r\n\r\n if (!Array.isArray(par.value))\r\n par.value = [];\r\n\r\n par.value.push(this.utiExts.deepClone(par.subparameters));\r\n this.changed();\r\n }\r\n\r\n /**\r\n * Rimuove l'istanza indicata da un parametro di tipo **repeater**\r\n *\r\n * @param {GenericParameter} par Parametro repeater da cui rimuovere l'istanza\r\n * @param {number} index Indice dell'istanza da rimuovere\r\n */\r\n public removeRepeaterItem(par: GenericParameter, index: number) {\r\n par.value.splice(index, 1);\r\n this.changed();\r\n }\r\n\r\n /**\r\n * Indica se è possibile aggiungere istanze ad un parametro repeater (**canadd** true se non esplicitamente false)\r\n */\r\n public canAddRepeaterItem(par: GenericParameter): boolean {\r\n return par.canadd !== false;\r\n }\r\n\r\n /**\r\n * Indica se è possibile rimuovere le istanze di un parametro repeater (**candelete** true se non esplicitamente false).\r\n * L'eventuale obbligatorietà (**required**) è demandata alla validazione del form, non al blocco della rimozione.\r\n */\r\n public canDeleteRepeaterItem(par: GenericParameter): boolean {\r\n return par.candelete !== false;\r\n }\r\n\r\n /**\r\n * Reidrata il valore di un parametro **repeater** dalla sua forma \"wire\" (stringa JSON values-only)\r\n * al modello interno **GenericParameter[][]**, clonando il prototipo **subparameters** per ogni istanza.\r\n *\r\n * Regole:\r\n * - null / undefined / stringa vuota: nessuna istanza (parte vuoto, l'utente aggiunge con \"Aggiungi\")\r\n * - stringa JSON: parse in una lista di mappe id-valore (una per istanza)\r\n * - **GenericParameter[][]** già interno (writeValue rientrante): lasciato invariato\r\n *\r\n * @ignore\r\n */\r\n private hydrateRepeaterValue(par: GenericParameter): GenericParameter[][] {\r\n // Valore già interno (array di istanze, ognuna un array di parametri): non lo ritocco\r\n if (Array.isArray(par.value) && (par.value.length == 0 || Array.isArray(par.value[0])))\r\n return par.value;\r\n\r\n let valueMaps: { [id: string]: any }[];\r\n\r\n if (par.value == null || par.value === \"\")\r\n valueMaps = []; // parte senza istanze\r\n else if (typeof par.value === \"string\")\r\n valueMaps = JSON.parse(par.value);\r\n else\r\n valueMaps = par.value; // già lista di mappe id->valore\r\n\r\n return (valueMaps ?? []).map(vm => this.hydrateRepeaterInstance(par, vm));\r\n }\r\n\r\n /**\r\n * Costruisce una singola istanza di repeater clonando **subparameters** e applicando i valori dalla mappa id->valore\r\n *\r\n * @ignore\r\n */\r\n private hydrateRepeaterInstance(par: GenericParameter, valueMap: { [id: string]: any } | null): GenericParameter[] {\r\n let instance = this.utiExts.deepClone(par.subparameters ?? []) as GenericParameter[];\r\n if (valueMap)\r\n instance.forEach(p => { if (Object.prototype.hasOwnProperty.call(valueMap, p.id)) p.value = valueMap[p.id]; });\r\n return instance;\r\n }\r\n\r\n /**\r\n * Serializza il modello interno di un repeater (**GenericParameter[][]**) nella stringa JSON \"values-only\"\r\n * (lista di mappe id->valore, una per istanza) da propagare via ngModel\r\n *\r\n * @ignore\r\n */\r\n private serializeRepeaterValue(instances: GenericParameter[][]): string {\r\n let maps = (instances ?? []).map(instance =>\r\n (instance ?? []).reduce((acc, p) => { acc[p.id] = p.value; return acc; }, {} as { [id: string]: any })\r\n );\r\n return JSON.stringify(maps);\r\n }\r\n\r\n /**\r\n * Riferimento stabile a **changed()** da passare nel contesto dei template custom,\r\n * così i consumer possono propagare le modifiche via ngModel\r\n *\r\n * @ignore\r\n */\r\n public boundChanged = () => this.changed();\r\n\r\n /**\r\n * Riferimento stabile a **onInputFinalized()** da passare nel contesto dei template custom\r\n *\r\n * @ignore\r\n */\r\n public boundFinalized = (par: GenericParameter) => this.onInputFinalized(par);\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n\r\n if (!obj)\r\n return;\r\n\r\n if(!Array.isArray(obj))\r\n this.SingleParameterMode = true;\r\n \r\n this.Parameters = Array.isArray(obj) ? obj : [obj];\r\n\r\n this.ParametersCache = {};\r\n\r\n this.Parameters.forEach(t => {\r\n this.ParametersCache[t.id] = t;\r\n\r\n if (!t.typecode && !t.type)\r\n console.warn(\"Non è stato specificato né un type né un typecode\");\r\n\r\n if (t.typecode && !t.type)\r\n t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);\r\n\r\n if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))\r\n console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value?.toString()?.toLowerCase() === \"true\";\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n this.changed();\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori\r\n if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value) && (t.sourceapi || !t.enumvalues))\r\n t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];\r\n\r\n // Repeater: il valore viaggia SEMPRE come stringa JSON \"values-only\" (una lista di mappe id->valore\r\n // per istanza) e viene reidratato internamente in un GenericParameter[][] clonando il prototipo subparameters.\r\n if (t.type == 'repeater')\r\n t.value = this.hydrateRepeaterValue(t);\r\n });\r\n\r\n this.AllParametersEmpty = this.Parameters.every(t => !t.value);\r\n this.reviewParametersBindings();\r\n this.generateGroups();\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i gruppi dei parametri\r\n */\r\n generateGroups() {\r\n this.Groups = [];\r\n\r\n if (this.Parameters?.length > 0) {\r\n this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);\r\n\r\n // Ciclo tutti i parametri\r\n for (let i = 0; this.Parameters.length > i; i++) {\r\n let par = this.Parameters[i];\r\n\r\n let parGroupId = par.group ?? par.id;\r\n let parGroupName = par.groupdescription ?? \"\";\r\n\r\n // Nel caso di più ordinamenti nello stesso gruppo, vince quello piu \"alto\"\r\n let groupOrder = par.order;\r\n\r\n // Se il gruppo non esiste, lo aggiungo\r\n // ATTENZIONE: Tutti i par.groupsize devono corrispondere, o verrà letto solo uno a caso di loro.\r\n if (!this.Groups.some(x => x.groupId == parGroupId))\r\n this.Groups.push(new GenericParameterGroup(parGroupId, parGroupName, groupOrder, par.groupsize));\r\n\r\n // Inserisco il parametro dentro al suo gruppo\r\n this.Groups.find(g => g.groupId == parGroupId)!.parameters.push(par)\r\n }\r\n\r\n // Gestione sottogruppi\r\n let subgroups: GenericParameterGroup[] = this.Groups.filter(group => group.groupId.includes('§'));\r\n for (let _; subgroups.length > 0; () => { }) {\r\n // Recupero la lista di gruppi che hanno sottogruppi\r\n // Per convenzione, nel nome contengono \"§\"\r\n this.tryToAddSubgroups(subgroups);\r\n subgroups = this.Groups.filter(group => group.groupId.includes('§'));\r\n }\r\n\r\n this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri\r\n */\r\n tryToAddSubgroups(subgroups: GenericParameterGroup[]) {\r\n for (let i = 0; subgroups.length > i; i++) {\r\n let sub = subgroups[i];\r\n\r\n // Ottengo un lista con la gerarchia dei gruppi, in ordine\r\n let groupsParentHierarchy = sub.groupId.split('§') ?? [];\r\n\r\n // Recupero il gruppo padre\r\n let parentGroupName = sub.groupId.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);\r\n\r\n // Se il gruppo padre non esiste, lo aggiungo\r\n if (!this.Groups.some(x => x.groupId == parentGroupName)) {\r\n this.Groups.push(new GenericParameterGroup(parentGroupName, parentGroupName, sub.order));\r\n }\r\n\r\n // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)\r\n // e lo aggiungo ai sottogruppi del padre\r\n sub.groupId = sub.groupId.replace(`${parentGroupName}§`, '');\r\n let parentGroup = this.Groups.find(x => x.groupId == parentGroupName);\r\n if (parentGroup?.subgroups.some(s => s.groupId == sub.groupName)) {\r\n let target = parentGroup.subgroups.find(f => f.groupId == sub.groupId);\r\n sub.parameters.map(p => target.parameters.push(p));\r\n sub.subgroups.map(s => target.subgroups.push(s));\r\n target.order = sub.order < target.order ? sub.order : target.order;\r\n } else {\r\n parentGroup?.subgroups.push(sub);\r\n }\r\n\r\n // Rimuovo il sottogruppo gruppo dalla lista\r\n this.Groups.splice(this.Groups.indexOf(sub), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnChange(fn): void { this.propagateChange = fn; }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public registerOnTouched(fn): void { }\r\n\r\n public evaluateRadioButtons(par: GenericParameter) {\r\n if (par.radiobuttonsource) {\r\n var allRadios = this.Parameters.filter(t => t.radiobuttonsource == par.radiobuttonsource);\r\n // Se dopo una checkata su radiobuttons sono tutti a false, quello che ho decheckettato deve essere richeckato dato che uno è sempre obbligatorio\r\n if (allRadios.every(t => !t.value || t.value == \"false\"))\r\n par.value = true;\r\n else {\r\n // Altrimenti dechecko tutti e richecko solo me stesso\r\n allRadios.forEach(t => { t.value = false; })\r\n par.value = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel\r\n */\r\n public changed() {\r\n if (!this.Parameters)\r\n return;\r\n\r\n if(!this.Groups)\r\n this.generateGroups();\r\n \r\n // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri\r\n var changes = this.reviewParametersBindings();\r\n if (changes.length > 0) {\r\n\r\n // In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)\r\n // distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.\r\n // 1: Faccio una copia del parametro corrente\r\n // 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia\r\n // 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo\r\n changes.forEach(ch => {\r\n let index = this.Parameters.findIndex(t => t.id == ch);\r\n let parameterCopy = this.utiExts.deepClone(this.Parameters[index]) as GenericParameter;\r\n\r\n let parameterRefFixed = false;\r\n for (let ig = 0; ig < this.Groups.length; ig++) {\r\n var g = this.Groups[ig];\r\n for (let ip = 0; ip < g.parameters.length; ip++) {\r\n var p = g.parameters[ip]\r\n if (p === this.Parameters[index]) {\r\n this.Groups[ig].parameters[ip] = parameterCopy;\r\n parameterRefFixed = true;\r\n break;\r\n }\r\n }\r\n if (parameterRefFixed)\r\n break;\r\n }\r\n \r\n this.Parameters[index] = parameterCopy\r\n this.ParametersCache[ch] = this.Parameters[index];\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n var ParametersClone = this.utiExts.deepClone(this.Parameters) as GenericParameter[];\r\n\r\n // Aggiusto le modalità di funzionamento dei parametri lista\r\n ParametersClone?.forEach(t => {\r\n if (t.type == \"enum\" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n else if (t.type == \"enum\" && this.MultiselectMode == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = t.value.join(',');\r\n else if (t.type == \"enum\" && this.MultiselectMode == 'Array' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = JSON.stringify(t.value);\r\n else if (t.type == \"enum\" && this.MultiselectMode == 'JsonArray' && t.multienum && t.value && Array.isArray(t.value))\r\n t.value = \"[\" + t.value.map(t => `\\\"${t}\\\"`).join(',') + \"]\";\r\n // Repeater: serializzo le istanze come stringa JSON \"values-only\" (lista di mappe id->valore)\r\n else if (t.type == \"repeater\")\r\n t.value = this.serializeRepeaterValue(t.value);\r\n });\r\n\r\n this.propagateChange(this.SingleParameterMode ? ParametersClone[0] : ParametersClone);\r\n }\r\n\r\n /**\r\n * Rimuove il parametro selezionato e propaga il modello\r\n * \r\n * @param {GenericParameter} par Parametro da rimuovere\r\n */\r\n public removeParameter(par: GenericParameter) {\r\n this.Parameters.splice(this.Parameters.indexOf(par), 1);\r\n this.changed();\r\n }\r\n\r\n public GenerateParameterGroups() {\r\n let Groups: { id: string, groups: string[], order: number }[] = [];\r\n\r\n this.Parameters.forEach(param => {\r\n Groups.push({ id: param.id, groups: param.group.split(\"§\"), order: param.order });\r\n });\r\n\r\n let GroupedGroups = Groups.reduce((r, a) => {\r\n let firstGroupId = a.groups?.length > 0 ? a.groups[0] : \"\";\r\n r[firstGroupId] = [...r[firstGroupId] || [], a];\r\n return r;\r\n }, {});\r\n\r\n console.log(GroupedGroups);\r\n\r\n // Ciclo del risultato, aggiungendo i gruppi al modello\r\n // Per ogni gruppo che aggiungo, assegno i parametri in ordine\r\n }\r\n\r\n /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n * \r\n * @returns {string[]} lista con gli id dei parametri che sono stati modificati\r\n */\r\n private reviewParametersBindings(): string[] {\r\n let changes = [];\r\n for (let i = 0; i < this.Parameters.length; i++) {\r\n var p = this.Parameters[i];\r\n\r\n if (p.requiredexp) {\r\n let prevReq = p.required;\r\n p.required = this.evaluate(p.requiredexp);\r\n if (prevReq != p.required)\r\n changes.push(p.id);\r\n }\r\n if (p.visibleexp) {\r\n let prevVisi = p.visible;\r\n p.visible = this.evaluate(p.visibleexp);\r\n if (prevVisi != p.visible)\r\n changes.push(p.id)\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n /**\r\n * Valuta un'espressione in base ai parametri presenti nel modello attuale\r\n * \r\n * @param expr Espressione da valutare scritta nel formato (ripetibile) \"ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)\" separato eventualmente da && ed ||\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n private evaluate(expr: string): boolean {\r\n var regex = /\\s?([a-zA-Z0-9_-]+)\\s?(!=|==|<|>|<=|>=)\\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;\r\n\r\n var matches: string[] = [];\r\n var finalExpr = expr;\r\n while (matches = regex.exec(expr)) {\r\n var fullMatch = matches[0].trim();\r\n var id = matches[1].trim();\r\n var operation = matches[2].trim();\r\n let bValue = matches[3].trim().trim();\r\n var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);\r\n }\r\n\r\n return eval(finalExpr);\r\n }\r\n\r\n /**\r\n * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore\r\n * Richiamata da EVAL\r\n * \r\n * @param {string} key Chiave del parametro di cui verificare il valore\r\n * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=\r\n * @param {string} value Valore di confronto da utilizzare\r\n * \r\n * @returns **true** se la condizione è verificata, **false** altrimenti\r\n */\r\n public checkValue(key: string, operator: string, value: string): boolean {\r\n var rPar = this.ParametersCache[key];\r\n try {\r\n switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${this.defaultIfnullOrUndefined(rPar.value, ``)}\" ${operator} \"${this.defaultIfnullOrUndefined(value, ``)}\"`);\r\n case \"boolean\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);\r\n case \"number\":\r\n return eval(`${this.defaultIfnullOrUndefined(rPar.value, '\"\"', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '\"\"', true).replace(',', '.')}`);\r\n case \"date\":\r\n let parDateConv = `this.dates.getDateConvertion(\"${rPar.value}\")`;\r\n let valDateConv = `this.dates.getDateConvertion(\"${value}\")`;\r\n\r\n switch (operator) {\r\n\r\n case \"==\": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);\r\n case \"!=\": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);\r\n case \">\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);\r\n case \"<\": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);\r\n case \">=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n case \"<=\": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n console.warn(\"Errori nella valutazione dell'espressione. Fallback a false\");\r\n return false;\r\n }\r\n\r\n throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n\r\n /** @ignore */\r\n private defaultIfnullOrUndefined<T>(item: T, dflt: T, emptyStringIsNull: boolean = false): T {\r\n if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == \"\"))\r\n return dflt;\r\n return item;\r\n }\r\n\r\n /** @ignore */\r\n public getSource(parameter: GenericParameter, search: string, byid: boolean): Observable<{ id: string, description: string }[]> {\r\n if (!this.AutoCompleteDataRetrieve) {\r\n console.error(\"@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete\");\r\n return of([])\r\n }\r\n else\r\n return this.AutoCompleteDataRetrieve(parameter, search, byid);\r\n }\r\n\r\n public onInputFinalized(parameter: GenericParameter) {\r\n this.inputFinalized.emit(parameter);\r\n }\r\n}","<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\" class=\"row\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\" class=\"col-md-{{group.size ?? 12}}\">\r\n <div style=\"{{ group.groupName ? 'border: 1px solid #ddd; padding-left: 15px; padding-right: 15px' : '' }}\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n @if(item.group && Initialized){\r\n\r\n <div *ngIf=\"item.group.groupName\" style=\"margin-left: -15px; margin-right: -15px;\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">{{item.group.groupName}}</div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\" class=\"row\">\r\n @for (par of item.group.parameters; track $index; let i = $index; let last = $last) {\r\n\r\n @if (!DisplayMode || !HideEmpty || par.value) {\r\n\r\n @if (par.visible) {\r\n\r\n <div class=\"row form-group\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" class=\"col-md-{{par.parametersize ?? 12}}\" >\r\n\r\n @if(par.type != 'text' && par.type != 'repeater'){\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">\r\n @if (Removal) {\r\n <span class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"> </span>\r\n }\r\n {{ par.description }}{{ par.required ? '*' : '' }}:\r\n </label>\r\n }\r\n @switch (par.type) {\r\n\r\n @case ('date') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('datetime') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-date>\r\n </div>\r\n }\r\n\r\n @case ('string') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('number') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('integer') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]+$'}}\">\r\n </form-input>\r\n </div>\r\n }\r\n\r\n @case ('boolean') {\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\">\r\n <form-checkbox [SliderMode]=\"BooleanSliderMode\" [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" \r\n (inputChange)=\"evaluateRadioButtons(par); changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-checkbox>\r\n </div>\r\n }\r\n\r\n @case ('text') {\r\n <div class=\"col-md-12 m-t-5\">\r\n <form-info [LabelInputRatio]=\"'0 12'\"><span style=\"font-size: 16px;\">{{par.value}}</span></form-info>\r\n </div>\r\n }\r\n\r\n @case ('enum') {\r\n @if (!par.sourceapi) {\r\n\r\n @if (!par.multienum) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator [Source]=\"par.enumvalues\">\r\n </form-select>\r\n </div>\r\n }\r\n @else {\r\n\r\n @if (par.enumvalues) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [InOutFormat]=\"MultiselectMode == 'JsonArray'\r\n ? 'JsonList'\r\n : MultiselectMode == 'CommaSeparated'\r\n ? 'CommaSeparatedList'\r\n : 'List'\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [disabled]=\"Readonly || par.isreadonly\"\r\n [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-multiselect>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Placeholder]=\"('Seleziona' | localize : lc) + '...'\" multiple forceSelection [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [multiple]=\"par.multienum\" [disabled]=\"Readonly || par.isreadonly\"\r\n [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\" #validator>\r\n </form-autocomplete>\r\n </div>\r\n }\r\n }\r\n\r\n @case ('file') {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [disabled]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\"\r\n #validator (inputChange)=\"changed();\" (inputFinalized)=\"onInputFinalized(par);\">\r\n </form-file>\r\n </div>\r\n }\r\n\r\n @case ('repeater') {\r\n <div class=\"col-md-12 pars-repeater\">\r\n @if (par.description) {\r\n <div class=\"pars-subgroup-title\">{{ par.description }}{{ par.required ? '*' : '' }}</div>\r\n }\r\n\r\n @for (item_rep of par.value; track $index; let j = $index) {\r\n <div class=\"pars-subgroup pars-repeater-item\">\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canDeleteRepeaterItem(par)) {\r\n <div class=\"pars-repeater-item-header\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger pars-repeater-remove\" (click)=\"removeRepeaterItem(par, j)\">\r\n <span class=\"fa fa-remove\"> </span>{{ 'Rimuovi' | localize : lc }}\r\n </button>\r\n </div>\r\n }\r\n <es-parameters [(ngModel)]=\"par.value[j]\" name=\"{{item.index}}par{{i}}_{{par.id}}_rep{{j}}\" [ngModelOptions]=\"{ standalone: true }\"\r\n [Form]=\"Form\" [DisplayMode]=\"DisplayMode\" [Readonly]=\"Readonly || par.isreadonly\"\r\n [ListFormat]=\"ListFormat\" [MultiselectMode]=\"MultiselectMode\"\r\n [LabelColWidth]=\"LabelColWidth\" [InputColWidth]=\"InputColWidth\"\r\n [BooleanSliderMode]=\"BooleanSliderMode\" [AutocompleteHideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\"\r\n [AutoCompleteDataRetrieve]=\"AutoCompleteDataRetrieve\" [ParentCustomTemplates]=\"MergedCustomTemplates\"\r\n (ngModelChange)=\"changed();\" (inputFinalized)=\"onInputFinalized($event);\">\r\n </es-parameters>\r\n </div>\r\n }\r\n\r\n @if (!DisplayMode && !Readonly && !par.isreadonly && canAddRepeaterItem(par)) {\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary pars-repeater-add\" (click)=\"addRepeaterItem(par)\">\r\n <span class=\"fa fa-plus\"> </span>{{ 'Aggiungi' | localize : lc }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n @if (getCustomTemplate(par.type)) {\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"getCustomTemplate(par.type); context: {\r\n $implicit: par,\r\n par: par,\r\n changed: boundChanged,\r\n finalized: boundFinalized,\r\n Form: Form,\r\n DisplayMode: DisplayMode,\r\n Readonly: Readonly,\r\n InputColWidth: InputColWidth\r\n }\"></ng-container>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n }\r\n }\r\n }\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non è presente nulla da visualizzare\r\n </div>\r\n </div>\r\n }\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\nimport { ParameterTypeDirective } from './parameter-type.directive';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent, ParameterTypeDirective],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent, ParameterTypeDirective]\r\n})\r\nexport class EsParametersModule {\r\n }\r\n","import { AppFile } from \"@esfaenza/forms-and-validations\";\r\n\r\n/**\r\n * Classe che rappresenta un parametro generico\r\n */\r\nexport class GenericParameter {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice del parametro\r\n * @param {string} description Descrizione del parametro\r\n * @param {string} pattern Pattern di validazione\r\n * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input \r\n * @param {boolean} required Indica se il valore è obbligatorio o meno\r\n * @param {any} v_default Valore di default per questo Parametro\r\n * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere \r\n * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)\r\n * @param {string} sourceapi Nei casi in cui il **type** è **enum** indica l'api da cui recuperare i valori da bindare alla select o alla multiselect\r\n * @param {boolean} pageddata Nei casi in cui il **type** è **enum** indica che l'api specificata eventualmetne da **sourceapi** è paginata\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string,\r\n public pattern: string,\r\n type: 'date' | 'string' | 'text' | 'number' | 'boolean' | 'file' | 'enum',\r\n public required: boolean,\r\n v_default: any = null,\r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean,\r\n public sourceapi?: string,\r\n public pageddata?: boolean) {\r\n\r\n this.type = type == 'enum' ? null : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.isreadonly = false;\r\n\r\n if (!this.enumtype && enumvalues.length != 0)\r\n console.error(\"impossibile gestire valori di dizionario per un parametro non di tipo enum\");\r\n\r\n if (v_default != null)\r\n this.value = v_default;\r\n }\r\n\r\n /** Tipo di dato rappresentato da questo parametro */\r\n public type?: 'date' | 'string' | 'number' | 'boolean' | 'file' | 'enum' | 'integer' | 'datetime' | string;\r\n\r\n /** Typecode lato C# che rappresenta il tipo di dato */\r\n public typecode: number;\r\n\r\n /** Indica se il campo specificato dev'essere di sola lettura o meno */\r\n public isreadonly: boolean;\r\n\r\n /** Valore del parametro */\r\n public value: any;\r\n\r\n public radiobuttonsource: string =\"\";\r\n\r\n public radiobuttonunderlyingvalue?: any;\r\n\r\n public radiobuttonunderlyingdatatype?: 'date' | 'string' | 'number' | 'boolean' | 'file' | 'enum' | 'integer' | 'datetime' | string;\r\n\r\n /** File del parametro */\r\n public file: AppFile;\r\n\r\n /** Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto */\r\n public visible: boolean;\r\n\r\n /** Tipo Enum, valorizzato dal Backend */\r\n public enumtype: string;\r\n\r\n /** Tipo Dizionario, valorizzato dal Backend */\r\n public dicttype: string;\r\n\r\n /** Espressione di obbligatorietà */\r\n public requiredexp?: string;\r\n\r\n /** Espressione di visibilità */\r\n public visibleexp?: string;\r\n\r\n /** Ordinamento in base al quale verranno ordinati i parametri */\r\n public order: number;\r\n\r\n /** Gruppo di appartenenza del parametro */\r\n public group: string;\r\n\r\n /** descrizione del gruppo per scrivere qualcosa come separatore */\r\n public groupdescription: string;\r\n\r\n /** Grandezza del gruppo di appartenenza del parametro */\r\n public groupsize: number;\r\n\r\n /** Grandezza dei parametri */\r\n public parametersize: number;\r\n\r\n /** Valori extra se da passare da una parte all'altra */\r\n public extras: {[id:string] : string};\r\n\r\n /**\r\n * Prototipo dei parametri figli di un parametro di tipo **repeater**.\r\n * Definisce i campi di una singola istanza; ogni nuova istanza aggiunta è un clone di questo template.\r\n */\r\n public subparameters?: GenericParameter[];\r\n\r\n /** Solo per **repeater**: indica se è possibile aggiungere nuove istanze. Considerato **true** se non esplicitamente **false** */\r\n public canadd?: boolean;\r\n\r\n /** Solo per **repeater**: indica se è possibile rimuovere le istanze. Considerato **true** se non esplicitamente **false** */\r\n public candelete?: boolean;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\nexport * from './lib/parameter-type.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { AfterContentInit, ChangeDetectorRef, EventEmitter, Injector,
|
|
2
|
+
import { AfterContentInit, OnChanges, ChangeDetectorRef, TemplateRef, EventEmitter, Injector, SimpleChanges } from '@angular/core';
|
|
3
3
|
import * as i5 from '@angular/forms';
|
|
4
4
|
import { ControlValueAccessor, NgForm } from '@angular/forms';
|
|
5
5
|
import * as i4 from '@esfaenza/localizations';
|
|
@@ -113,7 +113,7 @@ declare class GenericParameterGroup {
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
/** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */
|
|
116
|
-
declare class EsParametersComponent implements ControlValueAccessor, AfterContentInit {
|
|
116
|
+
declare class EsParametersComponent implements ControlValueAccessor, AfterContentInit, OnChanges {
|
|
117
117
|
private utiExts;
|
|
118
118
|
lc: LocalizationService;
|
|
119
119
|
cdr: ChangeDetectorRef;
|
|
@@ -128,8 +128,22 @@ declare class EsParametersComponent implements ControlValueAccessor, AfterConten
|
|
|
128
128
|
* @ignore
|
|
129
129
|
*/
|
|
130
130
|
private CustomTemplateDirectives;
|
|
131
|
-
/** Mappa tipo parametro -> TemplateRef custom
|
|
131
|
+
/** Mappa tipo parametro -> TemplateRef custom registrati localmente tramite direttiva */
|
|
132
132
|
private CustomTemplates;
|
|
133
|
+
/**
|
|
134
|
+
* Template custom ereditati da un **es-parameters** genitore (es. istanze di un repeater),
|
|
135
|
+
* così i template registrati sul componente esterno sono disponibili anche nei componenti annidati
|
|
136
|
+
*/
|
|
137
|
+
ParentCustomTemplates: {
|
|
138
|
+
[type: string]: TemplateRef<any>;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Unione dei template custom locali (**CustomTemplates**) e di quelli ereditati (**ParentCustomTemplates**).
|
|
142
|
+
* È la mappa effettivamente usata per il lookup e propagata ai componenti annidati.
|
|
143
|
+
*/
|
|
144
|
+
MergedCustomTemplates: {
|
|
145
|
+
[type: string]: TemplateRef<any>;
|
|
146
|
+
};
|
|
133
147
|
/** Modello del componente su cui vengono effettuate le graficazioni */
|
|
134
148
|
Parameters: GenericParameter[];
|
|
135
149
|
/** Modello del componente su cui vengono effettuate le graficazioni */
|
|
@@ -201,7 +215,20 @@ declare class EsParametersComponent implements ControlValueAccessor, AfterConten
|
|
|
201
215
|
*/
|
|
202
216
|
private buildCustomTemplates;
|
|
203
217
|
/**
|
|
204
|
-
*
|
|
218
|
+
* Ricalcola **MergedCustomTemplates** come unione di quelli ereditati e di quelli locali
|
|
219
|
+
* (i locali hanno la precedenza)
|
|
220
|
+
*
|
|
221
|
+
* @ignore
|
|
222
|
+
*/
|
|
223
|
+
private mergeCustomTemplates;
|
|
224
|
+
/**
|
|
225
|
+
* Pipeline di Angular: ricalcola i template ereditati quando cambiano dall'esterno (es. componenti annidati)
|
|
226
|
+
*
|
|
227
|
+
* @ignore
|
|
228
|
+
*/
|
|
229
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
230
|
+
/**
|
|
231
|
+
* Restituisce il template custom (locale o ereditato) registrato per un determinato tipo di parametro, se presente
|
|
205
232
|
*
|
|
206
233
|
* @param {string} type Tipo del parametro (**GenericParameter.type**)
|
|
207
234
|
* @returns Il **TemplateRef** custom associato, oppure **null** se non ne esiste uno
|
|
@@ -225,8 +252,8 @@ declare class EsParametersComponent implements ControlValueAccessor, AfterConten
|
|
|
225
252
|
*/
|
|
226
253
|
canAddRepeaterItem(par: GenericParameter): boolean;
|
|
227
254
|
/**
|
|
228
|
-
* Indica se è possibile rimuovere
|
|
229
|
-
*
|
|
255
|
+
* Indica se è possibile rimuovere le istanze di un parametro repeater (**candelete** true se non esplicitamente false).
|
|
256
|
+
* L'eventuale obbligatorietà (**required**) è demandata alla validazione del form, non al blocco della rimozione.
|
|
230
257
|
*/
|
|
231
258
|
canDeleteRepeaterItem(par: GenericParameter): boolean;
|
|
232
259
|
/**
|
|
@@ -234,7 +261,7 @@ declare class EsParametersComponent implements ControlValueAccessor, AfterConten
|
|
|
234
261
|
* al modello interno **GenericParameter[][]**, clonando il prototipo **subparameters** per ogni istanza.
|
|
235
262
|
*
|
|
236
263
|
* Regole:
|
|
237
|
-
* - null / undefined / stringa vuota:
|
|
264
|
+
* - null / undefined / stringa vuota: nessuna istanza (parte vuoto, l'utente aggiunge con "Aggiungi")
|
|
238
265
|
* - stringa JSON: parse in una lista di mappe id-valore (una per istanza)
|
|
239
266
|
* - **GenericParameter[][]** già interno (writeValue rientrante): lasciato invariato
|
|
240
267
|
*
|
|
@@ -339,7 +366,7 @@ declare class EsParametersComponent implements ControlValueAccessor, AfterConten
|
|
|
339
366
|
}[]>;
|
|
340
367
|
onInputFinalized(parameter: GenericParameter): void;
|
|
341
368
|
static ɵfac: i0.ɵɵFactoryDeclaration<EsParametersComponent, never>;
|
|
342
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<EsParametersComponent, "es-parameters", never, { "BooleanSliderMode": { "alias": "BooleanSliderMode"; "required": false; }; "DisplayMode": { "alias": "DisplayMode"; "required": false; }; "HideEmpty": { "alias": "HideEmpty"; "required": false; }; "LastParameterNoMargin": { "alias": "LastParameterNoMargin"; "required": false; }; "LabelColWidth": { "alias": "LabelColWidth"; "required": false; }; "InputColWidth": { "alias": "InputColWidth"; "required": false; }; "submitted": { "alias": "submitted"; "required": false; }; "EmptyMessage": { "alias": "EmptyMessage"; "required": false; }; "Removal": { "alias": "Removal"; "required": false; }; "Readonly": { "alias": "Readonly"; "required": false; }; "ListFormat": { "alias": "ListFormat"; "required": false; }; "Form": { "alias": "Form"; "required": false; }; "AutocompleteHideChoicesOnSelection": { "alias": "AutocompleteHideChoicesOnSelection"; "required": false; }; "AutoCompleteDataRetrieve": { "alias": "AutoCompleteDataRetrieve"; "required": false; }; "MultiselectMode": { "alias": "MultiselectMode"; "required": false; }; "LabelInputRatio": { "alias": "LabelInputRatio"; "required": false; }; }, { "inputFinalized": "inputFinalized"; }, ["CustomTemplateDirectives"], never, false, never>;
|
|
369
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EsParametersComponent, "es-parameters", never, { "ParentCustomTemplates": { "alias": "ParentCustomTemplates"; "required": false; }; "BooleanSliderMode": { "alias": "BooleanSliderMode"; "required": false; }; "DisplayMode": { "alias": "DisplayMode"; "required": false; }; "HideEmpty": { "alias": "HideEmpty"; "required": false; }; "LastParameterNoMargin": { "alias": "LastParameterNoMargin"; "required": false; }; "LabelColWidth": { "alias": "LabelColWidth"; "required": false; }; "InputColWidth": { "alias": "InputColWidth"; "required": false; }; "submitted": { "alias": "submitted"; "required": false; }; "EmptyMessage": { "alias": "EmptyMessage"; "required": false; }; "Removal": { "alias": "Removal"; "required": false; }; "Readonly": { "alias": "Readonly"; "required": false; }; "ListFormat": { "alias": "ListFormat"; "required": false; }; "Form": { "alias": "Form"; "required": false; }; "AutocompleteHideChoicesOnSelection": { "alias": "AutocompleteHideChoicesOnSelection"; "required": false; }; "AutoCompleteDataRetrieve": { "alias": "AutoCompleteDataRetrieve"; "required": false; }; "MultiselectMode": { "alias": "MultiselectMode"; "required": false; }; "LabelInputRatio": { "alias": "LabelInputRatio"; "required": false; }; }, { "inputFinalized": "inputFinalized"; }, ["CustomTemplateDirectives"], never, false, never>;
|
|
343
370
|
}
|
|
344
371
|
|
|
345
372
|
/**
|