@esfaenza/parameters 11.2.11 → 11.2.12

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.
@@ -3,7 +3,7 @@ import { CommonModule } from '@angular/common';
3
3
  import { NgControl, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule } from '@angular/forms';
4
4
  import { FormsAndValidationsModule } from '@esfaenza/forms-and-validations';
5
5
  import { LocalizationService, LocalizationModule } from '@esfaenza/localizations';
6
- import { UtilityService, FullExtensionsModule } from '@esfaenza/extensions';
6
+ import { UtilityService, DateService, FullExtensionsModule } from '@esfaenza/extensions';
7
7
 
8
8
  /**
9
9
  * Token che indica il locale da utilizzare per l'applicazione. Sono supportati i locali "it-IT" ed "en-US"
@@ -40,11 +40,12 @@ class EsParametersComponent {
40
40
  *
41
41
  * @ignore
42
42
  */
43
- constructor(utiExts, lc, cdr, inj) {
43
+ constructor(utiExts, lc, cdr, inj, dates) {
44
44
  this.utiExts = utiExts;
45
45
  this.lc = lc;
46
46
  this.cdr = cdr;
47
47
  this.inj = inj;
48
+ this.dates = dates;
48
49
  /**
49
50
  * Pipeline di Angular
50
51
  *
@@ -99,9 +100,11 @@ class EsParametersComponent {
99
100
  */
100
101
  writeValue(obj) {
101
102
  this.Parameters = obj;
103
+ this.ParametersCache = {};
102
104
  if (!this.Parameters)
103
105
  return;
104
106
  this.Parameters.forEach(t => {
107
+ this.ParametersCache[t.id] = t;
105
108
  if (!t.typecode && !t.type)
106
109
  console.warn("Non è stato specificato né un type né un typecode");
107
110
  if (t.typecode && !t.type)
@@ -113,6 +116,7 @@ class EsParametersComponent {
113
116
  if (t.enumtype || t.dicttype)
114
117
  t.type = 'enum';
115
118
  });
119
+ this.reviewParametersBindings();
116
120
  }
117
121
  /**
118
122
  * Pipeline di Angular
@@ -130,9 +134,11 @@ class EsParametersComponent {
130
134
  let valid = true;
131
135
  if (this.Parameters && this.Parameters.length > 0) {
132
136
  this.Parameters.forEach(t => {
137
+ if (!t.visible)
138
+ return;
133
139
  let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);
134
140
  let emptyNonNumber = t.type != 'number' && !t.value;
135
- if (t.mandatory && (emptyNumber || emptyNonNumber))
141
+ if (t.required && (emptyNumber || emptyNonNumber))
136
142
  valid = false;
137
143
  else if (t.value && t.type == 'number')
138
144
  valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());
@@ -162,6 +168,7 @@ class EsParametersComponent {
162
168
  changed() {
163
169
  var thyCleanShaltNotBlankMe = JSON.parse(JSON.stringify(this.Parameters));
164
170
  this.propagateChange(thyCleanShaltNotBlankMe);
171
+ this.reviewParametersBindings();
165
172
  }
166
173
  /**
167
174
  * Rimuove il parametro selezionato e propaga il modello
@@ -172,6 +179,72 @@ class EsParametersComponent {
172
179
  this.Parameters.splice(this.Parameters.indexOf(par), 1);
173
180
  this.changed();
174
181
  }
182
+ /**
183
+ * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo
184
+ */
185
+ reviewParametersBindings() {
186
+ for (let i = 0; i < this.Parameters.length; i++) {
187
+ var p = this.Parameters[i];
188
+ if (p.requiredexp)
189
+ p.required = this.evaluate(p.requiredexp);
190
+ if (p.visibleexp)
191
+ p.visible = this.evaluate(p.visibleexp);
192
+ }
193
+ }
194
+ /**
195
+ * Valuta un'espressione in base ai parametri presenti nel modello attuale
196
+ *
197
+ * @param expr Espressione da valutare scritta nel formato (ripetibile) "ID (==|!=|<|>|>=|<=) (`valore` | null)" separato eventualmente da && ed ||
198
+ *
199
+ * @returns **true** se la condizione è verificata, **false** altrimenti
200
+ */
201
+ evaluate(expr) {
202
+ var regex = /\s?([a-zA-Z0-9]+)\s?(!=|==|<|>|<=|>=)\s?(`[^`]+`|null|[0-9,]+|true|false)/gm;
203
+ var matches = [];
204
+ var finalExpr = expr;
205
+ while (matches = regex.exec(expr)) {
206
+ var fullMatch = matches[0].trim();
207
+ var id = matches[1].trim();
208
+ var operation = matches[2].trim();
209
+ var value = matches[3].trim().trim().replace('`', '').replace('`', '');
210
+ finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', '${value}')`);
211
+ }
212
+ return eval(finalExpr);
213
+ }
214
+ /**
215
+ * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore
216
+ * Richiamata da EVAL
217
+ *
218
+ * @param {string} key Chiave del parametro di cui verificare il valore
219
+ * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=
220
+ * @param {string} value Valore di confronto da utilizzare
221
+ *
222
+ * @returns **true** se la condizione è verificata, **false** altrimenti
223
+ */
224
+ checkValue(key, operator, value) {
225
+ var rPar = this.ParametersCache[key];
226
+ switch (rPar.type) {
227
+ case "string":
228
+ case "enum":
229
+ return eval(`"${rPar.value}" ${operator} "${value}"`);
230
+ case "boolean":
231
+ return eval(`${rPar.value.toString()} ${operator} ${value}`);
232
+ case "number":
233
+ return eval(`${rPar.value.replace(',', '.')} ${operator} ${value.replace(',', '.')}`);
234
+ case "date":
235
+ let parDateConv = `this.dates.getDateConvertion("${rPar.value}")`;
236
+ let valDateConv = `this.dates.getDateConvertion("${value}")`;
237
+ switch (operator) {
238
+ case "==": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);
239
+ case "!=": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);
240
+ case ">": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);
241
+ case "<": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);
242
+ case ">=": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);
243
+ case "<=": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);
244
+ }
245
+ }
246
+ throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;
247
+ }
175
248
  }
176
249
  EsParametersComponent.decorators = [
177
250
  { type: Component, args: [{
@@ -189,14 +262,15 @@ EsParametersComponent.decorators = [
189
262
  multi: true
190
263
  }
191
264
  ],
192
- template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Parameters && Parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of Parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.insertthis\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"></span>&nbsp;{{par.description}}{{par.mandatory ? '*' : ''}}:</label>\r\n\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.mandatory\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.mandatory\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.mandatory\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum\">\r\n <form-select [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.mandatory\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum\">\r\n <form-multiselect [Form]=\"Form\" [FormLayout]=\"false\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"mtu\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.mandatory\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n</div>"
265
+ template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Parameters && Parameters.length > 0\">\r\n <div class=\"row form-group\" *ngFor=\"let par of Parameters; let i= index; let last = last;\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\" [hidden]=\"!par.visible\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\"></span>&nbsp;{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.readonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.readonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.readonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.readonly\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum\">\r\n <form-select [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.readonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"par{{i}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum\">\r\n <form-multiselect [Form]=\"Form\" [FormLayout]=\"false\" [SelectLabel]=\"('Select' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"mtu\" [Readonly]=\"Readonly || par.readonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n</div>"
193
266
  },] }
194
267
  ];
195
268
  EsParametersComponent.ctorParameters = () => [
196
269
  { type: UtilityService },
197
270
  { type: LocalizationService },
198
271
  { type: ChangeDetectorRef },
199
- { type: Injector }
272
+ { type: Injector },
273
+ { type: DateService }
200
274
  ];
201
275
  EsParametersComponent.propDecorators = {
202
276
  LastParameterNoMargin: [{ type: Input }],
@@ -245,22 +319,22 @@ class GenericParameter {
245
319
  * @param {string} description Descrizione del parametro
246
320
  * @param {string} pattern Pattern di validazione
247
321
  * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input
248
- * @param {boolean} mandatory Indica se il valore è obbligatorio o meno
322
+ * @param {boolean} required Indica se il valore è obbligatorio o meno
249
323
  * @param {any} v_default Valore di default per questo Parametro
250
324
  * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere
251
325
  * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)
252
326
  */
253
- constructor(id, description, pattern, type, mandatory, v_default = null, enumvalues = [], multienum) {
327
+ constructor(id, description, pattern, type, required, v_default = null, enumvalues = [], multienum) {
254
328
  this.id = id;
255
329
  this.description = description;
256
330
  this.pattern = pattern;
257
- this.mandatory = mandatory;
331
+ this.required = required;
258
332
  this.enumvalues = enumvalues;
259
333
  this.multienum = multienum;
260
334
  this.type = type == 'enum' ? "" : type;
261
- this.insertthis = true;
335
+ this.visible = true;
262
336
  this.enumtype = type == 'enum' ? type : "";
263
- this.isreadonly = false;
337
+ this.readonly = false;
264
338
  if (!this.enumtype && enumvalues.length != 0)
265
339
  console.error("impossibile gestire valori di dizionario per un parametro non di tipo enum");
266
340
  if (v_default != null)
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-parameters.js","sources":["../../../projects/parameters/src/lib/tokens.ts","../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../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 { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Token che indica il locale da utilizzare per l'applicazione. Sono supportati i locali \"it-IT\" ed \"en-US\"\r\n */\r\nexport const PAR_LOCALE: InjectionToken<string> = new InjectionToken<string>('PAR_LOCALE');","import { Injectable, Inject } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PAR_LOCALE } from './tokens';\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(@Inject(PAR_LOCALE) LOC_LOCALE: string) {\r\n super(LOC_LOCALE);\r\n }\r\n}","// Angular\r\nimport { ControlValueAccessor, FormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { 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\n\r\n/**\r\n * Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico\r\n */\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 provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }],\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, Validator {\r\n\r\n /**\r\n * Modello del componente su cui vengono effettuate le graficazioni\r\n */\r\n public Parameters: 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 /**\r\n * Indica che l'ultimo parametro non deve avere margine in fondo\r\n */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /**\r\n * col-md-X per la label\r\n */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /**\r\n * col-md-X per l'input\r\n */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /**\r\n * Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente\r\n */\r\n @Input() submitted: boolean = false;\r\n\r\n /**\r\n * Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare\r\n */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /**\r\n * Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label\r\n */\r\n @Input() Removal: boolean = false;\r\n\r\n /**\r\n * Indica se i componenti di Input generati sono Readonly o no\r\n */\r\n @Input() Readonly: boolean = false;\r\n\r\n /**\r\n * Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit\r\n */\r\n @Input() Form : NgForm = null;\r\n\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 */\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 /**\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) { }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n if (!this.Parameters)\r\n return;\r\n\r\n this.Parameters.forEach(t => {\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));\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value ? (<string>t.value.toString()).toLowerCase() === \"true\" : false;\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n\r\n });\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n validate(c: FormControl): any {\r\n // Se la validazione è richiamata da un componente non me stesso vuol dire che i componenti di validazione interni stanno richiamando\r\n // questo validator, ma dal loro punto di vista non se ne devono preoccupare quindi faccio finta non ci siano errori.\r\n // Se invece vengo richiamato direttamente significa che è il form in cui vive es-parameters e lì devo effettuare la validazione\r\n let control = this.inj.get(NgControl, null)?.control;\r\n if (c != control)\r\n return null;\r\n\r\n let valid = true;\r\n if (this.Parameters && this.Parameters.length > 0) {\r\n this.Parameters.forEach(t => {\r\n let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);\r\n let emptyNonNumber = t.type != 'number' && !t.value\r\n\r\n if (t.mandatory && (emptyNumber || emptyNonNumber))\r\n valid = false;\r\n else if (t.value && t.type == 'number')\r\n valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());\r\n else if (t.value && t.pattern)\r\n valid = new RegExp(t.pattern).test(t.value);\r\n });\r\n }\r\n\r\n if (valid)\r\n return null;\r\n return { \"es-parameters\": valid };\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 /**\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 var thyCleanShaltNotBlankMe = JSON.parse(JSON.stringify(this.Parameters));\r\n this.propagateChange(thyCleanShaltNotBlankMe);\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}","import { NgModule, ModuleWithProviders } 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 { FullExtensionsModule } from '@esfaenza/extensions';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\nimport { EsParametersModuleConfig } from './models/EsParametersModuleConfig';\r\nimport { PAR_LOCALE } from './tokens';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FullExtensionsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n static forRoot(config?: EsParametersModuleConfig): ModuleWithProviders<EsParametersModule> {\r\n return {\r\n ngModule: EsParametersModule,\r\n providers: [\r\n { provide: PAR_LOCALE, useValue: config?.locale || 'it-IT' }\r\n ]\r\n };\r\n }\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} mandatory 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 */\r\n constructor(\r\n public id: string, \r\n public description: string, \r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | 'enum', \r\n public mandatory: boolean, \r\n v_default: any = null, \r\n public enumvalues: { id: string, description: string }[] = [],\r\n public multienum?: boolean) {\r\n\r\n this.type = type == 'enum' ? \"\" : type;\r\n this.insertthis = 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 /**\r\n * Tipo di dato rappresentato da questo parametro\r\n */\r\n public type: string;\r\n\r\n /**\r\n * Typecode lato C# che rappresenta il tipo di dato\r\n */\r\n public typecode: number;\r\n\r\n /**\r\n * Indica se il campo specificato dev'essere di sola lettura o meno\r\n */\r\n public isreadonly: boolean;\r\n\r\n /**\r\n * Valore del parametro\r\n */\r\n public value: any;\r\n\r\n /**\r\n * Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto\r\n */\r\n public insertthis: boolean;\r\n\r\n /**\r\n * Tipo Enum, valorizzato dal Backend\r\n */\r\n public enumtype: string;\r\n\r\n /**\r\n * Tipo Dizionario, valorizzato dal Backend\r\n */\r\n public dicttype: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/tokens';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {EsParametersLoc as ɵa} from './lib/es_parameters.component.loc';"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-parameters.js","sources":["../../../projects/parameters/src/lib/tokens.ts","../../../projects/parameters/src/lib/es_parameters.component.loc.ts","../../../projects/parameters/src/lib/es_parameters.component.ts","../../../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 { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Token che indica il locale da utilizzare per l'applicazione. Sono supportati i locali \"it-IT\" ed \"en-US\"\r\n */\r\nexport const PAR_LOCALE: InjectionToken<string> = new InjectionToken<string>('PAR_LOCALE');","import { Injectable, Inject } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PAR_LOCALE } from './tokens';\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(@Inject(PAR_LOCALE) LOC_LOCALE: string) {\r\n super(LOC_LOCALE);\r\n }\r\n}","// Angular\r\nimport { ControlValueAccessor, FormControl, NgControl, NgForm, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validator } from \"@angular/forms\";\r\nimport { ChangeDetectorRef, Component, forwardRef, Injector, Input } 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\n\r\n/**\r\n * Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico\r\n */\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 provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EsParametersComponent),\r\n multi: true\r\n }],\r\n templateUrl: \"./es_parameters.component.html\"\r\n})\r\nexport class EsParametersComponent implements ControlValueAccessor, Validator {\r\n\r\n /**\r\n * Modello del componente su cui vengono effettuate le graficazioni\r\n */\r\n public Parameters: GenericParameter[];\r\n\r\n /**\r\n * Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà\r\n */\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 /**\r\n * Indica che l'ultimo parametro non deve avere margine in fondo\r\n */\r\n @Input() LastParameterNoMargin: boolean = false;\r\n\r\n /**\r\n * col-md-X per la label\r\n */\r\n @Input() LabelColWidth: number = 4;\r\n\r\n /**\r\n * col-md-X per l'input\r\n */\r\n @Input() InputColWidth: number = 8;\r\n\r\n /**\r\n * Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente\r\n */\r\n @Input() submitted: boolean = false;\r\n\r\n /**\r\n * Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare\r\n */\r\n @Input() EmptyMessage: string = \"\";\r\n\r\n /**\r\n * Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label\r\n */\r\n @Input() Removal: boolean = false;\r\n\r\n /**\r\n * Indica se i componenti di Input generati sono Readonly o no\r\n */\r\n @Input() Readonly: boolean = false;\r\n\r\n /**\r\n * Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit\r\n */\r\n @Input() Form : NgForm = null;\r\n\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 */\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 /**\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 /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n public writeValue(obj): void {\r\n this.Parameters = obj;\r\n this.ParametersCache = {};\r\n if (!this.Parameters)\r\n return;\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));\r\n\r\n if (t.type == \"boolean\")\r\n t.value = t.value ? (<string>t.value.toString()).toLowerCase() === \"true\" : false;\r\n\r\n if (t.enumtype || t.dicttype)\r\n t.type = 'enum';\r\n });\r\n\r\n this.reviewParametersBindings();\r\n }\r\n\r\n /**\r\n * Pipeline di Angular\r\n * \r\n * @ignore\r\n */\r\n validate(c: FormControl): any {\r\n // Se la validazione è richiamata da un componente non me stesso vuol dire che i componenti di validazione interni stanno richiamando\r\n // questo validator, ma dal loro punto di vista non se ne devono preoccupare quindi faccio finta non ci siano errori.\r\n // Se invece vengo richiamato direttamente significa che è il form in cui vive es-parameters e lì devo effettuare la validazione\r\n let control = this.inj.get(NgControl, null)?.control;\r\n if (c != control)\r\n return null;\r\n\r\n let valid = true;\r\n if (this.Parameters && this.Parameters.length > 0) {\r\n this.Parameters.forEach(t => {\r\n if(!t.visible)\r\n return;\r\n \r\n let emptyNumber = t.type == 'number' && (t.value == null || t.value == undefined);\r\n let emptyNonNumber = t.type != 'number' && !t.value\r\n\r\n if (t.required && (emptyNumber || emptyNonNumber))\r\n valid = false;\r\n else if (t.value && t.type == 'number')\r\n valid = new RegExp(t.pattern || /^[+-]?[0-9]*[,]?[0-9]+$/).test(t.value.toString());\r\n else if (t.value && t.pattern)\r\n valid = new RegExp(t.pattern).test(t.value);\r\n });\r\n }\r\n\r\n if (valid)\r\n return null;\r\n return { \"es-parameters\": valid };\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 /**\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 var thyCleanShaltNotBlankMe = JSON.parse(JSON.stringify(this.Parameters));\r\n this.propagateChange(thyCleanShaltNotBlankMe);\r\n this.reviewParametersBindings();\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 /**\r\n * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo\r\n */\r\n private reviewParametersBindings() {\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 p.required = this.evaluate(p.requiredexp);\r\n if (p.visibleexp)\r\n p.visible = this.evaluate(p.visibleexp);\r\n }\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)\" 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 var value = matches[3].trim().trim().replace('`', '').replace('`', '');\r\n\r\n finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', '${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 switch (rPar.type) {\r\n case \"string\":\r\n case \"enum\":\r\n return eval(`\"${rPar.value}\" ${operator} \"${value}\"`);\r\n case \"boolean\":\r\n return eval(`${rPar.value.toString()} ${operator} ${value}`);\r\n case \"number\":\r\n return eval(`${rPar.value.replace(',', '.')} ${operator} ${value.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 throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;\r\n }\r\n}","import { NgModule, ModuleWithProviders } 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 { FullExtensionsModule } from '@esfaenza/extensions';\r\nimport { EsParametersComponent } from './es_parameters.component';\r\nimport { EsParametersModuleConfig } from './models/EsParametersModuleConfig';\r\nimport { PAR_LOCALE } from './tokens';\r\n\r\n\r\n@NgModule({\r\n declarations: [EsParametersComponent],\r\n imports: [\r\n CommonModule,\r\n LocalizationModule,\r\n FormsModule,\r\n FullExtensionsModule,\r\n FormsAndValidationsModule,\r\n ],\r\n exports: [EsParametersComponent]\r\n})\r\nexport class EsParametersModule {\r\n static forRoot(config?: EsParametersModuleConfig): ModuleWithProviders<EsParametersModule> {\r\n return {\r\n ngModule: EsParametersModule,\r\n providers: [\r\n { provide: PAR_LOCALE, useValue: config?.locale || 'it-IT' }\r\n ]\r\n };\r\n }\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 */\r\n constructor(\r\n public id: string, \r\n public description: string, \r\n public pattern: string,\r\n type: 'date' | 'string' | 'number' | 'boolean' | '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\r\n this.type = type == 'enum' ? \"\" : type;\r\n this.visible = true;\r\n this.enumtype = type == 'enum' ? type : \"\";\r\n this.readonly = 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 /**\r\n * Tipo di dato rappresentato da questo parametro\r\n */\r\n public type: string;\r\n\r\n /**\r\n * Typecode lato C# che rappresenta il tipo di dato\r\n */\r\n public typecode: number;\r\n\r\n /**\r\n * Indica se il campo specificato dev'essere di sola lettura o meno\r\n */\r\n public readonly: boolean;\r\n\r\n /**\r\n * Valore del parametro\r\n */\r\n public value: any;\r\n\r\n /**\r\n * Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto\r\n */\r\n public visible: boolean;\r\n\r\n /**\r\n * Tipo Enum, valorizzato dal Backend\r\n */\r\n public enumtype: string;\r\n\r\n /**\r\n * Tipo Dizionario, valorizzato dal Backend\r\n */\r\n public dicttype: string;\r\n\r\n /**\r\n * Espressione di obbligatorietà\r\n */\r\n public requiredexp?: string;\r\n\r\n /**\r\n * Espressione di visibilità\r\n */\r\n public visibleexp?: string;\r\n}","/*\r\n * Public API Surface of parameters\r\n */\r\nexport * from './lib/es_parameters.module';\r\nexport * from './lib/tokens';\r\nexport * from './lib/models/GenericParameter';\r\nexport * from './lib/es_parameters.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {EsParametersLoc as ɵa} from './lib/es_parameters.component.loc';"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ControlValueAccessor, FormControl, NgForm, Validator } from "@angular/forms";
2
2
  import { ChangeDetectorRef, Injector } from "@angular/core";
3
3
  import { LocalizationService } from "@esfaenza/localizations";
4
- import { UtilityService } from "@esfaenza/extensions";
4
+ import { DateService, UtilityService } from "@esfaenza/extensions";
5
5
  import { GenericParameter } from './models/GenericParameter';
6
6
  /**
7
7
  * Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico
@@ -11,10 +11,15 @@ export declare class EsParametersComponent implements ControlValueAccessor, Vali
11
11
  lc: LocalizationService;
12
12
  cdr: ChangeDetectorRef;
13
13
  private inj;
14
+ dates: DateService;
14
15
  /**
15
16
  * Modello del componente su cui vengono effettuate le graficazioni
16
17
  */
17
18
  Parameters: GenericParameter[];
19
+ /**
20
+ * Cache per fare lookup rapidi in fase di valutazione espressioni di visibilità e obbligatorietà
21
+ */
22
+ private ParametersCache;
18
23
  /**
19
24
  * Pipeline di Angular
20
25
  *
@@ -62,7 +67,7 @@ export declare class EsParametersComponent implements ControlValueAccessor, Vali
62
67
  *
63
68
  * @ignore
64
69
  */
65
- constructor(utiExts: UtilityService, lc: LocalizationService, cdr: ChangeDetectorRef, inj: Injector);
70
+ constructor(utiExts: UtilityService, lc: LocalizationService, cdr: ChangeDetectorRef, inj: Injector, dates: DateService);
66
71
  /**
67
72
  * Pipeline di Angular
68
73
  *
@@ -97,4 +102,27 @@ export declare class EsParametersComponent implements ControlValueAccessor, Vali
97
102
  * @param {GenericParameter} par Parametro da rimuovere
98
103
  */
99
104
  removeParameter(par: GenericParameter): void;
105
+ /**
106
+ * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo
107
+ */
108
+ private reviewParametersBindings;
109
+ /**
110
+ * Valuta un'espressione in base ai parametri presenti nel modello attuale
111
+ *
112
+ * @param expr Espressione da valutare scritta nel formato (ripetibile) "ID (==|!=|<|>|>=|<=) (`valore` | null)" separato eventualmente da && ed ||
113
+ *
114
+ * @returns **true** se la condizione è verificata, **false** altrimenti
115
+ */
116
+ private evaluate;
117
+ /**
118
+ * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore
119
+ * Richiamata da EVAL
120
+ *
121
+ * @param {string} key Chiave del parametro di cui verificare il valore
122
+ * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=
123
+ * @param {string} value Valore di confronto da utilizzare
124
+ *
125
+ * @returns **true** se la condizione è verificata, **false** altrimenti
126
+ */
127
+ checkValue(key: string, operator: string, value: string): boolean;
100
128
  }
@@ -5,7 +5,7 @@ export declare class GenericParameter {
5
5
  id: string;
6
6
  description: string;
7
7
  pattern: string;
8
- mandatory: boolean;
8
+ required: boolean;
9
9
  enumvalues: {
10
10
  id: string;
11
11
  description: string;
@@ -18,12 +18,12 @@ export declare class GenericParameter {
18
18
  * @param {string} description Descrizione del parametro
19
19
  * @param {string} pattern Pattern di validazione
20
20
  * @param {'date' | 'string' | 'number' | 'boolean' | 'enum'} type Tipo di input
21
- * @param {boolean} mandatory Indica se il valore è obbligatorio o meno
21
+ * @param {boolean} required Indica se il valore è obbligatorio o meno
22
22
  * @param {any} v_default Valore di default per questo Parametro
23
23
  * @param {{ id: string, description: string }[]} enumvalues Qualora il **type** fosse di tipo **enum**, qui devono esserci tutti i valori che può assumere
24
24
  * @param {boolean} multienum Qualora il **type** fosse di tipo **enum**, indica se è possibile selezionare più valori (multiselect)
25
25
  */
26
- constructor(id: string, description: string, pattern: string, type: 'date' | 'string' | 'number' | 'boolean' | 'enum', mandatory: boolean, v_default?: any, enumvalues?: {
26
+ constructor(id: string, description: string, pattern: string, type: 'date' | 'string' | 'number' | 'boolean' | 'enum', required: boolean, v_default?: any, enumvalues?: {
27
27
  id: string;
28
28
  description: string;
29
29
  }[], multienum?: boolean);
@@ -38,7 +38,7 @@ export declare class GenericParameter {
38
38
  /**
39
39
  * Indica se il campo specificato dev'essere di sola lettura o meno
40
40
  */
41
- isreadonly: boolean;
41
+ readonly: boolean;
42
42
  /**
43
43
  * Valore del parametro
44
44
  */
@@ -46,7 +46,7 @@ export declare class GenericParameter {
46
46
  /**
47
47
  * Indica se questo parametro dev'essere inserito o no. In caso contrario viene semplicemente nascosto
48
48
  */
49
- insertthis: boolean;
49
+ visible: boolean;
50
50
  /**
51
51
  * Tipo Enum, valorizzato dal Backend
52
52
  */
@@ -55,4 +55,12 @@ export declare class GenericParameter {
55
55
  * Tipo Dizionario, valorizzato dal Backend
56
56
  */
57
57
  dicttype: string;
58
+ /**
59
+ * Espressione di obbligatorietà
60
+ */
61
+ requiredexp?: string;
62
+ /**
63
+ * Espressione di visibilità
64
+ */
65
+ visibleexp?: string;
58
66
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/parameters",
3
- "version": "11.2.11",
3
+ "version": "11.2.12",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },