@eqproject/eqp-dynamic-module 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +24 -0
  2. package/bundles/eqproject-eqp-dynamic-module.umd.js +3117 -0
  3. package/bundles/eqproject-eqp-dynamic-module.umd.js.map +1 -0
  4. package/bundles/eqproject-eqp-dynamic-module.umd.min.js +17 -0
  5. package/bundles/eqproject-eqp-dynamic-module.umd.min.js.map +1 -0
  6. package/eqproject-eqp-dynamic-module.d.ts +5 -0
  7. package/eqproject-eqp-dynamic-module.metadata.json +1 -0
  8. package/esm2015/eqproject-eqp-dynamic-module.js +6 -0
  9. package/esm2015/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +65 -0
  10. package/esm2015/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +534 -0
  11. package/esm2015/lib/components/private/add-form-field/add-form-field.component.js +486 -0
  12. package/esm2015/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +127 -0
  13. package/esm2015/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +181 -0
  14. package/esm2015/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +56 -0
  15. package/esm2015/lib/components/private/field-templates/date-field-template/date-field-template.component.js +71 -0
  16. package/esm2015/lib/components/private/field-templates/image-field-template/image-field-template.component.js +54 -0
  17. package/esm2015/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +118 -0
  18. package/esm2015/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +63 -0
  19. package/esm2015/lib/components/private/field-templates/text-field-template/text-field-template.component.js +51 -0
  20. package/esm2015/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +51 -0
  21. package/esm2015/lib/components/private/form-records/add-form-record/add-form-record.component.js +126 -0
  22. package/esm2015/lib/components/private/form-records/list-form-record/list-form-record.component.js +210 -0
  23. package/esm2015/lib/eqp-dynamic-module.module.js +67 -0
  24. package/esm2015/lib/interfaces/iBaseFieldComponent.interface.js +1 -0
  25. package/esm2015/lib/interfaces/iRootObject.interface.js +1 -0
  26. package/esm2015/lib/models/baseField.model.js +36 -0
  27. package/esm2015/lib/models/baseObj.model.js +9 -0
  28. package/esm2015/lib/models/context.model.js +8 -0
  29. package/esm2015/lib/models/entity.model.js +7 -0
  30. package/esm2015/lib/models/fields/attachmentField.model.js +22 -0
  31. package/esm2015/lib/models/fields/booleanField.model.js +12 -0
  32. package/esm2015/lib/models/fields/dateField.model.js +11 -0
  33. package/esm2015/lib/models/fields/imageField.model.js +4 -0
  34. package/esm2015/lib/models/fields/listValueField.model.js +12 -0
  35. package/esm2015/lib/models/fields/lookupField.model.js +5 -0
  36. package/esm2015/lib/models/fields/numericField.model.js +5 -0
  37. package/esm2015/lib/models/fields/testareaField.model.js +4 -0
  38. package/esm2015/lib/models/fields/textField.model.js +5 -0
  39. package/esm2015/lib/models/form.model.js +24 -0
  40. package/esm2015/lib/models/record.model.js +3 -0
  41. package/esm2015/lib/modules/material.module.js +108 -0
  42. package/esm2015/lib/services/custom-form-validators.service.js +19 -0
  43. package/esm2015/lib/services/eqp-dynamic-module-dialog.service.js +104 -0
  44. package/esm2015/lib/services/utilityHelper.services.js +220 -0
  45. package/esm2015/public-api.js +37 -0
  46. package/esm5/eqproject-eqp-dynamic-module.js +6 -0
  47. package/esm5/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +66 -0
  48. package/esm5/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +546 -0
  49. package/esm5/lib/components/private/add-form-field/add-form-field.component.js +497 -0
  50. package/esm5/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +128 -0
  51. package/esm5/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +184 -0
  52. package/esm5/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +57 -0
  53. package/esm5/lib/components/private/field-templates/date-field-template/date-field-template.component.js +72 -0
  54. package/esm5/lib/components/private/field-templates/image-field-template/image-field-template.component.js +55 -0
  55. package/esm5/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +121 -0
  56. package/esm5/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +64 -0
  57. package/esm5/lib/components/private/field-templates/text-field-template/text-field-template.component.js +52 -0
  58. package/esm5/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +52 -0
  59. package/esm5/lib/components/private/form-records/add-form-record/add-form-record.component.js +129 -0
  60. package/esm5/lib/components/private/form-records/list-form-record/list-form-record.component.js +216 -0
  61. package/esm5/lib/eqp-dynamic-module.module.js +70 -0
  62. package/esm5/lib/interfaces/iBaseFieldComponent.interface.js +1 -0
  63. package/esm5/lib/interfaces/iRootObject.interface.js +1 -0
  64. package/esm5/lib/models/baseField.model.js +43 -0
  65. package/esm5/lib/models/baseObj.model.js +13 -0
  66. package/esm5/lib/models/context.model.js +14 -0
  67. package/esm5/lib/models/entity.model.js +14 -0
  68. package/esm5/lib/models/fields/attachmentField.model.js +29 -0
  69. package/esm5/lib/models/fields/booleanField.model.js +19 -0
  70. package/esm5/lib/models/fields/dateField.model.js +18 -0
  71. package/esm5/lib/models/fields/imageField.model.js +11 -0
  72. package/esm5/lib/models/fields/listValueField.model.js +19 -0
  73. package/esm5/lib/models/fields/lookupField.model.js +12 -0
  74. package/esm5/lib/models/fields/numericField.model.js +12 -0
  75. package/esm5/lib/models/fields/testareaField.model.js +11 -0
  76. package/esm5/lib/models/fields/textField.model.js +12 -0
  77. package/esm5/lib/models/form.model.js +39 -0
  78. package/esm5/lib/models/record.model.js +7 -0
  79. package/esm5/lib/modules/material.module.js +111 -0
  80. package/esm5/lib/services/custom-form-validators.service.js +23 -0
  81. package/esm5/lib/services/eqp-dynamic-module-dialog.service.js +113 -0
  82. package/esm5/lib/services/utilityHelper.services.js +225 -0
  83. package/esm5/public-api.js +37 -0
  84. package/fesm2015/eqproject-eqp-dynamic-module.js +2757 -0
  85. package/fesm2015/eqproject-eqp-dynamic-module.js.map +1 -0
  86. package/fesm5/eqproject-eqp-dynamic-module.js +2902 -0
  87. package/fesm5/eqproject-eqp-dynamic-module.js.map +1 -0
  88. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +21 -0
  89. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +186 -0
  90. package/lib/components/private/add-form-field/add-form-field.component.d.ts +160 -0
  91. package/lib/components/private/dynamic-module-field/dynamic-module-field.component.d.ts +55 -0
  92. package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +84 -0
  93. package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +21 -0
  94. package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +27 -0
  95. package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +16 -0
  96. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +59 -0
  97. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +26 -0
  98. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +20 -0
  99. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +20 -0
  100. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +50 -0
  101. package/lib/components/private/form-records/list-form-record/list-form-record.component.d.ts +59 -0
  102. package/lib/eqp-dynamic-module.module.d.ts +2 -0
  103. package/lib/interfaces/iBaseFieldComponent.interface.d.ts +8 -0
  104. package/lib/interfaces/iRootObject.interface.d.ts +10 -0
  105. package/lib/models/baseField.model.d.ts +56 -0
  106. package/lib/models/baseObj.model.d.ts +9 -0
  107. package/lib/models/context.model.d.ts +9 -0
  108. package/lib/models/entity.model.d.ts +10 -0
  109. package/lib/models/fields/attachmentField.model.d.ts +17 -0
  110. package/lib/models/fields/booleanField.model.d.ts +11 -0
  111. package/lib/models/fields/dateField.model.d.ts +12 -0
  112. package/lib/models/fields/imageField.model.d.ts +10 -0
  113. package/lib/models/fields/listValueField.model.d.ts +21 -0
  114. package/lib/models/fields/lookupField.model.d.ts +10 -0
  115. package/lib/models/fields/numericField.model.d.ts +9 -0
  116. package/lib/models/fields/testareaField.model.d.ts +7 -0
  117. package/lib/models/fields/textField.model.d.ts +7 -0
  118. package/lib/models/form.model.d.ts +45 -0
  119. package/lib/models/record.model.d.ts +5 -0
  120. package/lib/modules/material.module.d.ts +2 -0
  121. package/lib/services/custom-form-validators.service.d.ts +5 -0
  122. package/lib/services/eqp-dynamic-module-dialog.service.d.ts +28 -0
  123. package/lib/services/utilityHelper.services.d.ts +48 -0
  124. package/package.json +39 -0
  125. package/public-api.d.ts +35 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eqproject-eqp-dynamic-module.js","sources":["ng://@eqproject/eqp-dynamic-module/lib/models/context.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/baseObj.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/form.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/baseField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/services/custom-form-validators.service.ts","ng://@eqproject/eqp-dynamic-module/lib/services/utilityHelper.services.ts","ng://@eqproject/eqp-dynamic-module/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.ts","ng://@eqproject/eqp-dynamic-module/lib/modules/material.module.ts","ng://@eqproject/eqp-dynamic-module/lib/services/eqp-dynamic-module-dialog.service.ts","ng://@eqproject/eqp-dynamic-module/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/attachmentField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/booleanField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/dateField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/listValueField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/add-form-field/add-form-field.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/text-field-template/text-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/date-field-template/date-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/field-templates/image-field-template/image-field-template.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/form-records/list-form-record/list-form-record.component.ts","ng://@eqproject/eqp-dynamic-module/lib/models/record.model.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/form-records/add-form-record/add-form-record.component.ts","ng://@eqproject/eqp-dynamic-module/lib/components/private/dynamic-module-field/dynamic-module-field.component.ts","ng://@eqproject/eqp-dynamic-module/lib/eqp-dynamic-module.module.ts","ng://@eqproject/eqp-dynamic-module/lib/models/entity.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/imageField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/lookupField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/numericField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/testareaField.model.ts","ng://@eqproject/eqp-dynamic-module/lib/models/fields/textField.model.ts","ng://@eqproject/eqp-dynamic-module/public-api.ts","ng://@eqproject/eqp-dynamic-module/eqproject-eqp-dynamic-module.ts"],"sourcesContent":["export class Context {\r\n User: ContextUser = new ContextUser();\r\n Organizzation: string;\r\n}\r\n\r\nexport class ContextUser {\r\n Name: string;\r\n Surname: string;\r\n Role: string;\r\n}","/**\r\n * Classe base che implementa la valorizzazione dell'ID (se null) con una nuova GUID \r\n * in creazione dell'oggetto.\r\n * Per scelta architetturale, visto che non possiamo assumere la persistenza su DB relazionale o su NOSQL, ogni\r\n * oggetto della configurazione viene persistito, e gestito con ID di tipo stringa creato da una GUID.\r\n */\r\nexport class BaseObj {\r\n ID: string;\r\n}","import { BaseObj } from \"./baseObj.model\";\r\nimport { IRootObject } from \"../interfaces/iRootObject.interface\";\r\nimport { BaseField } from \"./baseField.model\";\r\n\r\n/**\r\n * Classe che rappresenta una Form completa. \r\n * Si tratta dell'oggetto che viene rappresentato a video e con cui l'utente interagisce.\r\n */\r\nexport class Form extends BaseObj implements IRootObject {\r\n Name: string;\r\n // FormType: FormTypeEnum;\r\n FormScalarType: FormScalarTypeEnum;\r\n FormFieldsGroups: Array<FormFieldGroup>;\r\n\r\n /**\r\n * Elenco dei campi rappresentati nella form\r\n * possono appartenere ad una sola entità\r\n */\r\n Fields: Array<BaseField>;\r\n\r\n ActionsOnRecord: Array<ActionOnRecord>;\r\n\r\n /**\r\n * Elenco delle form contenute nella form base, ad esempio possono essere le varie form di \r\n * dettaglio\r\n */\r\n InnerForms: Array<Form>;\r\n\r\n RootEntityID: string;\r\n\r\n // Proprietà client\r\n OldName?: string;\r\n}\r\n\r\nexport class FormFieldGroup {\r\n Name: string;\r\n OrdinalPosition?: number;\r\n}\r\n\r\nexport class ActionOnRecord {\r\n Name: string;\r\n Icon: string;\r\n Action: string; //Codice js\r\n OrdinalPosition: number;\r\n}\r\n\r\nexport enum FormTypeEnum {\r\n SCALAR = 1, /* form di tipo scalare */\r\n LIST = 2 /* form di tipo lista che viene rappresentata con molti record */\r\n}\r\n\r\nexport enum FormScalarTypeEnum {\r\n \"Semplice\" = 1, //FLAT\r\n \"A step\" = 2, //STEPPER\r\n \"In tab\" = 3, //GROUPED_BY_TAB\r\n \"In accordion\" = 4 //GROUPED_BY_ACCORDION\r\n}","import { FormGroup } from '@angular/forms';\r\nimport { BaseObj } from './baseObj.model';\r\n\r\n/**\r\n * Contiene le informazioni di base del campo, indipendentemente dal tipo.\r\n * Questa classe è volutamente astratta perché il tipo di campo è dettato dal tipo\r\n */\r\nexport class BaseField extends BaseObj {\r\n /**\r\n * Nome del campo che per progettazione è una sostituzione della label\r\n * Il vero identificativo del campo è l'ID\r\n */\r\n Name: string;\r\n Label: string;\r\n Description: string;\r\n Required: boolean;\r\n Formula: string;\r\n OrdinalPosition: number;\r\n\r\n /**\r\n * Entità a cui appartiene il campo. Si tenga presente che sono ammessi anche campi\r\n * di sola visualizzazione e calcolati, da utilizzare nelle form, \r\n * e per questo motivo possono essere con Entity == null\r\n */\r\n EntityID: string;\r\n\r\n FieldGroup: string;\r\n ColSpanSizes: Array<ColSpanSizesEnum>;\r\n InListView: boolean;\r\n\r\n // Proprità client\r\n FieldType: FieldTypeEnum;\r\n FieldValue: any;\r\n FormFormGroup: FormGroup;\r\n}\r\n\r\nexport enum FieldTypeEnum {\r\n 'Campo di testo' = 1,\r\n 'Area di testo' = 2,\r\n 'Booleano' = 3,\r\n 'Data e/o ora' = 4,\r\n 'Campo numerico' = 5,\r\n 'Allegato' = 6,\r\n 'Immagine' = 7,\r\n 'Elenco generico' = 8,\r\n 'Lookup' = 9,\r\n 'Form di dettaglio' = 10\r\n}\r\n\r\nexport enum ColSpanSizesEnum {\r\n 'col-sm-3' = 1,\r\n 'col-sm-4' = 2,\r\n 'col-sm-6' = 3,\r\n 'col-sm-12' = 4,\r\n\r\n 'col-md-3' = 5,\r\n 'col-md-4' = 6,\r\n 'col-md-6' = 7,\r\n 'col-md-12' = 8,\r\n\r\n 'col-lg-3' = 9,\r\n 'col-lg-4' = 10,\r\n 'col-lg-6' = 11,\r\n 'col-lg-12' = 12,\r\n}\r\n","import { AbstractControl, ValidationErrors } from \"@angular/forms\";\r\n\r\nexport class ArrayValidators {\r\n public static minLenght(minLenght: number): (AbstractControl) => ValidationErrors | null {\r\n var validationFunction = (control: AbstractControl): ValidationErrors | null => {\r\n return !!control && !!control.value && Array.isArray(control.value) && control.value.length >= minLenght\r\n ? null\r\n : { hasMinLenght: false };\r\n };\r\n return validationFunction;\r\n }\r\n\r\n public static maxLenght(maxLenght: number): (AbstractControl) => ValidationErrors | null {\r\n var validationFunction = (control: AbstractControl): ValidationErrors | null => {\r\n return !!control && !!control.value && Array.isArray(control.value) && control.value.length <= maxLenght\r\n ? null\r\n : { hasMinLenght: false };\r\n };\r\n return validationFunction;\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { BaseField, ColSpanSizesEnum, FieldTypeEnum } from \"../models/baseField.model\";\r\nimport { Context } from \"../models/context.model\";\r\nimport { AttachmentField } from \"../models/fields/attachmentField.model\";\r\nimport { ImageField } from \"../models/fields/imageField.model\";\r\nimport { ListValueField } from \"../models/fields/listValueField.model\";\r\nimport { TextareaField } from \"../models/fields/testareaField.model\";\r\nimport { TextField } from \"../models/fields/textField.model\";\r\nimport { Record } from \"../models/record.model\";\r\nimport { ArrayValidators } from \"./custom-form-validators.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UtilityHelperService {\r\n\r\n public static context: Context = new Context();\r\n\r\n constructor(\r\n private formBuilder: FormBuilder\r\n ) {\r\n }\r\n\r\n public static EvaluateFieldFormula(formula: string, rec: Record, ctx: any): any {\r\n const evaluatedValue = eval(formula.replace('\"', '\\\"'));\r\n return (evaluatedValue ? evaluatedValue : null);\r\n }\r\n\r\n public static SetContext(ctx: Context) {\r\n this.context = ctx;\r\n }\r\n\r\n /**\r\n * Metodo per impostare i valori da suggerire nell'autocomplete per i campi in cui l'utente deve scrivere comandi javascript.\r\n * In base all'ultimo carattere digitato viene impostato un elenco di oggetti o proprietà che l'utente ha a disposizione in quel momento.\r\n * @param fields Array di BaseField aggiunti alla Form\r\n * @param typedFormula Stringa digitata dall'utente\r\n * @summary Il metodo imposta i suggerimenti basandosi su 3 casi:\r\n * 1) l'utente non ha digitato nulla o la stringa digitata dall'utente finisce con uno spazio vuoto\r\n * 2) la stringa digitata dall'utente finisce con un \".\"\r\n * 3) la stringa digitata dall'utente non coincide con nessun altro caso sopra (finisce con un carattere qualunque)\r\n */\r\n public static GetAutocompleteOptions(fields: Array<BaseField>, typedFormula: string): Array<{ label: string, value: string }> {\r\n\r\n var autocompleteOptions: Array<{ label: string, value: string }> = [];\r\n\r\n // Recupero i nomi di tutti i campi creati fino ad ora nella form.\r\n const availableRecProperties: Array<string> = fields.map(f => f.Label.split(' ').join('_'));\r\n\r\n // Nel casi in cui l'utente non ha inserito nulla oppure la stringa finisce con uno spazio vuoto o un simbolo diverso da \".\"\r\n // (un carattere non alfanumerico) imposto come suggerimenti solo \"rec\" e \"ctx\", ovvero gli unici due oggetti a cui l'utente ha accesso.\r\n if (\r\n !typedFormula ||\r\n (\r\n !typedFormula.endsWith(\".\")\r\n && new RegExp(\"[^0-9a-zA-Z_]\").test(typedFormula.substring(typedFormula.length - 1, typedFormula.length))\r\n )\r\n ) {\r\n autocompleteOptions = [\r\n { label: \"rec\", value: (typedFormula ? typedFormula : '') + \"rec\" },\r\n { label: \"ctx\", value: (typedFormula ? typedFormula : '') + \"ctx\" }\r\n ];\r\n }\r\n // Se la stringa finisce con un \".\" vuol dire che l'utente sta cercando di accedere ad una proprietà di un oggetto\r\n // a sua disposizione. Recupero il nome dell'ultimo oggetto digitato dall'utente e se l'oggetto scelto è \"rec\" o \"ctx\"\r\n // allora suggerisco le proprietà che esistono all'interno di questi oggetti altrimenti non mostro nulla.\r\n else if (typedFormula.endsWith(\".\")) {\r\n const formulaPieces: Array<string> = typedFormula.split(\" \")[typedFormula.split(\" \").length - 1].split('.');\r\n if (formulaPieces[formulaPieces.length - 2] === \"rec\") {\r\n autocompleteOptions = availableRecProperties.map(f => { return { label: f, value: typedFormula + f }; });\r\n } else if (formulaPieces[formulaPieces.length - 2] === \"ctx\") {\r\n autocompleteOptions = Object.keys(UtilityHelperService.context).map(f => { return { label: f, value: typedFormula + f }; });\r\n } else if (formulaPieces.length > 2 && formulaPieces[formulaPieces.length - 3] === \"ctx\" && formulaPieces[formulaPieces.length - 2] === \"User\") {\r\n autocompleteOptions = Object.keys(UtilityHelperService.context.User).map(f => { return { label: f, value: typedFormula + f }; });\r\n } else {\r\n autocompleteOptions = [];\r\n }\r\n }\r\n // In tutti gli altri casi, ovvero quando la stringa digitata finisce con un carattere diverso da quelli\r\n // controllati finora, vuol dire che l'utente sta digitanto il nome di un oggetto, una proprietà o una\r\n // funzione javascript. Controllo la parola che l'utente sta digitando e se fa parte di uno degli oggetti a disposizione\r\n // o una proprietà di essi allora suggerisco i possibili match.\r\n else {\r\n var availableOptions: Array<{ label: string, value: string }> = [];\r\n\r\n // Prendo tutti i blocchi di caratteri digitati dall'utente\r\n const allFormulaWords: Array<string> = typedFormula.split(\" \");\r\n // Prendo l'ultimo blocco di caratteri digitato dall'utente\r\n var lastTypedString: string = allFormulaWords[allFormulaWords.length - 1];\r\n\r\n // Se la l'ultima stringa digitata non contiene caratteri speciali allora splitto la stringa\r\n // sui \".\" e imposto i suggerimenti in base al path della prorpietà che si sta digitando.\r\n if (!new RegExp(\"[^0-9a-zA-Z_.]\").test(lastTypedString)) {\r\n var propertyPath = lastTypedString.split(\".\");\r\n var lastTypedWork = propertyPath[propertyPath.length - 1];\r\n\r\n var propertiesToCheck: Array<string> = [];\r\n\r\n if (propertyPath.length == 1) {\r\n propertiesToCheck = [\"rec\", \"ctx\"];\r\n } else if (propertyPath.length > 1 && propertyPath[propertyPath.length - 2] === \"ctx\") {\r\n propertiesToCheck = Object.keys(UtilityHelperService.context);\r\n } else if (propertyPath.length > 2 && propertyPath[propertyPath.length - 3] === \"ctx\" && propertyPath[propertyPath.length - 2] === \"User\") {\r\n propertiesToCheck = Object.keys(UtilityHelperService.context.User);\r\n } else if (propertyPath.length > 1 && propertyPath[propertyPath.length - 2] === \"rec\") {\r\n propertiesToCheck = availableRecProperties;\r\n }\r\n\r\n // Eseguo il controllo sulle proprietà recuperate, aggiungo ai suggerimenti tutti i nomi che iniziano con \r\n // quello che sta digitando l'utente.\r\n propertiesToCheck.forEach(prop => {\r\n if (prop.startsWith(lastTypedWork)) {\r\n availableOptions.push({ label: prop, value: typedFormula + prop.substring(lastTypedWork.length, prop.length) })\r\n }\r\n });\r\n }\r\n\r\n autocompleteOptions = availableOptions;\r\n }\r\n\r\n return autocompleteOptions;\r\n }\r\n\r\n /**\r\n * Metodo invocato dall'html per impostare le classi css per visualizzare il campo all'interno della form.\r\n * Se per il field sono state specificate delle classi allora vengono applcate quelle, altrimenti vengono usate\r\n * delle classi di default.\r\n * @param field BaseField da visualizzare.\r\n * @returns Restituisce una stringa contenente le classi css da applicare.\r\n */\r\n getFieldSyleClass(field: BaseField): string {\r\n if (field.ColSpanSizes && field.ColSpanSizes.length > 0)\r\n return field.ColSpanSizes.map(size => ColSpanSizesEnum[size].toString()).join(\" \");\r\n\r\n switch (field.FieldType) {\r\n case FieldTypeEnum[\"Campo di testo\"]:\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n case FieldTypeEnum[\"Area di testo\"]:\r\n return \"col-sm-12 col-md-12 col-lg-12\";\r\n case FieldTypeEnum[\"Booleano\"]:\r\n return \"col-sm-12 col-md-4 col-lg-4 d-flex align-items-center\";\r\n case FieldTypeEnum[\"Data e/o ora\"]:\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n case FieldTypeEnum[\"Campo numerico\"]:\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n case FieldTypeEnum[\"Allegato\"]:\r\n if (\r\n (field as AttachmentField).IsMultiAttach ||\r\n ((field as AttachmentField).MetadataFields && (field as AttachmentField).MetadataFields.length > 0)\r\n ) {\r\n return \"col-sm-12 col-md-12 col-lg-12\";\r\n } else {\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n }\r\n case FieldTypeEnum[\"Immagine\"]:\r\n if (\r\n (field as ImageField).AttachDefinition.IsMultiAttach ||\r\n ((field as ImageField).AttachDefinition.MetadataFields && (field as ImageField).AttachDefinition.MetadataFields.length > 0)\r\n ) {\r\n return \"col-sm-12 col-md-12 col-lg-12\";\r\n } else {\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n }\r\n case FieldTypeEnum[\"Elenco generico\"]:\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n case FieldTypeEnum[\"Lookup\"]:\r\n return \"col-sm-12 col-md-4 col-lg-4\";\r\n case FieldTypeEnum['Form di dettaglio']:\r\n return \"col-sm-12 col-md-12 col-lg-12\";\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per creare il FormGroup che rappresenta una Form a partire dai suoi BaseField.\r\n * @param formFields Lista dei BaseField che compongono la form.\r\n * @param record Oggetto di tipo Record che contiene i valori dei campi.\r\n * @param onlyView Se TRUE disabilita la form per renderla in sola lettura.\r\n * @param includeCurrentFormInField Se TRUE popola la proprietà FormFormGroup all'interno di ogni BaseField con il FormGroup corrente.\r\n * @returns Restituisce un FormGroup rappresentate la Form a cui appartengono i BaseField ricevuti in input. \r\n */\r\n public CreateFormFormGroup(formFields: Array<BaseField>, record: Record, onlyView: boolean = false, includeCurrentFormInField: boolean = true): FormGroup {\r\n var formForm: FormGroup = this.formBuilder.group([]);\r\n formFields.forEach(field => {\r\n formForm.addControl(field.Name, this.createFieldFormControl(field, record));\r\n if (includeCurrentFormInField) {\r\n field.FormFormGroup = formForm;\r\n }\r\n });\r\n if (onlyView) {\r\n formForm.disable();\r\n }\r\n\r\n return formForm;\r\n }\r\n\r\n /**\r\n * Funzione per creare e aggiungere al FormGroup rappresentante la form un nuovo FormControl a partire da un Field. \r\n * In nuovo FormControl avrà il nome del campo passato e verranno impostati i Validators in base al tipo del campo stesso.\r\n * @param field BaseField per cui creare il FormControl da inserire nel FormGroup dela form.\r\n */\r\n private createFieldFormControl(field: BaseField, record: Record): AbstractControl {\r\n const validators: Array<ValidatorFn> = [];\r\n\r\n if (field.Required)\r\n validators.push(Validators.required);\r\n\r\n switch (field.FieldType) {\r\n case FieldTypeEnum[\"Campo di testo\"]:\r\n if ((field as TextField).MaxLenght) { validators.push(Validators.maxLength((field as TextField).MaxLenght)); }\r\n if ((field as TextField).MinLenght) { validators.push(Validators.minLength((field as TextField).MinLenght)); }\r\n break;\r\n case FieldTypeEnum[\"Area di testo\"]:\r\n if ((field as TextareaField).MaxLenght) { validators.push(Validators.maxLength((field as TextareaField).MaxLenght)); }\r\n if ((field as TextareaField).MinLenght) { validators.push(Validators.minLength((field as TextareaField).MinLenght)); }\r\n break;\r\n case FieldTypeEnum.Allegato:\r\n case FieldTypeEnum.Immagine:\r\n if (field.Required)\r\n validators.push(ArrayValidators.minLenght(1));\r\n break;\r\n case FieldTypeEnum['Elenco generico']:\r\n if ((field as ListValueField).IsMultiChoiche)\r\n if (field.Required)\r\n validators.push(ArrayValidators.minLenght(1));\r\n break;\r\n }\r\n\r\n return new FormControl(record[field.Name], validators);\r\n }\r\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { Context } from '../../../models/context.model';\r\nimport { Form, FormTypeEnum } from '../../../models/form.model';\r\nimport { Record } from '../../../models/record.model';\r\nimport { UtilityHelperService } from '../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'eqp-dynamic-module',\r\n templateUrl: './eqp-dynamic-module.component.html',\r\n styleUrls: ['./eqp-dynamic-module.component.scss']\r\n})\r\nexport class EqpDynamicModuleComponent implements OnInit {\r\n\r\n @Input() context: Context = new Context();\r\n @Input() form: Form = new Form();\r\n @Input() values: Array<Record>;\r\n @Input() showButtons = true;\r\n @Input() viewMode: FormTypeEnum = FormTypeEnum.LIST;\r\n\r\n FormTypeEnum = FormTypeEnum;\r\n selectedRecord: Record;\r\n onlyView: boolean;\r\n\r\n constructor(\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n UtilityHelperService.SetContext(this.context);\r\n }\r\n\r\n onAddViewEditRecord(event: { record: Record, onlyView: boolean }) {\r\n if (event != null) {\r\n this.selectedRecord = JSON.parse(JSON.stringify(event.record));\r\n this.onlyView = event.onlyView;\r\n } else {\r\n this.selectedRecord = null;\r\n this.onlyView = false;\r\n }\r\n this.viewMode = FormTypeEnum.SCALAR;\r\n }\r\n\r\n onSaveForm(event: Record) {\r\n //TODO: Salvare il record!\r\n \r\n if (event != null) {\r\n if (event.ID && this.values.find(v => v.ID == event.ID)) {\r\n this.values[this.values.findIndex(v => v.ID == event.ID)] = event;\r\n } else {\r\n this.values.push(event);\r\n }\r\n }\r\n this.viewMode = FormTypeEnum.LIST;\r\n console.log(event);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//Angular Material Components\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatGridListModule } from '@angular/material/grid-list';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatStepperModule } from '@angular/material/stepper';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\n\r\n\r\n@NgModule({\r\n imports: [\r\n MatCheckboxModule,\r\n MatButtonModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatDatepickerModule,\r\n MatFormFieldModule,\r\n MatRadioModule,\r\n MatSelectModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatMenuModule,\r\n MatSidenavModule,\r\n MatToolbarModule,\r\n MatListModule,\r\n MatGridListModule,\r\n MatCardModule,\r\n MatStepperModule,\r\n MatTabsModule,\r\n MatExpansionModule,\r\n MatButtonToggleModule,\r\n MatChipsModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatProgressBarModule,\r\n MatDialogModule,\r\n MatTooltipModule,\r\n MatSnackBarModule,\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule\r\n ],\r\n exports: [\r\n MatCheckboxModule,\r\n MatButtonModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatDatepickerModule,\r\n MatFormFieldModule,\r\n MatRadioModule,\r\n MatSelectModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatMenuModule,\r\n MatSidenavModule,\r\n MatToolbarModule,\r\n MatListModule,\r\n MatGridListModule,\r\n MatCardModule,\r\n MatStepperModule,\r\n MatTabsModule,\r\n MatExpansionModule,\r\n MatButtonToggleModule,\r\n MatChipsModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatProgressBarModule,\r\n MatDialogModule,\r\n MatTooltipModule,\r\n MatSnackBarModule,\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule],\r\n})\r\nexport class MaterialModule { }","import { Injectable } from \"@angular/core\";\r\nimport Swal from 'sweetalert2';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EqpDynamicModuleDialogService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Mostra uno sweet alert di tipo ERROR con il messaggio passato come parametro.\r\n * @param message Messaggio d'errore da mostrare nello sweetalert\r\n * @param title Titolo dello sweetalert (di default mostra 'Errore')\r\n */\r\n static Error(message: string | string[], title: string = null) {\r\n let currentTitle = title != null ? title : 'Errore';\r\n if (Array.isArray(message)) {\r\n currentTitle = title != null ? title : 'Errore';\r\n let htmlErrors: string = message.join(\"<br>\");\r\n Swal.fire({\r\n title: currentTitle,\r\n html: htmlErrors,\r\n icon: 'error'\r\n });\r\n }\r\n else {\r\n Swal.fire(currentTitle, message, 'error');\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Mostra uno sweetalert di tipo CONFIRM con il messaggio passato come parametro e se viene premuto\r\n * CONFERMA lancia la funzione di callback passata come parametro\r\n * @param message Messaggio da mostrare nello sweetalert\r\n * @param title Titolo dello sweetalert (di default mostra 'Info')\r\n */\r\n static Confirm(message: string | string[], confirmCallback: any, isWarning: boolean = false, title: string = null, customWidth: string = null) {\r\n\r\n let currentTitle = title != null ? title : 'Sei sicuro di voler procedere?';\r\n if (Array.isArray(message)) {\r\n let htmlErrors: string = message.join(\"<br>\");\r\n Swal.fire({\r\n title: currentTitle,\r\n html: htmlErrors,\r\n width: customWidth ? customWidth : '32rem',\r\n icon: !isWarning ? 'question' : 'warning',\r\n showCancelButton: true,\r\n allowOutsideClick: false,\r\n allowEscapeKey: false\r\n }).then((result) => {\r\n if (result.value && confirmCallback) {\r\n confirmCallback();\r\n }\r\n });\r\n }\r\n else {\r\n Swal.fire({\r\n title: currentTitle,\r\n text: message,\r\n width: customWidth ? customWidth : '32rem',\r\n icon: !isWarning ? 'question' : 'warning',\r\n showCancelButton: true,\r\n allowOutsideClick: false,\r\n allowEscapeKey: false\r\n }).then((result) => {\r\n if (result.value && confirmCallback) {\r\n confirmCallback();\r\n }\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Mostra uno sweetalert di tipo INFO con il messaggio passato come parametro\r\n * @param message Messaggio da mostrare nello sweetalert\r\n * @param title Titolo dello sweetalert (di default mostra 'Info')\r\n */\r\n static Info(message: string, title: string = null, isToast: boolean = null) {\r\n let currentTitle = title != null ? title : \"Informazione:\";\r\n Swal.fire(currentTitle, message, 'info');\r\n }\r\n\r\n /**\r\n * Mostra uno sweetalert di tipo WARNING con il messaggio passato come parametro\r\n * @param message Messaggio da mostrare nello sweetalert\r\n * @param title Titolo dello sweetalert (di default mostra 'Attenzione!')\r\n */\r\n static Warning(message: string | string[], title: string = null, isToast: boolean = null) {\r\n let currentTitle = title != null ? title : \"Attenzione!\";\r\n\r\n if (Array.isArray(message)) {\r\n let htmlWarnings: string = message.join(\"<br>\");\r\n Swal.fire({\r\n title: currentTitle,\r\n html: htmlWarnings,\r\n icon: 'warning'\r\n });\r\n } else {\r\n Swal.fire(currentTitle, message, 'warning');\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { CellAlignmentEnum, ConfigColumn, EqpTableComponent, TypeColumn } from '@eqproject/eqp-table';\r\nimport { BaseField, FieldTypeEnum } from '../../../models/baseField.model';\r\nimport { Context } from '../../../models/context.model';\r\nimport { ActionOnRecord, Form, FormFieldGroup, FormScalarTypeEnum, FormTypeEnum } from '../../../models/form.model';\r\nimport { ArrayValidators } from '../../../services/custom-form-validators.service';\r\nimport { EqpDynamicModuleDialogService } from '../../../services/eqp-dynamic-module-dialog.service';\r\nimport { UtilityHelperService } from '../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'eqp-dynamic-module-configurator',\r\n templateUrl: './eqp-dynamic-module-configurator.component.html',\r\n styleUrls: ['./eqp-dynamic-module-configurator.component.scss']\r\n})\r\nexport class EqpDynamicModuleConfiguratorComponent implements OnInit {\r\n\r\n @Input() context: Context = new Context();\r\n @Input() form: Form = new Form();\r\n @Input() innerFormManagment: boolean = false;\r\n\r\n formFormGroup: FormGroup;\r\n formCompleted = false;\r\n previewForm: Form;\r\n formFieldGroupName: string;\r\n\r\n actionAutocompleteOptions: Array<{ label: string, value: string }>;\r\n\r\n //#region Enumeratori usati nell'html\r\n FormTypeEnum = FormTypeEnum;\r\n FormScalarTypeEnum = FormScalarTypeEnum;\r\n //#endregion\r\n\r\n //#region Proprietà per creazione/modifica campo\r\n fieldsColumns: Array<ConfigColumn>;\r\n @ViewChild('fieldsTable', { static: false }) fieldsTable: EqpTableComponent;\r\n selectedField: BaseField | any;\r\n indexSelectedField: number;\r\n actionOnRecordFormGroup: FormGroup;\r\n dialogFieldRef: MatDialogRef<TemplateRef<any>>;\r\n @ViewChild('dialogField', { static: true }) dialogField: TemplateRef<any>;\r\n @ViewChild('fieldSectionColumnTemplate', { static: true }) fieldSectionColumnTemplate: TemplateRef<any>;\r\n //#endregion\r\n\r\n //#region Proprietà per creare/modificare una Form di dettaglio\r\n selectedInnerForm: Form;\r\n indexSelectedInnerForm: number;\r\n dialogInnerFormRef: MatDialogRef<TemplateRef<any>>;\r\n @ViewChild('dialogInnerForm', { static: true }) dialogInnerForm: TemplateRef<any>;\r\n //#endregion\r\n\r\n //#region Proprietà per creare/modificare una action sui record di una Form\r\n actionsOnRecordColumns: Array<ConfigColumn>;\r\n @ViewChild('actionsOnRecordTable', { static: false }) actionsOnRecordTable: EqpTableComponent;\r\n selectedAction: ActionOnRecord;\r\n indexSelectedAction: number;\r\n dialogActionOnRecordRef: MatDialogRef<TemplateRef<any>>;\r\n @ViewChild('dialogActionOnRecord', { static: true }) dialogActionOnRecord: TemplateRef<any>;\r\n //#endregion\r\n\r\n\r\n @Output() saveFormEvent: EventEmitter<Form> = new EventEmitter<Form>();\r\n\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private dialog: MatDialog\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.context) {\r\n UtilityHelperService.SetContext(this.context);\r\n }\r\n this.configureColumns();\r\n this.createFormForm();\r\n }\r\n\r\n /**\r\n * Metodo invocato al cambio del tipo di visualizzazione della form.\r\n * Se l'utente sceglie una visualizzazione raggruppata il metodo aggiunge al FormGroup un nuovo\r\n * controllo per l'array dei nomi delle sezioni da creare.\r\n */\r\n onChangeFormScalarType() {\r\n if (this.form.FormScalarType != FormScalarTypeEnum.Semplice) {\r\n if (!this.formFormGroup.contains(\"FormFieldsGroups\")) {\r\n this.formFormGroup.removeControl(\"FormFieldsGroups\");\r\n this.formFormGroup.addControl(\"FormFieldsGroups\", new FormControl(this.form.FormFieldsGroups, [Validators.required, ArrayValidators.minLenght(1)]));\r\n }\r\n } else {\r\n this.form.FormFieldsGroups = null;\r\n if (this.formFormGroup.contains(\"FormFieldsGroups\"))\r\n this.formFormGroup.removeControl(\"FormFieldsGroups\");\r\n }\r\n this.formFormGroup.updateValueAndValidity();\r\n this.configureColumns();\r\n }\r\n\r\n /**\r\n * Evento invocato al keyup nell'input per inserire i nomi delle sezioni per la visualizzazione \r\n * raggruppata della form. Quanto l'utente preme il tasto invio viene aggiunto il nuovo nome alle\r\n * sezioni dispobili se non ne esiste una con lo stesso nome.\r\n * @param event Evento che rappresenta il keyup sulla tastiera.\r\n */\r\n onFormFieldGroupNameKeyUp(event) {\r\n if (event.code === 'Enter' || event.code === 'NumpadEnter') {\r\n if (!this.form.FormFieldsGroups) {\r\n this.form.FormFieldsGroups = new Array<FormFieldGroup>();\r\n }\r\n if (!this.form.FormFieldsGroups.find(n => n.Name == this.formFieldGroupName)) {\r\n this.form.FormFieldsGroups.push({ Name: this.formFieldGroupName });\r\n }\r\n // Imposto il nuovo valore del FormControl per aggiornare lo stato della form.\r\n this.formFormGroup.controls[\"FormFieldsGroups\"].setValue(this.form.FormFieldsGroups);\r\n this.formFieldGroupName = null;\r\n this.setFormFieldGroupOrdinalPosition();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per rimuovere la sezione selezionata da quelle disponibili per la form.\r\n * @param groupName Nome della sezione da eliminare.\r\n */\r\n onDeleteFormFieldGroupName(groupName: string) {\r\n this.form.FormFieldsGroups.splice(this.form.FormFieldsGroups.findIndex(g => g.Name === groupName), 1);\r\n // Imposto il nuovo valore del FormControl per aggiornare lo stato della form.\r\n this.formFormGroup.controls[\"FormFieldsGroups\"].setValue(this.form.FormFieldsGroups);\r\n // Se esistono Field legati alla sezione che si vuole eliminare allora rompo il legame.\r\n if (this.form.Fields.find(f => f.FieldGroup == groupName)) {\r\n this.form.Fields.filter(f => f.FieldGroup == groupName).forEach(f => f.FieldGroup = null);\r\n }\r\n this.setFormFieldGroupOrdinalPosition();\r\n }\r\n\r\n /**\r\n * Metodo chiamato quando si vuole aggiungere un nuovo campo o si vuole modificare uno esistente.\r\n * Memorizza l'eventuale Field scelto one crea uno nuovo prima di aprire il dialog per modificarlo/aggiungerlo.\r\n * @param field Oggetto BaseField da modificare. Se null ne viene creata una nuova istanza per l'aggiunta.\r\n */\r\n openFieldDialog(field: BaseField = null) {\r\n if (field) {\r\n this.indexSelectedField = this.form.Fields.indexOf(field);\r\n this.selectedField = JSON.parse(JSON.stringify(field));\r\n } else {\r\n this.selectedField = new BaseField();\r\n this.indexSelectedField = null;\r\n }\r\n this.dialogFieldRef = this.dialog.open(this.dialogField, {\r\n disableClose: true,\r\n hasBackdrop: true,\r\n width: '75%'\r\n });\r\n }\r\n\r\n /**\r\n * Metodo che salva il campo appena creato o modificato.\r\n * Prima del salvataggio controlla se esiste un altro campo con la stessa label, in questo\r\n * case genere un errore (i campi devono avere nomi, e quindi label, univoche - i nomi vengono\r\n * ricavati unendo le parole che formano la label tramite \"_\").\r\n * @param field Campo da salvare\r\n */\r\n onSaveField(field: BaseField) {\r\n if (field) {\r\n if (\r\n this.form.Fields\r\n && this.form.Fields.find(\r\n (f, i) => f.Label === field.Label\r\n && (this.indexSelectedField == null ? true : this.indexSelectedField !== i)\r\n )\r\n ) {\r\n EqpDynamicModuleDialogService.Warning('Impossibile inserire due campi con la stessa label.');\r\n throw new Error('Impossibile inserire due campi con la stessa label.');\r\n }\r\n\r\n if (this.indexSelectedField != null && this.indexSelectedField >= 0) {\r\n this.form.Fields[this.indexSelectedField] = field;\r\n } else {\r\n if (!this.form.Fields) {\r\n this.form.Fields = new Array<BaseField>();\r\n }\r\n this.form.Fields.push(field);\r\n }\r\n }\r\n this.closeFieldDialog();\r\n this.setFieldOrdinalPosition();\r\n this.reloadFieldsTable();\r\n }\r\n\r\n /**\r\n * Metodo che controlla se lo step per l'aggiunta dei campi nella form è concluso.\r\n * @returns Se TRUE lo step viene considerato completato ed è possbile passare al successivo.\r\n */\r\n isFieldStepCompleted(): boolean {\r\n if (!this.form.Fields) {\r\n return false;\r\n }\r\n if (this.form.FormScalarType != FormScalarTypeEnum.Semplice && this.form.Fields.find(f => !f.FieldGroup)) {\r\n return false;\r\n }\r\n return this.form.Fields.length > 0;\r\n }\r\n\r\n /**\r\n * Metodo per aprire il dialog di creazione/modifica delle form di dettaglio.\r\n * Se il parametro passato è null sono in aggiunta altrimenti sono in modifica.\r\n * @param innenrForm Form di dettaglio da modificare (se null allora vado in add).\r\n */\r\n openInnerFormDialog(innenrForm: Form = null) {\r\n if (innenrForm) {\r\n this.indexSelectedInnerForm = this.form.InnerForms.indexOf(innenrForm);\r\n this.selectedInnerForm = JSON.parse(JSON.stringify(innenrForm));\r\n this.selectedInnerForm.OldName = innenrForm.Name;\r\n this.indexSelectedField = this.form.Fields.findIndex(f => f.Label === innenrForm.Name);\r\n } else {\r\n this.selectedInnerForm = new Form();\r\n this.indexSelectedInnerForm = null;\r\n this.indexSelectedField = null;\r\n }\r\n this.dialogInnerFormRef = this.dialog.open(this.dialogInnerForm, {\r\n disableClose: true,\r\n hasBackdrop: true,\r\n width: '85%'\r\n });\r\n }\r\n\r\n /**\r\n * Metodo scatenato al salvataggio di una form di dettaglio. \r\n * @param event Form creata/modificata dall'utente. Se è null allora l'utente ha abbandonato la configurazione.\r\n */\r\n onSaveOrExitInnerForm(event: Form) {\r\n if (event != null) {\r\n if (this.form.Name === event.Name ||\r\n (\r\n this.form.InnerForms\r\n && this.form.InnerForms.find(\r\n (a, i) => a.Name === event.Name\r\n && (this.indexSelectedInnerForm == null ? true : this.indexSelectedInnerForm !== i)\r\n )\r\n ) ||\r\n (\r\n this.form.Fields\r\n && this.indexSelectedInnerForm == null\r\n && this.form.Fields.find(\r\n (f, i) => f.Label === event.Name\r\n && (this.indexSelectedField == null ? true : this.indexSelectedField !== i)\r\n )\r\n )\r\n ) {\r\n EqpDynamicModuleDialogService.Warning('Impossibile inserire due form di dettaglio con lo stesso nome.');\r\n throw new Error('Impossibile inserire due form di dettaglio con lo stesso nome.');\r\n }\r\n\r\n let innerFormField: BaseField = new BaseField();\r\n innerFormField.Name = event.Name.split(\" \").join(\"_\");\r\n innerFormField.Label = event.Name;\r\n innerFormField.FieldType = FieldTypeEnum['Form di dettaglio'];\r\n innerFormField.FieldGroup = this.indexSelectedField != null ? this.form.Fields[this.indexSelectedField].FieldGroup : null;\r\n\r\n if (this.indexSelectedInnerForm != null && this.indexSelectedInnerForm >= 0) {\r\n this.form.InnerForms[this.indexSelectedInnerForm] = event;\r\n this.form.Fields[this.indexSelectedField] = innerFormField;\r\n } else {\r\n if (!this.form.InnerForms) {\r\n this.form.InnerForms = new Array<Form>();\r\n }\r\n this.form.InnerForms.push(event);\r\n this.form.Fields.push(innerFormField);\r\n }\r\n this.reloadFieldsTable();\r\n }\r\n this.dialogInnerFormRef.close();\r\n }\r\n\r\n /**\r\n * Metodo per aprire il dialog di creazione/modifica delle action.\r\n * Se il parametro passato è null sono in aggiunta altrimenti sono in modifica.\r\n * @param action ActionOnRecord da modificare (se null allora vado in add).\r\n */\r\n openActionOnRecordDialog(action: ActionOnRecord = null) {\r\n if (action) {\r\n this.indexSelectedAction = this.form.ActionsOnRecord.indexOf(action);\r\n this.selectedAction = JSON.parse(JSON.stringify(action));\r\n } else {\r\n this.selectedAction = new ActionOnRecord();\r\n this.indexSelectedAction = null;\r\n }\r\n this.createActionOnRecordForm();\r\n this.dialogActionOnRecordRef = this.dialog.open(this.dialogActionOnRecord, {\r\n disableClose: true,\r\n hasBackdrop: true,\r\n width: '75%'\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per impostare i valori da suggerire nell'autocomplete del campo Formula.\r\n * Viene scatenato al focus (in questo caso viene passato il parametro a null per differenziarlo\r\n * dall'evento di click sulla tastiera) e al keyup sull'input (il parametro è diverso da null).\r\n * @param keyboardEvent Evento scatenato al keyup sulla tastiera. Se null allora il metodo è stato invocato dal focus sull'input.\r\n * @summary Aggiorna l'elenco dei suggerimenti per l'autocomplete se l'utente esegue il focus sull'input\r\n * oppure al keyup sulla tastiera di un tasto diverso dalle frecce.\r\n */\r\n setActionAutocompleteOptions(keyboardEvent: KeyboardEvent) {\r\n // Creo l'array per l'autocomplete solo se sto facendo il focus sull'input o se sto premendo un tasto\r\n // sulla tastiera diverso dalle frecce (in quest'ultimo caso, se non viene eseguito il filtro sull'evento,\r\n // non si può selezionare un suggerimento dell'autocomplete perchè al click verrebbe ricaricato l'array e\r\n // si prederebbe la selezione appena fatta).\r\n if (!keyboardEvent || !keyboardEvent.code.includes(\"Arrow\")) {\r\n this.actionAutocompleteOptions = UtilityHelperService.GetAutocompleteOptions(this.form.Fields, this.selectedAction.Action);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per salvare l'azione creata/modificate.\r\n */\r\n saveActionOnRecord() {\r\n if (\r\n this.form.ActionsOnRecord\r\n && this.form.ActionsOnRecord.find(\r\n (a, i) => a.Name === this.selectedAction.Name\r\n && (this.indexSelectedAction == null ? true : this.indexSelectedAction !== i)\r\n )\r\n ) {\r\n EqpDynamicModuleDialogService.Warning('Impossibile inserire due action con lo stesso nome.');\r\n throw new Error('Impossibile inserire due action con lo stesso nome.');\r\n }\r\n\r\n if (this.indexSelectedAction != null && this.indexSelectedAction >= 0) {\r\n this.form.ActionsOnRecord[this.indexSelectedAction] = this.selectedAction;\r\n } else {\r\n if (!this.form.ActionsOnRecord) {\r\n this.form.ActionsOnRecord = new Array<ActionOnRecord>();\r\n }\r\n this.form.ActionsOnRecord.push(this.selectedAction);\r\n }\r\n this.closeDialogActionOnRecord();\r\n this.setActionOrdinalPosition();\r\n this.reloadActionsOnRecordTable();\r\n }\r\n\r\n /**\r\n * Metodo per chiudere il dialog di gestione delle action.\r\n */\r\n closeDialogActionOnRecord() {\r\n this.dialogActionOnRecordRef.close();\r\n }\r\n\r\n /**\r\n * Metodo per segnare come conclusa la creazione della form e per crearne una copia\r\n * da visalizzare come anteprima.\r\n * @param completed Se TRUE segna la form come conclusa e ne crea una copia da visualizzare\r\n */\r\n setFormStatus(completed: boolean) {\r\n if (completed) {\r\n this.formCompleted = true;\r\n this.previewForm = JSON.parse(JSON.stringify(this.form));\r\n\r\n // Per visualizzare correttamente l'oanteprima della form appena creata\r\n // bisogna valorizzare la proprietà Name dei campi della form e delle InnerForms.\r\n this.previewForm.Fields.forEach(field => { field.Name = field.Label.split(' ').join('_'); });\r\n if (this.previewForm.InnerForms && this.previewForm.InnerForms.length > 0) {\r\n this.previewForm.InnerForms.forEach(form => {\r\n form.Fields.forEach(field => { field.Name = field.Label.split(' ').join('_'); });\r\n });\r\n }\r\n } else {\r\n this.formCompleted = false;\r\n this.previewForm = null;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che scatena l'evento di output per salvare la form creata alla fine del wizard\r\n */\r\n saveForm() {\r\n this.saveFormEvent.emit(this.form);\r\n }\r\n\r\n /**\r\n * Configura le colonne per le tabelle necessarie alla creazione della form:\r\n * - per la visualizzazione dei campi inseriti\r\n * - per le form di dettaglio create\r\n * - per le azioni configurate sui record della form\r\n */\r\n private configureColumns() {\r\n this.fieldsColumns = [\r\n {\r\n key: 'action', display: '', type: TypeColumn.MenuAction, buttonMenuIcon: 'more_vert', styles: { flex: '0 0 6%' },\r\n actions: [\r\n { name: 'Modifica', icon: 'edit', fn: (element, index, col) => this.editField(element) },\r\n { name: 'Elimina', icon: 'delete', fn: (element, index, col) => this.deleteElement(element, \"Fields\") },\r\n {\r\n name: 'Sposta su', icon: 'arrow_upward',\r\n fn: (element, index, col) => this.moveElement(element, true, \"Fields\"),\r\n disabled: (element) => this.form.Fields.indexOf(element) === 0\r\n },\r\n {\r\n name: 'Sposta giù', icon: 'arrow_downward',\r\n fn: (element, index, col) => this.moveElement(element, false, \"Fields\"),\r\n disabled: (element) => this.form.Fields.indexOf(element) >= (this.form.Fields.length - 1)\r\n },\r\n ]\r\n },\r\n { key: 'FieldType', display: 'Tipologia', type: TypeColumn.Enum, enumModel: FieldTypeEnum },\r\n { key: 'Label', display: 'Label' },\r\n { key: 'Description', display: 'Descrizione' },\r\n {\r\n key: 'Required', display: 'Obbligatorio',\r\n value: (element) => !!element.Required,\r\n type: TypeColumn.Boolean,\r\n booleanValues: {\r\n true: '<i class=\"fa fa-check success-color\"></i>',\r\n false: '<i class=\"fa fa-close error-color\"></i>'\r\n },\r\n styles: { flex: '0 0 7%', cellAlignment: CellAlignmentEnum.CENTER }\r\n },\r\n ];\r\n\r\n if (this.form.FormScalarType && this.form.FormScalarType != FormScalarTypeEnum.Semplice) {\r\n this.fieldsColumns.splice(\r\n this.fieldsColumns.findIndex(c => c.key == 'Description'), 0,\r\n { key: 'FieldGroup', display: 'Sezione', type: TypeColumn.ExternalTemplate, externalTemplate: this.fieldSectionColumnTemplate }\r\n );\r\n }\r\n\r\n this.actionsOnRecordColumns = [\r\n {\r\n key: 'action', display: '', type: TypeColumn.MenuAction, buttonMenuIcon: 'more_vert', styles: { flex: '0 0 6%' },\r\n actions: [\r\n { name: 'Modifica', icon: 'edit', fn: (element, index, col) => this.openActionOnRecordDialog(element) },\r\n { name: 'Elimina', icon: 'delete', fn: (element, index, col) => this.deleteElement(element, \"ActionsOnRecord\") },\r\n {\r\n name: 'Sposta su', icon: 'arrow_upward',\r\n fn: (element, index, col) => this.moveElement(element, true, \"ActionsOnRecord\"),\r\n disabled: (element) => this.form.ActionsOnRecord.indexOf(element) === 0\r\n },\r\n {\r\n name: 'Sposta giù', icon: 'arrow_downward',\r\n fn: (element, index, col) => this.moveElement(element, false, \"ActionsOnRecord\"),\r\n disabled: (element) => this.form.ActionsOnRecord.indexOf(element) >= (this.form.ActionsOnRecord.length - 1)\r\n },\r\n ]\r\n },\r\n { key: 'Icon', display: 'Icona', styles: { flex: ' 0 0 15%' } },\r\n { key: 'Name', display: 'Nome', styles: { flex: ' 0 0 20%' } },\r\n { key: 'Action', display: 'Azione' },\r\n ];\r\n }\r\n\r\n /**\r\n * Crea il FormGroup per l'oggetto Form\r\n */\r\n private createFormForm() {\r\n this.formFormGroup = this.formBuilder.group({\r\n Name: [this.form.Name, Validators.required],\r\n FormScalarType: [this.form.FormScalarType, Validators.required],\r\n });\r\n this.onChangeFormScalarType();\r\n }\r\n\r\n /**\r\n * Crea il FormGroup epr l'aggiunta o la modifica di una action sui record della Form.\r\n */\r\n private createActionOnRecordForm() {\r\n this.actionOnRecordFormGroup = this.formBuilder.group({\r\n Name: [this.selectedAction.Name, Validators.required],\r\n Icon: [this.selectedAction.Icon, Validators.required],\r\n Action: [this.selectedAction.Action, Validators.required],\r\n });\r\n }\r\n\r\n /**\r\n * Chiude il dialog per aggiungere/modificare un Field senza salvare\r\n */\r\n private closeFieldDialog() {\r\n this.dialogFieldRef.close();\r\n }\r\n\r\n /**\r\n * Metodo per gestire l'apertura del dialog per la modifica di un Field.\r\n * Se il field è di tipo \"Form di dettaglio\" apre il dialog per la modifica di una \r\n * InnerForm altrimenti apre quello per la modifica di un Field.\r\n * @param field Campo da modificare\r\n */\r\n private editField(field: BaseField) {\r\n if (field.FieldType != FieldTypeEnum['Form di dettaglio']) {\r\n this.openFieldDialog(field);\r\n } else {\r\n this.openInnerFormDialog(this.form.InnerForms.find(f => f.Name == field.Label));\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per rimuovere un Field all'interno di una Form.\r\n * Richiede conferma all'utente prima di rimuoverlo.\r\n * @param field BaseField da rimuovere\r\n */\r\n private deleteElement(element: BaseField | ActionOnRecord | Form, propertyName: string) {\r\n EqpDynamicModuleDialogService.Confirm('Eliminare l\\'elemento selezionato?', () => {\r\n this.form[propertyName].splice(this.form[propertyName].indexOf(element), 1);\r\n if (propertyName === \"Fields\") {\r\n this.setFieldOrdinalPosition();\r\n this.reloadFieldsTable();\r\n } else if (propertyName === \"ActionsOnRecord\") {\r\n this.setActionOrdinalPosition();\r\n this.reloadActionsOnRecordTable();\r\n }\r\n }, false, 'Richiesta conferma');\r\n }\r\n\r\n /**\r\n * Metodo per spostare un campo all'interno della form.\r\n * @param field Oggetto di tipo BaseField da spostare.\r\n * @param moveUp Se TRUE allora sposta verso l'alto il campo (abbassa l'indice) altrimenti il contrario.\r\n */\r\n private moveElement(element: BaseField | ActionOnRecord, moveUp: boolean, propertyName: string) {\r\n const startingIndex = this.form[propertyName].indexOf(element);\r\n const endingIndex = startingIndex + (moveUp ? -1 : 1);\r\n\r\n this.form[propertyName].splice(startingIndex, 1);\r\n this.form[propertyName].splice(endingIndex, 0, element);\r\n\r\n if (propertyName === \"Fields\") {\r\n this.setFieldOrdinalPosition();\r\n this.reloadFieldsTable();\r\n } else if (propertyName === \"ActionsOnRecord\") {\r\n this.setActionOrdinalPosition();\r\n this.reloadActionsOnRecordTable();\r\n }\r\n }\r\n\r\n /**\r\n * Imposta l'ordinamento delle sezioni che compongono la form.\r\n */\r\n private setFormFieldGroupOrdinalPosition() {\r\n this.form.FormFieldsGroups.forEach((g, i) => g.OrdinalPosition = i);\r\n }\r\n\r\n /**\r\n * Imposta l'ordinamento dei campi all'interno della form in base all'ordine che l'utente\r\n * ha definito nella tabella in cui sono mostrati\r\n */\r\n private setFieldOrdinalPosition() {\r\n if (this.form.Fields) {\r\n this.form.Fields.forEach(field => {\r\n field.OrdinalPosition = this.form.Fields.indexOf(field);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per ricaricare i dati della tabella dei campi aggiunti in una form\r\n */\r\n private reloadFieldsTable() {\r\n if (this.fieldsTable) {\r\n this.fieldsTable.reloadDatatable();\r\n }\r\n }\r\n\r\n /**\r\n * Imposta l'ordinamento dei campi all'interno della form in base all'ordine che l'utente\r\n * ha definito nella tabella in cui sono mostrati\r\n */\r\n private setActionOrdinalPosition() {\r\n if (this.form.ActionsOnRecord) {\r\n this.form.ActionsOnRecord.forEach(action => {\r\n action.OrdinalPosition = this.form.ActionsOnRecord.indexOf(action);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per ricaricare i dati della tabella delle azioni aggiuntive sui record della Form.\r\n */\r\n private reloadActionsOnRecordTable() {\r\n if (this.actionsOnRecordTable) {\r\n this.actionsOnRecordTable.reloadDatatable();\r\n }\r\n }\r\n}\r\n","import { BaseField } from \"../baseField.model\";\r\n\r\nexport class AttachmentField extends BaseField {\r\n /**Elenco delle estensioni consentite. Se vuoto usa il default (pdf) */\r\n AllowedExtensions: Array<string>;\r\n\r\n /**Se true permette l'inserimento di più allegati. In questo caso i metadati vengono rappresentati come una detail */\r\n IsMultiAttach: boolean;\r\n\r\n /**Elenco campi che possono rappresentare i metadati dell'allegato, ad esempio nome, ecc... */\r\n MetadataFields: Array<BaseField>;\r\n}\r\n\r\nexport const AvailableFileExtensions: Array<{ key: string, value: string }> = [\r\n { value: '.pdf', key: 'application/pdf' },\r\n { value: '.doc', key: 'application/msword' },\r\n { value: '.xls', key: 'application/vnd.ms-excel' },\r\n { value: '.ppt', key: 'application/vnd.ms-powerpoint' },\r\n { value: '.docx', key: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' },\r\n { value: '.xlsx', key: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' },\r\n { value: '.pptx', key: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' },\r\n { value: '.csv', key: 'text/csv' },\r\n { value: '.txt', key: 'text/plain' },\r\n];\r\n\r\nexport const AvailableImageExtensions: Array<{ key: string, value: string }> = [\r\n { value: '.jpg/.jpeg', key: 'image/jpeg' },\r\n { value: '.png', key: 'image/png' },\r\n { value: '.bmp', key: 'image/bmp' },\r\n { value: '.svg', key: 'image/svg+xml' },\r\n { value: '.ico', key: 'image/x-icon' },\r\n];","import { BaseField } from \"../baseField.model\";\r\n\r\nexport class BooleanField extends BaseField {\r\n /**Se true il boolean accetta anche il valore N/A (non assegnato) */\r\n IsTristate: boolean;\r\n PresetationType: BoolPresentantioEnum;\r\n}\r\n\r\nexport enum BoolPresentantioEnum {\r\n \"Checkbox\" = 1,\r\n \"Toggle\" = 2,\r\n \"Radio button\" = 3,\r\n // \"Stringa true o false\" = 3,\r\n // \"Numerico 0 o 1\" = 4\r\n}","import { BaseField } from \"../baseField.model\";\r\n\r\n/**Rappresenta la configurazione di un campo Data o Data e ora, o solo ora */\r\nexport class DateField extends BaseField {\r\n IsOnlyDate: DateTimeTypeEnum;\r\n MinDate: Date;\r\n MaxDate: Date;\r\n}\r\n\r\nexport enum DateTimeTypeEnum {\r\n \"Solo data\" = 1,\r\n \"Solo orario\" = 2,\r\n \"Data e ora\" = 3\r\n}","import { BaseField } from \"../baseField.model\";\r\n\r\n/**Lista di valori */\r\nexport class ListValueField extends BaseField {\r\n /**\r\n * Lista di valori ordinata. La parte \"Value\", viene utilizzata in modi diversi a seconda del tipo di presentazione, e/o \r\n * come valore relazionato nelle formule\r\n */\r\n ValuePairs: { [key: string]: any };\r\n\r\n /**Se true è l'utente può scegliere più di un valore */\r\n IsMultiChoiche: boolean;\r\n\r\n /**Modalità di presentazione */\r\n PresentationMode: ListPresentationEnum;\r\n}\r\n\r\nexport enum ListPresentationEnum {\r\n \"Combo box\" = 1,\r\n \"Radio button\" = 2,\r\n \"Pulsante con testo\" = 3,\r\n \"Immagini\" = 4\r\n}","import { Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { EnumHelper } from '@eqproject/eqp-select';\r\nimport { CellAlignmentEnum, ConfigColumn, EqpTableComponent, TypeColumn } from '@eqproject/eqp-table';\r\nimport { BaseField, ColSpanSizesEnum, FieldTypeEnum } from '../../../models/baseField.model';\r\nimport { AttachmentField, AvailableFileExtensions, AvailableImageExtensions } from '../../../models/fields/attachmentField.model';\r\nimport { BooleanField, BoolPresentantioEnum } from '../../../models/fields/booleanField.model';\r\nimport { DateField, DateTimeTypeEnum } from '../../../models/fields/dateField.model';\r\nimport { ImageField } from '../../../models/fields/imageField.model';\r\nimport { ListPresentationEnum, ListValueField } from '../../../models/fields/listValueField.model';\r\nimport { LookupField } from '../../../models/fields/lookupField.model';\r\nimport { NumericField } from '../../../models/fields/numericField.model';\r\nimport { TextareaField } from '../../../models/fields/testareaField.model';\r\nimport { TextField } from '../../../models/fields/textField.model';\r\nimport { FormFieldGroup } from '../../../models/form.model';\r\nimport { EqpDynamicModuleDialogService } from '../../../services/eqp-dynamic-module-dialog.service';\r\nimport { UtilityHelperService } from '../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'eqp-dynamic-module-add-form-field',\r\n templateUrl: './add-form-field.component.html',\r\n styleUrls: ['./add-form-field.component.scss']\r\n})\r\nexport class AddFormFieldComponent implements OnInit {\r\n\r\n @Input() field: BaseField | any;\r\n @Input() indexField: number;\r\n @Input() formFieldsGroups: Array<FormFieldGroup>;\r\n /** Elenco dei Field creati nella form, usati per popolare l'autocomplete della proprietà Formula. */\r\n @Input() availableFields: Array<BaseField>;\r\n @Input() fieldTypesToExclude: Array<FieldTypeEnum> = [FieldTypeEnum['Form di dettaglio']];\r\n\r\n fieldFormGroup: FormGroup;\r\n keyValueObject: { key: string, value: string } = { key: '', value: '' };\r\n availableColSpanSizes: Array<ColSpanSizesEnum> = [];\r\n formulaAutocompleteOptions: Array<{ label: string, value: string }>;\r\n AvailableFileExtensions = AvailableFileExtensions;\r\n AvailableImageExtensions = AvailableImageExtensions;\r\n\r\n @Output() saveFieldEvent: EventEmitter<BaseField | any> = new EventEmitter<BaseField | any>();\r\n\r\n //#region Template dei vari pezzi di form per la creazione di un campo(in base al tipo scelto).\r\n fieldTypeFormTemplate: TemplateRef<any>;\r\n @ViewChild('textFieldFormTemplate', { static: true }) textFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('textareaFieldFormTemplate', { static: true }) textareaFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('booleadFieldFormTemplate', { static: true }) booleadFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('dateFieldFormTemplate', { static: true }) dateFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('numericFieldFormTemplate', { static: true }) numericFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('attachmentFieldFormTemplate', { static: true }) attachmentFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('imageFieldFormTemplate', { static: true }) imageFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('listValueFieldFormTemplate', { static: true }) listValueFieldFormTemplate: TemplateRef<any>;\r\n @ViewChild('lookupFieldFormTemplate', { static: true }) lookupFieldFormTemplate: TemplateRef<any>;\r\n //#endregion\r\n\r\n //#region Proprietà per gestire i metadata nei campi ti dipo Allegato o Immagine\r\n metadataColumns: Array<ConfigColumn>;\r\n @ViewChild('metadataFieldsTable', { static: false }) metadataFieldsTable: EqpTableComponent;\r\n selectedMetadata: BaseField;\r\n indexSelectedMetadata: number;\r\n dialogMetadataRef: MatDialogRef<TemplateRef<any>>;\r\n @ViewChild('dialogMetadata', { static: true }) dialogMetadata: TemplateRef<any>;\r\n //#endregion\r\n\r\n //#region Enumeratori usati nell'html\r\n FieldTypeEnum = FieldTypeEnum;\r\n BoolPresentantioEnum = BoolPresentantioEnum;\r\n DateTimeTypeEnum = DateTimeTypeEnum;\r\n ListPresentationEnum = ListPresentationEnum;\r\n //#endregion\r\n\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private enumHelper: EnumHelper,\r\n private dialog: MatDialog\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (!this.fieldTypesToExclude.includes(FieldTypeEnum['Form di dettaglio'])) {\r\n this.fieldTypesToExclude.push(FieldTypeEnum['Form di dettaglio']);\r\n }\r\n\r\n this.onFieldTypeChange(false);\r\n this.availableFields = this.availableFields ? this.availableFields.filter(f => f != this.field) : [];\r\n this.configureColumns();\r\n }\r\n\r\n /**\r\n * Metodo per impostare i valori da suggerire nell'autocomplete del campo Formula.\r\n * Viene scatenato al focus (in questo caso viene passato il parametro a null per differenziarlo\r\n * dall'evento di click sulla tastiera) e al keyup sull'input (il parametro è diverso da null).\r\n * @param keyboardEvent Evento scatenato al keyup sulla tastiera. Se null allora il metodo è stato invocato dal focus sull'input.\r\n * @summary Aggiorna l'elenco dei suggerimenti per l'autocomplete se l'utente esegue il focus sull'input\r\n * oppure al keyup sulla tastiera di un tasto diverso dalle frecce.\r\n */\r\n setFormulaAutocompleteOptions(keyboardEvent: KeyboardEvent) {\r\n // Creo l'array per l'autocomplete solo se sto facendo il focus sull'input o se sto premendo un tasto\r\n // sulla tastiera diverso dalle frecce (in quest'ultimo caso, se non viene eseguito il filtro sull'evento,\r\n // non si può selezionare un suggerimento dell'autocomplete perchè al click verrebbe ricaricato l'array e\r\n // si prederebbe la selezione appena fatta).\r\n if (!keyboardEvent || !keyboardEvent.code.includes(\"Arrow\")) {\r\n this.formulaAutocompleteOptions = UtilityHelperService.GetAutocompleteOptions(this.availableFields, this.field.Formula);\r\n }\r\n }\r\n\r\n /**\r\n * Crea il FormGroup per l'aggiunta di un nuovo campo all'interno della form.\r\n * Metodo richiamato ogni volta che cambia il tipo del campo scelto o viene aggiunto/modificato un Field\r\n */\r\n createFieldForm() {\r\n this.fieldFormGroup = this.formBuilder.group({\r\n Label: [this.field.Label, Validators.required],\r\n Description: [this.field.Description],\r\n Required: [this.field.Required],\r\n FieldType: [this.field.FieldType, Validators.required],\r\n Formula: [this.field.Formula],\r\n ColSizes: [this.field.ColSizes],\r\n InListView: [this.field.InListView],\r\n });\r\n\r\n if (this.formFieldsGroups) {\r\n this.fieldFormGroup.addControl('FieldGroup', new FormControl(this.field.FieldGroup, Validators.required));\r\n }\r\n }\r\n\r\n /**\r\n * Metodo chiamato quando cambia il FieldType del BaseField che si sta aggiungendo/modificando.\r\n * Ricrea l'oggetto field popolando solo le proprietà del BaseField inserite dall'utente\r\n * (quelle comuni a tutte le tipologie di campo), ricrea la form e, in base al FieldType scelto,\r\n * aggiunge alla form i FormControl necessari e seleziona il template corretto da usare.\r\n * @param restoreField Se TRUE ripristina i valori base (ereditati dal modello BaseField) del campo aggiunto/modificato\r\n */\r\n onFieldTypeChange(restoreField: boolean = true) {\r\n if (restoreField)\r\n this.restoreBaseFieldProperties();\r\n this.createFieldForm();\r\n this.onColSizeSelect();\r\n this.fieldTypeFormTemplate = null;\r\n switch (this.field.FieldType) {\r\n case FieldTypeEnum['Campo di testo']:\r\n this.fieldFormGroup.addControl('TextMask', new FormControl((this.field as TextField).TextMask));\r\n this.fieldFormGroup.addControl('MaxLenght', new FormControl((this.field as TextField).MaxLenght));\r\n this.fieldFormGroup.addControl('MinLenght', new FormControl((this.field as TextField).MinLenght));\r\n this.fieldTypeFormTemplate = this.textFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum['Area di testo']:\r\n this.fieldFormGroup.addControl('Rows', new FormControl((this.field as TextareaField).Rows));\r\n this.fieldFormGroup.addControl('MaxLenght', new FormControl((this.field as TextareaField).MaxLenght));\r\n this.fieldFormGroup.addControl('MinLenght', new FormControl((this.field as TextareaField).MinLenght));\r\n this.fieldTypeFormTemplate = this.textareaFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum.Booleano:\r\n this.fieldFormGroup.addControl('IsTristate', new FormControl((this.field as BooleanField).IsTristate));\r\n this.fieldFormGroup.addControl(\r\n 'PresetationType',\r\n new FormControl((this.field as BooleanField).PresetationType, Validators.required)\r\n );\r\n this.fieldTypeFormTemplate = this.booleadFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum['Data e/o ora']:\r\n this.fieldFormGroup.addControl('IsOnlyDate', new FormControl((this.field as DateField).IsOnlyDate, Validators.required));\r\n this.fieldFormGroup.addControl('MinDate', new FormControl((this.field as DateField).MinDate));\r\n this.fieldFormGroup.addControl('MaxDate', new FormControl((this.field as DateField).MaxDate));\r\n this.fieldTypeFormTemplate = this.dateFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum['Campo numerico']:\r\n this.fieldFormGroup.addControl('IsInteger', new FormControl((this.field as NumericField).IsInteger));\r\n this.fieldFormGroup.addControl('MinValue', new FormControl((this.field as NumericField).MinValue));\r\n this.fieldFormGroup.addControl('MaxValue', new FormControl((this.field as NumericField).MaxValue));\r\n this.fieldFormGroup.addControl('NumberFormat', new FormControl((this.field as NumericField).NumberFormat));\r\n this.fieldFormGroup.addControl('CurrencySymbol', new FormControl((this.field as NumericField).CurrencySymbol));\r\n this.fieldTypeFormTemplate = this.numericFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum.Allegato:\r\n this.fieldFormGroup.addControl(\"AllowedExtensions\", new FormControl((this.field as AttachmentField).AllowedExtensions));\r\n this.fieldFormGroup.addControl('IsMultiAttach', new FormControl((this.field as AttachmentField).IsMultiAttach));\r\n this.fieldTypeFormTemplate = this.attachmentFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum.Immagine:\r\n (this.field as ImageField).AttachDefinition = new AttachmentField();\r\n this.fieldFormGroup.addControl('IsMultiAttach', new FormControl((this.field as ImageField).AttachDefinition.IsMultiAttach));\r\n // this.fieldFormGroup.addControl('ImgName', new FormControl((this.field as ImageField).ImgName, Validators.required));\r\n this.fieldFormGroup.addControl('IsMultiPoint', new FormControl((this.field as ImageField).IsMultiPoint));\r\n this.fieldFormGroup.addControl(\"AllowedExtensions\", new FormControl((this.field as ImageField).AttachDefinition.AllowedExtensions));\r\n this.fieldFormGroup.addControl(\r\n 'ImageIsContextualAttachment',\r\n new FormControl((this.field as ImageField).ImageIsContextualAttachment)\r\n );\r\n this.fieldTypeFormTemplate = this.imageFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum['Elenco generico']:\r\n this.fieldFormGroup.addControl('IsMultiChoiche', new FormControl((this.field as ListValueField).IsMultiChoiche));\r\n this.fieldFormGroup.addControl(\r\n 'PresentationMode',\r\n new FormControl((this.field as ListValueField).PresentationMode, Validators.required)\r\n );\r\n this.fieldTypeFormTemplate = this.listValueFieldFormTemplate;\r\n break;\r\n case FieldTypeEnum.Lookup:\r\n this.fieldFormGroup.addControl(\r\n 'EntitySourceName',\r\n new FormControl((this.field as LookupField).EntitySourceName, Validators.required)\r\n );\r\n this.fieldFormGroup.addControl('UseAsGetOrDiscard', new FormControl((this.field as LookupField).UseAsGetOrDiscard));\r\n this.fieldTypeFormTemplate = this.lookupFieldFormTemplate;\r\n break;\r\n }\r\n if ([FieldTypeEnum.Allegato, FieldTypeEnum.Immagine, FieldTypeEnum['Form di dettaglio']].includes(this.field.FieldType)) {\r\n this.field.Formula = null;\r\n this.fieldFormGroup.controls[\"Formula\"].disable();\r\n } else {\r\n this.fieldFormGroup.controls[\"Formula\"].enable();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo invocato alla selezione di una classe nella select per le colonne di bootstrap\r\n * da usare nella visualizzazione del campo. Questa funzione manipola la sorgente dati per\r\n * la eqp-select in modo da escludere i valori dell'enumeratore che fanno riferimento ad\r\n * una larghezza di schermo già selezionata. Esempio: per gli schermi piccoli (sm) l'utente\r\n * seleziona la classe \"col-sm-6\", al change del valore questo metodo rimuove dalla select\r\n * tutti gli altri valori per la grandezza di schermo selezionata.\r\n */\r\n onColSizeSelect() {\r\n // Recupero l'array degli oggetti chiave-valore che rappreseta l'enumeratore\r\n let colSizeClassEnumArray = this.enumHelper.getEnumArray(ColSpanSizesEnum, false, null);\r\n // Costruisco l'array delle classi selezionate dall'utente in formato stringa\r\n let selectedDimensions: Array<string> = this.field.ColSizes ? this.field.ColSizes.map(col => ColSpanSizesEnum[col]) : [];\r\n // Filtro i valori ottenuti dall'enumeratore per escludere tutti i valori per le\r\n // grandezze di schermo già selezionatead esclusione dei valori selezionati.\r\n this.availableColSpanSizes = colSizeClassEnumArray.filter((value: { key: number, value: string }) =>\r\n !selectedDimensions.find(col => value.value.includes(col.substring(4, 6)) && value.value != col)\r\n );\r\n }\r\n\r\n /**\r\n * Metodo chiamato al keyup degli input testuali che prevedono l'aggiunta del valore inserito in un array.\r\n * Se l'utente preme il tasto invio, in base al tipo di campo che sta inserendo/modificando, questo metodo\r\n * aggiunge il valore inserito dall'utente nella lista di stringhe corretta (in input viene passato il nome\r\n * della proprietà in cui inserire la stringa).\r\n * @param event Evento che rappresenta il keyup dell'utente\r\n * @param propertyName Nome della proprietà del field in cui inserire la stringa digitata.\r\n */\r\n onMultiSelectInputKeyup(event, propertyName: string) {\r\n if (event.code === 'Enter' || event.code === 'NumpadEnter') {\r\n switch (this.field.FieldType) {\r\n case FieldTypeEnum.Lookup:\r\n case FieldTypeEnum.Allegato:\r\n if (!this.field[propertyName]) {\r\n this.field[propertyName] = new Array<string>();\r\n }\r\n this.field[propertyName].push(event.currentTarget.value);\r\n break;\r\n case FieldTypeEnum.Immagine:\r\n if (!(this.field as ImageField).AttachDefinition[propertyName]) {\r\n (this.field as ImageField).AttachDefinition[propertyName] = new Array<string>();\r\n }\r\n (this.field as ImageField).AttachDefinition[propertyName].push(event.currentTarget.value);\r\n break;\r\n case FieldTypeEnum['Elenco generico']:\r\n if (!this.keyValueObject.key || !this.keyValueObject.value) {\r\n return;\r\n }\r\n if (!(this.field as ListValueField).ValuePairs) {\r\n (this.field as ListValueField).ValuePairs = {};\r\n }\r\n (this.field as ListValueField).ValuePairs[this.keyValueObject.key] = this.keyValueObject.value;\r\n this.keyValueObject = { key: '', value: '' };\r\n break;\r\n }\r\n event.currentTarget.value = null;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo chiamato per mostrare come elenco le opzioni aggiunte in un campo di tipo \"Elenco generico\".\r\n * @returns Restituisce un array di oggetti del tipo { key: string, value: string } con i valori inseriti dall'utente.\r\n */\r\n getDictionaryKeyValue() {\r\n if ((this.field as ListValueField).ValuePairs) {\r\n return Object.keys((this.field as ListValueField).ValuePairs).map(k => {\r\n return {\r\n key: k,\r\n value: (this.field as ListValueField).ValuePairs[k]\r\n };\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per rimuovere una opzione aggiunta al campo di tipo \"Elenco generico\"\r\n * @param key Nome della chiave da rimuovere\r\n */\r\n deleteKeyFromDictionary(key: string) {\r\n delete (this.field as ListValueField).ValuePairs[key];\r\n }\r\n\r\n /**\r\n * Metodo per aprire il dialog per aggiungere/modificare un metadata in un campo di tipo Allegato o Immagine.\r\n * @param metadata Metadata da modificare, se null allora ne sto creando uno nuovo.\r\n */\r\n openMetadataDialog(field: BaseField = null) {\r\n if (field) {\r\n if (this.field.FieldType === FieldTypeEnum.Allegato) {\r\n this.indexSelectedMetadata = (this.field as AttachmentField).MetadataFields.indexOf(field);\r\n this.selectedMetadata = JSON.parse(JSON.stringify(field));\r\n } else if (this.field.FieldType === FieldTypeEnum.Immagine) {\r\n this.indexSelectedMetadata = (this.field as ImageField).AttachDefinition.MetadataFields.indexOf(field);\r\n this.selectedMetadata = JSON.parse(JSON.stringify(field));\r\n }\r\n } else {\r\n this.selectedMetadata = new BaseField();\r\n this.indexSelectedMetadata = null;\r\n }\r\n this.dialogMetadataRef = this.dialog.open(this.dialogMetadata, {\r\n disableClose: true,\r\n hasBackdrop: true,\r\n width: '75%'\r\n });\r\n }\r\n\r\n /**\r\n * Metodo invocato dall'output dal dialog per aggiungere/modificare un metadata\r\n * nei campi di tipo Allegato o Immagine. Prima di aggiungere il metadata nell'elenco\r\n * contolla se esiste un altro metadata con lo stesso nome e nel caso genera un errore\r\n * (i metadata, come per i campi della form, devono avere un nome univoco).\r\n * @param metadata Metadata aggiunto o modificato, se null allora il dialog è stato chiuso senza fare modifiche.\r\n */\r\n onSaveMetadata(metadata: BaseField) {\r\n if (metadata) {\r\n if (\r\n (this.field.FieldType === FieldTypeEnum.Allegato\r\n && (this.field as AttachmentField).MetadataFields\r\n && (this.field as AttachmentField).MetadataFields.find(\r\n (m, i) => m.Label === metadata.Label\r\n && (this.indexSelectedMetadata == null ? true : this.indexSelectedMetadata !== i)\r\n )\r\n ) ||\r\n (this.field.FieldType === FieldTypeEnum.Immagine\r\n && (this.field as ImageField).AttachDefinition.MetadataFields\r\n && (this.field as ImageField).AttachDefinition.MetadataFields.find(\r\n (m, i) => m.Label === metadata.Label\r\n && (this.indexSelectedMetadata == null ? true : this.indexSelectedMetadata !== i)\r\n )\r\n )\r\n ) {\r\n EqpDynamicModuleDialogService.Warning('Impossibile inserire due metadata con la stessa label.');\r\n throw new Error('Impossibile inserire due metadata con la stessa label.');\r\n }\r\n\r\n if (this.indexSelectedMetadata != null && this.indexSelectedMetadata >= 0) {\r\n if (this.field.FieldType === FieldTypeEnum.Allegato) {\r\n (this.field as AttachmentField).MetadataFields[this.indexSelectedMetadata] = metadata;\r\n } else if (this.field.FieldType === FieldTypeEnum.Immagine) {\r\n (this.field as ImageField).AttachDefinition.MetadataFields[this.indexSelectedMetadata] = metadata;\r\n }\r\n } else {\r\n if (this.field.FieldType === FieldTypeEnum.Allegato) {\r\n if (!(this.field as AttachmentField).MetadataFields) {\r\n (this.field as AttachmentField).MetadataFields = new Array<BaseField>();\r\n }\r\n (this.field as AttachmentField).MetadataFields.push(metadata);\r\n } else if (this.field.FieldType === FieldTypeEnum.Immagine) {\r\n if (!(this.field as ImageField).AttachDefinition.MetadataFields) {\r\n (this.field as ImageField).AttachDefinition.MetadataFields = new Array<BaseField>();\r\n }\r\n (this.field as ImageField).AttachDefinition.MetadataFields.push(metadata);\r\n }\r\n }\r\n }\r\n this.dialogMetadataRef.close();\r\n this.setMetadataOrdinalPosition();\r\n this.reloadMetadataTable();\r\n }\r\n\r\n /**\r\n * Metodo per disabilitare il pulsante per salvare il campo inserito/modificato.\r\n * @returns Restituisce un booleano, se true il salvataggio viene disabilitato.\r\n */\r\n disableSaveField(): boolean {\r\n if (this.fieldFormGroup.invalid) {\r\n return true;\r\n }\r\n\r\n switch (this.field.FieldType) {\r\n\r\n case FieldTypeEnum['Elenco generico']:\r\n return !(this.field as ListValueField).ValuePairs || (this.field as ListValueField).ValuePairs.length === 0;\r\n case FieldTypeEnum.Lookup:\r\n return !(this.field as LookupField).FieldNames || (this.field as LookupField).FieldNames.length === 0;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per salvare il campo inserito/modificato.\r\n * Se è stato inserito un field con la stessa label viene generato un errore (le label devono essere univoche).\r\n * Una volta aggiunto/aggiornato il campo nell'elenco dei Field della Form chiude il dialog e ricarica la tabella\r\n * che mostra l'elenco dei campi aggiunti alla form.\r\n */\r\n saveAndExitAddField(save: boolean) {\r\n if (save) {\r\n this.saveFieldEvent.emit(this.field);\r\n } else {\r\n this.saveFieldEvent.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per ripristinare l'oggetto field al cambio del tipo selezionato.\r\n * Lascia valorizzate solo le proprietà dell'oggetto BaseField comune a tutti i tipi di campo.\r\n */\r\n private restoreBaseFieldProperties() {\r\n if (this.field) {\r\n const tmpBaseField = JSON.parse(JSON.stringify(this.field));\r\n this.field = new BaseField();\r\n this.field.Label = tmpBaseField.Label;\r\n this.field.Description = tmpBaseField.Description;\r\n this.field.Required = tmpBaseField.Required;\r\n this.field.FieldType = tmpBaseField.FieldType;\r\n this.field.Formula = tmpBaseField.Formula;\r\n this.field.ColSizes = tmpBaseField.ColSizes;\r\n this.field.FieldGroup = tmpBaseField.FieldGroup;\r\n }\r\n }\r\n\r\n private configureColumns() {\r\n this.metadataColumns = [\r\n {\r\n key: 'action', display: '', type: TypeColumn.MenuAction, buttonMenuIcon: 'more_vert', styles: { flex: '0 0 6%' },\r\n actions: [\r\n { name: 'Modifica', icon: 'edit', fn: (element, index, col) => this.openMetadataDialog(element) },\r\n { name: 'Elimina', icon: 'delete', fn: (element, index, col) => this.deleteMetadata(element) },\r\n ]\r\n },\r\n { key: 'FieldType', display: 'Tipologia', type: TypeColumn.Enum, enumModel: FieldTypeEnum },\r\n { key: 'Label', display: 'Label' },\r\n { key: 'Description', display: 'Descrizione' },\r\n {\r\n key: 'Required', display: 'Obbligatorio',\r\n value: (element) => !!element.Required,\r\n type: TypeColumn.Boolean,\r\n booleanValues: {\r\n true: '<i class=\"fa fa-check success-color\"></i>',\r\n false: '<i class=\"fa fa-close error-color\"></i>'\r\n },\r\n styles: { flex: '0 0 7%', cellAlignment: CellAlignmentEnum.CENTER }\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Metodo per eliminare un metadata aggiunto per un campo di tipo Allegato o Immagine.\r\n * @param metadata Metadata da eliminare.\r\n */\r\n private deleteMetadata(metadata: BaseField) {\r\n EqpDynamicModuleDialogService.Confirm('Eliminare il metadata selezionato?', () => {\r\n if (this.field.FieldType === FieldTypeEnum.Allegato) {\r\n (this.field as AttachmentField).MetadataFields.splice((this.field as AttachmentField).MetadataFields.indexOf(metadata), 1);\r\n } else if (this.field.FieldType === FieldTypeEnum.Immagine) {\r\n (this.field as ImageField).AttachDefinition.MetadataFields.splice((this.field as ImageField).AttachDefinition.MetadataFields.indexOf(metadata), 1);\r\n }\r\n this.setMetadataOrdinalPosition();\r\n this.reloadMetadataTable();\r\n }, false, 'Richiesta conferma');\r\n }\r\n\r\n /**\r\n * Imposta l'ordinamento dei metadata all'interno dei campi di tipo Allegato e Immagine.\r\n */\r\n private setMetadataOrdinalPosition() {\r\n if (this.field.FieldType === FieldTypeEnum.Allegato) {\r\n if ((this.field as AttachmentField).MetadataFields) {\r\n (this.field as AttachmentField).MetadataFields.forEach(metadata => {\r\n metadata.OrdinalPosition = (this.field as AttachmentField).MetadataFields.indexOf(metadata);\r\n });\r\n }\r\n } else if (this.field.FieldType === FieldTypeEnum.Immagine) {\r\n if ((this.field as ImageField).AttachDefinition.MetadataFields) {\r\n (this.field as ImageField).AttachDefinition.MetadataFields.forEach(metadata => {\r\n metadata.OrdinalPosition = (this.field as ImageField).AttachDefinition.MetadataFields.indexOf(metadata);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per ricaricare i dati della tabella dei metadata visualizzata nella creazione/modifica \r\n * dei campi di tipo Allegato o Immagine.\r\n */\r\n private reloadMetadataTable() {\r\n if (this.metadataFieldsTable) {\r\n this.metadataFieldsTable.reloadDatatable();\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { TextField } from '../../../../models/fields/textField.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'text-field-template',\r\n templateUrl: './text-field-template.component.html',\r\n styleUrls: ['./text-field-template.component.scss']\r\n})\r\nexport class TextFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() field: TextField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { BooleanField, BoolPresentantioEnum } from '../../../../models/fields/booleanField.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'boolean-field-template',\r\n templateUrl: './boolean-field-template.component.html',\r\n styleUrls: ['./boolean-field-template.component.scss']\r\n})\r\nexport class BooleanFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() field: BooleanField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n BoolPresentantioEnum = BoolPresentantioEnum;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n if (this.record[this.field.Name] == undefined || this.record[this.field.Name] == null) {\r\n this.record[this.field.Name] = this.field.IsTristate ? null : false;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { PickerModeEnum } from '@eqproject/eqp-datetimepicker';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { DateField, DateTimeTypeEnum } from '../../../../models/fields/dateField.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'date-field-template',\r\n templateUrl: './date-field-template.component.html',\r\n styleUrls: ['./date-field-template.component.scss']\r\n})\r\nexport class DateFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() field: DateField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n pickerMode: PickerModeEnum;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.setTimeType();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n\r\n /**\r\n * In base al formato della data richiesta nel DateField (solo data, solo orario o data e ora)\r\n * imposta la visualizzazione corretta del componente eqp-datetimepicker.\r\n */\r\n private setTimeType() {\r\n switch (this.field.IsOnlyDate) {\r\n case DateTimeTypeEnum[\"Solo data\"]:\r\n this.pickerMode = PickerModeEnum.DATE;\r\n break;\r\n case DateTimeTypeEnum[\"Solo orario\"]:\r\n this.pickerMode = PickerModeEnum.TIME;\r\n break;\r\n case DateTimeTypeEnum[\"Data e ora\"]:\r\n this.pickerMode = PickerModeEnum.DATETIME;\r\n break;\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { TextareaField } from '../../../../models/fields/testareaField.model';\r\n\r\n@Component({\r\n selector: 'textarea-field-template',\r\n templateUrl: './textarea-field-template.component.html',\r\n styleUrls: ['./textarea-field-template.component.scss']\r\n})\r\nexport class TextareaFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() field: TextareaField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { NumericMaskConfig } from '@eqproject/eqp-numeric';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { NumericField } from '../../../../models/fields/numericField.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\n\r\n@Component({\r\n selector: 'numeric-field-template',\r\n templateUrl: './numeric-field-template.component.html',\r\n styleUrls: ['./numeric-field-template.component.scss']\r\n})\r\nexport class NumericFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() field: NumericField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n eqpNumericOptions: Partial<NumericMaskConfig> = {};\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.configureEqpNumericOptions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per configurare eqp-numeric\r\n */\r\n private configureEqpNumericOptions() {\r\n this.eqpNumericOptions.prefix = this.field.CurrencySymbol ? this.field.CurrencySymbol : \"\";\r\n if (this.field.MinValue != null && this.field.MinValue != undefined)\r\n this.eqpNumericOptions.min = this.field.MinValue;\r\n if (this.field.MaxValue != null && this.field.MaxValue != undefined)\r\n this.eqpNumericOptions.max = this.field.MaxValue;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { ListPresentationEnum, ListValueField } from '../../../../models/fields/listValueField.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'list-value-field-template',\r\n templateUrl: './list-value-field-template.component.html',\r\n styleUrls: ['./list-value-field-template.component.scss']\r\n})\r\nexport class ListValueFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() field: ListValueField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n ListPresentationEnum = ListPresentationEnum;\r\n arrayData: { Key: string, Value: any, Selected?: boolean }[] = [];\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.setArrayData();\r\n if (this.field.IsMultiChoiche && !this.record[this.field.Name]) {\r\n this.record[this.field.Name] = [];\r\n }\r\n // Nel caso in cui sono in modifica di un Record aggiorno il valore\r\n // e il validator del FormControl. Se non viene eseguita questa riga\r\n // l'utente deve modificare la selezione fatta per aggiornare la form.\r\n this.setFormControlValue();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per recuperare la classe da applicare al button (nella relativa visualizzazione).\r\n * Se il pulsante è stato selezionato imposta la classe \"selected-button\".\r\n * @param data Oggetto bindato al pulsante\r\n * @returns Restituisce la classe da applicare tramite [ngClass]\r\n */\r\n getSelectButtonClass(data: { Key: string, Value: any, Selected?: boolean }): string {\r\n const selectedButtonClass: string = \"selected-button\";\r\n return data.Selected ? selectedButtonClass : null;\r\n }\r\n\r\n /**\r\n * Metodo invocato quando viene selezionata un'opzione nella visualizzazione a button\r\n * @param data Rappresenta l'oggetto selezionato\r\n */\r\n buttonSelectClick(data: { Key: string, Value: any, Selected?: boolean }) {\r\n if (this.field.IsMultiChoiche) {\r\n data.Selected = !data.Selected;\r\n this.updateSelected(false);\r\n } else {\r\n this.record[this.field.Name] = data.Value;\r\n }\r\n this.onRecordValueChange();\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il/i valore/i selezionato/i dall'utente.\r\n * @param emitChange Se true scatena l'evento di output della modifica del valore di record\r\n */\r\n updateSelected(emitChange: boolean = true) {\r\n this.record[this.field.Name] = this.arrayData.filter(data => data.Selected).map(data => data.Value);\r\n this.setFormControlValue();\r\n if (emitChange) {\r\n this.onRecordValueChange();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per creare un array di oggetti del tipo { Key: string, Value: any } da usare come sorgente dati per la eqp-select.\r\n */\r\n private setArrayData() {\r\n Object.keys(this.field.ValuePairs).forEach(k => {\r\n var isOptionSelected: boolean;\r\n if (this.field.IsMultiChoiche && this.record[this.field.Name] && this.record[this.field.Name].length > 0) {\r\n isOptionSelected = !!this.record[this.field.Name].find(v => v == this.field.ValuePairs[k]);\r\n } else {\r\n isOptionSelected = this.record[this.field.Name] === this.field.ValuePairs[k];\r\n }\r\n this.arrayData.push({ Key: k, Value: this.field.ValuePairs[k], Selected: isOptionSelected });\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore e il validator del FormControl associato al campo.\r\n */\r\n private setFormControlValue() {\r\n this.field.FormFormGroup.controls[this.field.Name].setValue(this.record[this.field.Name]);\r\n }\r\n}\r\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { AttachmentField, AvailableFileExtensions, AvailableImageExtensions } from '../../../../models/fields/attachmentField.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from '../../../../services/utilityHelper.services';\r\nimport { EqpAttachmentsComponent } from '@eqproject/eqp-attachments';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ConfigColumn, TypeColumn } from '@eqproject/eqp-table';\r\n\r\n@Component({\r\n selector: 'attachment-field-template',\r\n templateUrl: './attachment-field-template.component.html',\r\n styleUrls: ['./attachment-field-template.component.scss']\r\n})\r\nexport class AttachmentFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent, AfterViewInit {\r\n\r\n @Input() onlyImages: boolean = false;\r\n @Input() field: AttachmentField;\r\n @Input() record: Record;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n @ViewChild(\"eqpAttachments\", { static: true }) eqpAttachments: EqpAttachmentsComponent;\r\n @ViewChild('metadataColumnTemplate', { static: true }) metadataColumnTemplate: TemplateRef<any>;\r\n\r\n metadataFormGroups: Array<FormGroup> = new Array<FormGroup>();\r\n\r\n //#region Etichette per eqp-attachments\r\n previewLabel = \"Anteprima\";\r\n emptyTableMessage = \"No record found\";\r\n downloadTooltipPosition = \"below\";\r\n openLinkLabel = \"Apri link\";\r\n addButtonLabel = \"Aggiungi\";\r\n downloadLabel = \"Download\";\r\n deleteLabel = \"Elimina\";\r\n fileNameLabel = \"Nome file\";\r\n uploadFileLabel = \"Carica file\";\r\n confirmLabel = \"Conferma\";\r\n abortLabel = \"Annulla\";\r\n saveLabel = \"Salva\";\r\n exitLabel = \"Esci\";\r\n eqpTableSearchText = \"Cerca...\";\r\n deleteDialogTitle = \"Attenzione:\";\r\n deleteDialogMessage = \"Sicuro di voler eliminare questo allegato?\";\r\n noImageSelectedErrorMessage = \"Nessuna immagine selezionata!\";\r\n //#endregion\r\n\r\n constructor(\r\n public utilityService: UtilityHelperService,\r\n private cdr: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n // Nel caso in cui sono in modifica di un Record aggiorno il valore\r\n // e il validator del FormControl. Se non viene eseguita questa riga\r\n // l'utente deve modificare la selezione fatta per aggiornare la form.\r\n this.setFormControlValue();\r\n\r\n // Sempre nel caso in cui sono in modifica creo i FormGroup che rappresentano\r\n // gli eventuali metadata degli allegati recuperati.\r\n this.createMetadataFormGroups();\r\n if (this.field.MetadataFields) {\r\n this.field.MetadataFields.sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0));\r\n }\r\n\r\n if (!this.field.AllowedExtensions) {\r\n this.field.AllowedExtensions = AvailableFileExtensions.concat(AvailableImageExtensions).map(ext => ext.key);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Dopo aver renderizzato il DOM, se il campo ammette molteplici allegati\r\n // configuro le colonne della eqp-table in eqp-attachments.\r\n if (this.field.IsMultiAttach) {\r\n this.configureMultiAttachmentColumns();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per intercettare le modifiche agli allegati caricati.\r\n * Se il campo prevede dei metadata allora per ogni allegato caricato crea un FormGroup\r\n * per gestire la validazione degli input che l'utente può/deve riempire. I FormGroup \r\n * seguono lo stesso ordine degli allegati caricati.\r\n * @param event Contiene la lista aggiornata degli Attachment caricati dall'utente.\r\n */\r\n catchAttachmentList(event) {\r\n this.record[this.field.Name] = event;\r\n\r\n this.createMetadataFormGroups();\r\n\r\n this.setFormControlValue();\r\n this.onRecordValueChange();\r\n \r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare lo stato di validazione del FormControl che rappresenta \r\n * il campo Allegato (non i metadata al suo interno). Se tra le form dei metadata\r\n * ne trova una invalida allora marca il controllo come invalido.\r\n */\r\n updateMetadataValidity() {\r\n if (this.metadataFormGroups.find(form => form.invalid)) {\r\n this.field.FormFormGroup.controls[this.field.Name].setErrors({ 'incorrect': true });\r\n } else {\r\n this.field.FormFormGroup.controls[this.field.Name].setErrors(null);\r\n }\r\n this.onRecordValueChange();\r\n }\r\n\r\n /**\r\n * Metodo per recuperare il BaseField che rappresenta il metadata nella riga della eqp-table\r\n * in base alla colonna e alla riga. Una volta trovato il BaseField gli viene associato il \r\n * FormGroup di cui fa parte.\r\n * @param col Colonna della eqp-table.\r\n * @param row Riga della eqp-table (in questo caso eredita da IAttachment).\r\n * @returns Restituisce un BaseField per renderizzare il campo nella eqp-table degli allegati multipli.\r\n */\r\n getFieldFromMetadata(col: ConfigColumn, row: any) {\r\n var baseField = JSON.parse(JSON.stringify(this.field.MetadataFields.find(metadata => metadata.Name === col.key)));\r\n baseField.FormFormGroup = this.metadataFormGroups[this.record[this.field.Name].indexOf(row)];\r\n return baseField;\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore e il validator del FormControl associato al campo.\r\n */\r\n private setFormControlValue() {\r\n this.field.FormFormGroup.controls[this.field.Name].setValue(this.record[this.field.Name]);\r\n }\r\n\r\n /**\r\n * Metodo per emettere l'evento che il valore del record è cambiato.\r\n */\r\n private onRecordValueChange() {\r\n if (!this.field.Formula) {\r\n this.recordChange.emit(this.record);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiungere alle colonne di eqp-attachments le colonne per modificare i metadata\r\n * configurati per il campo Allegato o Immagine.\r\n */\r\n private configureMultiAttachmentColumns() {\r\n if (this.eqpAttachments && this.eqpAttachments.attachmentsColumns && this.field.MetadataFields && this.field.MetadataFields.length > 0) {\r\n this.field.MetadataFields.forEach(metadata => {\r\n this.eqpAttachments.attachmentsColumns.splice(\r\n this.eqpAttachments.attachmentsColumns.length - 1, 0,\r\n { key: metadata.Name, display: metadata.Label, type: TypeColumn.ExternalTemplate, externalTemplate: this.metadataColumnTemplate }\r\n );\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per creare i FormGroup che rappresentano i metadata degli allegati caricati.\r\n */\r\n private createMetadataFormGroups() {\r\n if (this.field.MetadataFields && this.field.MetadataFields.length > 0) {\r\n this.metadataFormGroups = [];\r\n if (this.record[this.field.Name] && this.record[this.field.Name].length > 0) {\r\n this.record[this.field.Name].forEach(attachment => {\r\n this.metadataFormGroups.push(this.utilityService.CreateFormFormGroup(this.field.MetadataFields, attachment, this.field.FormFormGroup.disabled, !this.field.IsMultiAttach));\r\n });\r\n }\r\n\r\n this.updateMetadataValidity();\r\n }\r\n }\r\n}","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { ImageField } from '../../../../models/fields/imageField.model';\r\nimport { AvailableImageExtensions } from '../../../../models/fields/attachmentField.model';\r\nimport { Record } from '../../../../models/record.model';\r\nimport { IBaseFieldComponent } from '../../../../interfaces/iBaseFieldComponent.interface';\r\nimport { UtilityHelperService } from 'projects/eqp-dynamic-module/src/lib/services/utilityHelper.services';\r\n\r\n@Component({\r\n selector: 'image-field-template',\r\n templateUrl: './image-field-template.component.html',\r\n styleUrls: ['./image-field-template.component.scss']\r\n})\r\nexport class ImageFieldTemplateComponent implements OnInit, OnChanges, IBaseFieldComponent {\r\n\r\n @Input() record: Record;\r\n @Input() field: ImageField;\r\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.field.AttachDefinition.FormFormGroup = this.field.FormFormGroup;\r\n\r\n if (!this.field.AttachDefinition.AllowedExtensions) {\r\n this.field.AttachDefinition.AllowedExtensions = AvailableImageExtensions.map(ext => ext.key);\r\n }\r\n\r\n this.field.AttachDefinition.Name = this.field.Name;\r\n this.field.AttachDefinition.Label = this.field.Label;\r\n this.field.AttachDefinition.Description = this.field.Description;\r\n this.field.AttachDefinition.Required = this.field.Required;\r\n this.field.AttachDefinition.Formula = this.field.Formula;\r\n this.field.AttachDefinition.FieldValue = this.field.FieldValue;\r\n }\r\n\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Se viene modificato il valore di \"ngModelInput\" allora aggiorna l'input\r\n if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {\r\n this.record = changes['record'].currentValue;\r\n this.updateField();\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.\r\n */\r\n updateField() {\r\n if (this.field.Formula) {\r\n this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);\r\n }\r\n }\r\n}","import { Component, OnInit, Input, ViewChild, Output, EventEmitter } from '@angular/core';\r\nimport { IAttachmentDTO } from '@eqproject/eqp-attachments';\r\nimport { CellAlignmentEnum, ConfigColumn, EqpTableComponent, NumberColumnPipe, TypeColumn } from '@eqproject/eqp-table';\r\nimport { AttachmentField, BaseField, BooleanField, DateField, DateTimeTypeEnum, EqpDynamicModuleDialogService, FieldTypeEnum, Form, ImageField, ListValueField, NumericField, Record, UtilityHelperService } from 'projects/eqp-dynamic-module/src/public-api';\r\n\r\n@Component({\r\n selector: 'list-form-record',\r\n templateUrl: 'list-form-record.component.html',\r\n styleUrls: ['./list-form-record.component.scss']\r\n})\r\nexport class ListFormRecordComponent implements OnInit {\r\n\r\n @Input() form: Form;\r\n @Input() values: Array<Record>;\r\n @ViewChild('tableRecords', { static: true }) tableRecords: EqpTableComponent;\r\n\r\n columns = new Array<ConfigColumn>();\r\n\r\n @Output() onAddViewEditRecord: EventEmitter<{ record: Record, onlyView: boolean }> = new EventEmitter<{ record: Record, onlyView: boolean }>();\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.configureColumns();\r\n }\r\n\r\n /**\r\n * Metodo per configurare le colonne della eqp-table.\r\n */\r\n private configureColumns() {\r\n this.columns = [\r\n {\r\n key: \"action\", display: \"\",\r\n type: TypeColumn.MenuAction, buttonMenuIcon: \"more_vert\", styles: { flex: \"0 0 6%\" },\r\n actions: [\r\n { name: \"Visualizza\", icon: \"info\", fn: (element, index, col) => this.viewOrEditRecord(element, true) },\r\n { name: \"Modifica\", icon: \"edit\", fn: (element, index, col) => this.viewOrEditRecord(element, false) },\r\n { name: \"Duplica\", icon: \"file_copy\", fn: (element, index, col) => this.duplicateRecord(element) },\r\n { name: \"Elimina\", icon: \"delete\", fn: (element, index, col) => this.deleteRecord(element) },\r\n ],\r\n },\r\n ];\r\n this.createAdditionalActions();\r\n this.createColumnsFromFormFields();\r\n }\r\n\r\n\r\n /**\r\n * Metodo per aggiungere nella colonna \"action\" della eqp-table le azioni sui record \r\n * definite dall'utente all'interno della Form.\r\n */\r\n private createAdditionalActions() {\r\n if (this.form.ActionsOnRecord && this.form.ActionsOnRecord.length > 0) {\r\n this.form.ActionsOnRecord\r\n .sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0))\r\n .forEach(action => {\r\n this.columns.find(c => c.key === 'action')\r\n .actions\r\n .push({\r\n name: action.Name, icon: action.Icon, fn: (element, index, col) => {\r\n const rec = element;\r\n const ctx = UtilityHelperService.context;\r\n eval(action.Action);\r\n // TODO: salvare le modifiche\r\n }\r\n })\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che scatena l'evento di Output per mostrare o modificare il record\r\n * selezionato sulla eqp-table.\r\n * @param record Record da visualizzare o modificare selezionato sulla eqp-table.\r\n * @param onlyView Se TRUE viene mostrato il componente add-form-record in sola lettura.\r\n */\r\n private viewOrEditRecord(record: Record, onlyView: boolean) {\r\n this.onAddViewEditRecord.emit({ record, onlyView });\r\n }\r\n\r\n /**\r\n * Metodo per duplicare un record della form.\r\n * @param record Record da duplicare.\r\n */\r\n private duplicateRecord(record: Record) {\r\n EqpDynamicModuleDialogService.Confirm('Duplicare il record selezionato?', () => {\r\n var copiedRecord: Record = JSON.parse(JSON.stringify(record));\r\n if (!isNaN(parseInt(copiedRecord.ID))) {\r\n copiedRecord.ID = (parseInt(copiedRecord.ID) + 1).toString();\r\n } else {\r\n copiedRecord.ID = \"xxxxxxxxx\".replace(\"x\", (c) => { return (Math.random() + 16 | 0).toString(16); });\r\n }\r\n this.values.push(copiedRecord);\r\n this.reloadTables();\r\n }, false, 'Richiesta conferma');\r\n //TODO\r\n }\r\n\r\n /**\r\n * Metodo per eliminare un record dalla lista.\r\n * @param record Record da eliminare selezionato sulla eqp-table.\r\n */\r\n private deleteRecord(record: Record) {\r\n EqpDynamicModuleDialogService.Confirm('Eliminare il record selezionato?', () => {\r\n this.values.splice(this.values.indexOf(record), 1);\r\n this.reloadTables();\r\n }, false, 'Richiesta conferma');\r\n // TODO\r\n }\r\n\r\n /**\r\n * Metodo per creare la configurazione delle colonne per la eqp-table.\r\n * Individua i BaseField da mostrare e li usa per creare le ConfigColumn.\r\n * Le colonne vengono create per i BaseField con il flag InListView a TRUE\r\n * oppure, nel caso non siano stati specificati i campi da visualizzare, \r\n * seleziona i primi 6.\r\n */\r\n private createColumnsFromFormFields() {\r\n var fieldsForColumns: Array<BaseField>;\r\n if (this.form.Fields.find(f => f.InListView)) {\r\n fieldsForColumns = this.form.Fields.filter(f => f.InListView);\r\n } else {\r\n fieldsForColumns = this.form.Fields.filter(f => f.OrdinalPosition < 6);\r\n }\r\n fieldsForColumns.sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0))\r\n .forEach(field => {\r\n this.columns.push(this.createFieldColumn(field));\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per creare l'oggetto ConfigureColumn che rappresenta il BaseField passato in input.\r\n * @param field BaseField per cui creare la colonna nella eqp-table\r\n * @returns Restituisce una ConfigColumn per la eqp-table\r\n */\r\n private createFieldColumn(field: BaseField): ConfigColumn {\r\n var column: ConfigColumn = { key: field.Name, display: field.Label };\r\n switch (field.FieldType) {\r\n case FieldTypeEnum['Booleano']:\r\n column.type = TypeColumn.Boolean;\r\n column.booleanValues = { false: '<i class=\"fa fa-times error-color\"></i>', true: '<i class=\"fa fa-check success-color\"></i>' };\r\n column.styles = { flex: \"0 0 7%\", cellAlignment: CellAlignmentEnum.CENTER };\r\n break;\r\n case FieldTypeEnum['Data e/o ora']:\r\n if ((field as DateField).IsOnlyDate != DateTimeTypeEnum['Solo orario']) {\r\n column.type = TypeColumn.Date;\r\n if ((field as DateField).IsOnlyDate == DateTimeTypeEnum['Data e ora']) {\r\n column.format = \"dd/MM/yyyy HH:mm\";\r\n } else if ((field as DateField).IsOnlyDate == DateTimeTypeEnum['Solo data']) {\r\n column.format = \"dd/MM/yyyy\";\r\n }\r\n }\r\n break;\r\n case FieldTypeEnum['Campo numerico']:\r\n if ((field as NumericField).CurrencySymbol) {\r\n column.numberPipe = NumberColumnPipe.CURRENCY;\r\n column.currencyPipeCode = (field as NumericField).CurrencySymbol;\r\n } else if (!(field as NumericField).IsInteger) {\r\n column.numberPipe = NumberColumnPipe.DECIMAL;\r\n }\r\n break;\r\n case FieldTypeEnum['Allegato']:\r\n case FieldTypeEnum['Immagine']:\r\n column.value = (element: Record) => {\r\n if ((field as AttachmentField).IsMultiAttach || ((field as ImageField).AttachDefinition && (field as ImageField).AttachDefinition.IsMultiAttach)) {\r\n return element[field.Name] != null && element[field.Name].length > 0 ? (element[field.Name] as Array<IAttachmentDTO>).map(a => a.FileName).join(\", \") : null;\r\n } else {\r\n return element[field.Name] != null && element[field.Name].length > 0 ? (element[field.Name] as Array<IAttachmentDTO>)[0].FileName : null;\r\n }\r\n };\r\n column.isSortable = false;\r\n column.isSearchable = false;\r\n break;\r\n case FieldTypeEnum['Elenco generico']:\r\n column.value = (element: Record) => {\r\n if ((field as ListValueField).IsMultiChoiche) {\r\n if (!element[field.Name] || element[field.Name].length == 0) {\r\n return null;\r\n } else {\r\n return Object.keys((field as ListValueField).ValuePairs).filter(k => element[field.Name].includes((field as ListValueField).ValuePairs[k])).join(\", \");\r\n }\r\n } else {\r\n return Object.keys((field as ListValueField).ValuePairs).find(k => (field as ListValueField).ValuePairs[k] == element[field.Name]);\r\n }\r\n };\r\n column.isSortable = false;\r\n column.isSearchable = false;\r\n break;\r\n case FieldTypeEnum['Lookup']:\r\n // TODO\r\n break;\r\n }\r\n return column;\r\n }\r\n\r\n /**\r\n * Metodo per ricaricare i dati della eqp-table.\r\n */\r\n private reloadTables() {\r\n if (this.tableRecords) {\r\n this.tableRecords.reloadDatatable();\r\n }\r\n }\r\n}\r\n","export class Record {\r\n ID: string;\r\n EntID: string;\r\n [key: string]: any;\r\n}\r\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { DynamicModuleFieldComponent, UtilityHelperService } from 'projects/eqp-dynamic-module/src/public-api';\r\nimport { BaseField, FieldTypeEnum } from '../../../../models/baseField.model';\r\nimport { Form, FormScalarTypeEnum } from '../../../../models/form.model';\r\nimport { Record } from '../../../../models/record.model';\r\n\r\n@Component({\r\n selector: 'add-form-record',\r\n templateUrl: './add-form-record.component.html',\r\n styleUrls: ['./add-form-record.component.scss']\r\n})\r\nexport class AddFormRecordComponent implements OnInit {\r\n\r\n @Input() showButtons = true;\r\n @Input() form: Form = new Form();\r\n @Input() record: Record;\r\n @Input() onlyView: boolean;\r\n formForm: FormGroup;\r\n fieldGroups: { [key: string]: Array<BaseField> } = {};\r\n FormScalarTypeEnum = FormScalarTypeEnum;\r\n FieldTypeEnum = FieldTypeEnum;\r\n\r\n @Output() saveRecordEvent: EventEmitter<Record> = new EventEmitter<Record>();\r\n\r\n @ViewChildren(\"fieldTemplate\") fieldTemplate: QueryList<DynamicModuleFieldComponent>;\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n public utilityService: UtilityHelperService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.record == null) {\r\n this.record = new Record();\r\n }\r\n this.createRecordProperties();\r\n this.reorderFormFields();\r\n this.createFormGroup();\r\n if (this.form.FormScalarType != FormScalarTypeEnum.Semplice) {\r\n this.createFieldGroups();\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * Metodo invocato al cambio del valore di ogni proprietà dell'oggetto record.\r\n * Serve ad aggiornare il valore di tutti i campi che hanno una formula.\r\n */\r\n onRecordChange() {\r\n if (this.fieldTemplate && this.fieldTemplate.length > 0) {\r\n this.fieldTemplate.forEach(f => f.updateField());\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per salvare i dati inseriti dall'utente una volta conclusa la compilazione della form.\r\n */\r\n saveOrExitForm(exit: boolean) {\r\n if (exit) {\r\n this.saveRecordEvent.emit(null);\r\n } else {\r\n this.saveRecordEvent.emit(this.record);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per creare nell'oggetto Record le proprietà mancanti rispetto ai campi che compongono la form.\r\n */\r\n private createRecordProperties() {\r\n const recordProperties: Array<string> = Object.keys(this.record);\r\n this.form.Fields.forEach(field => {\r\n if (!recordProperties.find(p => p === field.Name)) {\r\n this.record[field.Name] = null;\r\n }\r\n });\r\n if (this.form.InnerForms && this.form.InnerForms.length > 0) {\r\n this.form.InnerForms.forEach(form => {\r\n const arrayName: string = form.Name.split(\" \").join(\"_\");\r\n if (!recordProperties.find(p => p === arrayName)) {\r\n this.record[arrayName] = [];\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per riordinare i campi che compongono la form.\r\n */\r\n private reorderFormFields() {\r\n if (this.form.Fields && this.form.Fields.length > 0) {\r\n this.form.Fields.sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0));\r\n }\r\n }\r\n\r\n /**\r\n * Metodo per creare il FormGroup che rappresenta la form.\r\n */\r\n private createFormGroup() {\r\n this.formForm = this.utilityService.CreateFormFormGroup(this.form.Fields, this.record, this.onlyView);\r\n }\r\n\r\n /**\r\n * Metodo per creare i gruppi in cui raggruppare i campi della form in base \r\n * a come è stata configurata dall'utente.\r\n */\r\n private createFieldGroups() {\r\n this.form.FormFieldsGroups\r\n .sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0))\r\n .map(g => g.Name)\r\n .forEach(groupName => {\r\n this.fieldGroups[groupName] = this.form.Fields.filter(f => f.FieldGroup == groupName);\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { IBaseFieldComponent } from '../../../interfaces/iBaseFieldComponent.interface';\nimport { BaseField, FieldTypeEnum } from '../../../models/baseField.model';\nimport { Form } from '../../../models/form.model';\nimport { Record } from '../../../models/record.model';\nimport { ListFormRecordComponent } from '../form-records/list-form-record/list-form-record.component';\n\n@Component({\n selector: 'dynamic-module-field',\n templateUrl: './dynamic-module-field.component.html',\n styleUrls: ['./dynamic-module-field.component.scss']\n})\nexport class DynamicModuleFieldComponent implements OnInit, IBaseFieldComponent {\n\n @Input() field: BaseField;\n @Input() form: Form;\n @Input() record: Record;\n @Output() recordChange: EventEmitter<Record> = new EventEmitter<Record>();\n\n FieldTypeEnum = FieldTypeEnum;\n\n //#region Proprietà per aggiungere/modificare i record di una form di dettaglio\n selectedInnerForm: Form;\n selectedInnerFormRecord: Record;\n indexInnerFormRecord: number;\n onlyViewInnerFormRecord: boolean = false;\n dialogInnerFormRecordRef: MatDialogRef<TemplateRef<any>>;\n @ViewChild('dialogInnerFormRecord', { static: true }) dialogInnerFormRecord: TemplateRef<any>;\n //#endregion\n\n @ViewChildren(\"fieldTemplate\") fieldTemplate: QueryList<DynamicModuleFieldComponent>;\n @ViewChildren('listInnerFormRecords') listInnerFormRecords: QueryList<ListFormRecordComponent>;\n\n constructor(\n private dialog: MatDialog\n ) { }\n\n\n updateField(): void {\n if (this.fieldTemplate && this.fieldTemplate.length > 0) {\n this.fieldTemplate.forEach(f => f.updateField());\n }\n }\n\n ngOnInit(): void {\n }\n\n /**\n * Metodo invocato al cambio del valore di ogni proprietà dell'oggetto record.\n * Serve ad aggiornare il valore di tutti i campi che hanno una formula.\n */\n onRecordChange() {\n this.recordChange.emit(this.record);\n }\n\n /**\n * Metodo per recuperare una InnerForm a partire dal Field che la rappresenta.\n * @param field Campo a partire dal quale si vuole recuperare la InnerForm.\n * @returns Restituisce un oggetto di tipo Form.\n */\n getInnerFormFromField(field: BaseField): Form {\n if (this.form.InnerForms && this.form.InnerForms.find(f => f.Name == field.Label)) {\n return this.form.InnerForms.find(f => f.Name == field.Label);\n } else {\n return null;\n }\n }\n\n /**\n * Metodo per aprire un dialog in cui aggiungere/modificare/visualizzare un record appartenente\n * a una form di dettaglio.\n * @param record Evento di output del componente list-form-record, contiene il record selezionato e un booleno che indica \n * se l'utente vuole modificare o visualizzare l'elemento selezionato.\n * @param innerForm Contiene la Form di dettaglio dalla quale è stato richiesto il record.\n */\n onAddViewEditInnerFormRecord(record: { record: Record, onlyView: boolean }, field: BaseField) {\n this.selectedInnerForm = this.getInnerFormFromField(field);\n if (record == null) {\n this.selectedInnerFormRecord = new Record();\n this.indexInnerFormRecord = null;\n this.onlyViewInnerFormRecord = false;\n } else {\n this.selectedInnerFormRecord = JSON.parse(JSON.stringify(record.record));\n this.indexInnerFormRecord = this.record[field.Name].indexOf(record);\n this.onlyViewInnerFormRecord = record.onlyView;\n }\n\n this.dialogInnerFormRecordRef = this.dialog.open(this.dialogInnerFormRecord, {\n disableClose: true,\n hasBackdrop: true,\n width: '75%'\n });\n }\n\n /**\n * Metodo invocato al salvataggio o alla chiusura del dialog di aggiunta/modifica/visualizzazione\n * di un record di una form di dettaglio.\n * @param record Oggetto restituito dal componente add-form-field (questo qui) contenente il Record \n * aggiornato dall'utente. Se null allora l'utente non ha modificato nulla e ha chiuso il dialog.\n */\n onSaveInnerFormRecord(record: Record) {\n if (record != null) {\n const arrayName: string = this.selectedInnerForm.Name.split(' ').join('_');\n if (this.indexInnerFormRecord != null && this.indexInnerFormRecord >= 0) {\n this.record[arrayName][this.indexInnerFormRecord] = record;\n } else {\n if (!this.record[arrayName]) {\n this.record[arrayName] = [];\n }\n this.record[arrayName].push(record);\n }\n }\n this.dialogInnerFormRecordRef.close();\n\n // Ricarico la tabella dei record per visualizzare le modifiche fatte dall'utente.\n if (this.listInnerFormRecords && this.listInnerFormRecords.length > 0) {\n this.listInnerFormRecords.forEach(list => {\n if (list && list.tableRecords) {\n list.tableRecords.reloadDatatable();\n }\n });\n }\n }\n}\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { EqpDynamicModuleComponent } from './components/exported/eqp-dynamic-module/eqp-dynamic-module.component';\r\nimport { MaterialModule } from './modules/material.module';\r\n\r\nimport { EqpTableModule } from '@eqproject/eqp-table';\r\nimport { EqpAttachmentsModule } from '@eqproject/eqp-attachments';\r\nimport { EqpSelectModule } from '@eqproject/eqp-select';\r\nimport { EqpDatetimepickerModule } from '@eqproject/eqp-datetimepicker';\r\nimport { EqpFiltersModule } from '@eqproject/eqp-filters';\r\nimport { EqpNumericModule } from '@eqproject/eqp-numeric';\r\nimport { EqpDynamicModuleConfiguratorComponent } from './components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component';\r\nimport { AddFormFieldComponent } from './components/private/add-form-field/add-form-field.component';\r\nimport { TextFieldTemplateComponent } from './components/private/field-templates/text-field-template/text-field-template.component';\r\nimport { BooleanFieldTemplateComponent } from './components/private/field-templates/boolean-field-template/boolean-field-template.component';\r\nimport { DateFieldTemplateComponent } from './components/private/field-templates/date-field-template/date-field-template.component';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { TextareaFieldTemplateComponent } from './components/private/field-templates/textarea-field-template/textarea-field-template.component';\r\nimport { NumericFieldTemplateComponent } from './components/private/field-templates/numeric-field-template/numeric-field-template.component';\r\nimport { ListValueFieldTemplateComponent } from './components/private/field-templates/list-value-field-template/list-value-field-template.component';\r\nimport { AttachmentFieldTemplateComponent } from './components/private/field-templates/attachment-field-template/attachment-field-template.component';\r\nimport { ImageFieldTemplateComponent } from './components/private/field-templates/image-field-template/image-field-template.component';\r\nimport { ListFormRecordComponent } from './components/private/form-records/list-form-record/list-form-record.component';\r\nimport { AddFormRecordComponent } from './components/private/form-records/add-form-record/add-form-record.component';\r\nimport { DynamicModuleFieldComponent } from './components/private/dynamic-module-field/dynamic-module-field.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n EqpDynamicModuleComponent,\r\n EqpDynamicModuleConfiguratorComponent,\r\n AddFormFieldComponent,\r\n TextFieldTemplateComponent,\r\n BooleanFieldTemplateComponent,\r\n DateFieldTemplateComponent,\r\n TextareaFieldTemplateComponent,\r\n NumericFieldTemplateComponent,\r\n ListValueFieldTemplateComponent,\r\n AttachmentFieldTemplateComponent,\r\n ImageFieldTemplateComponent,\r\n ListFormRecordComponent,\r\n AddFormRecordComponent,\r\n DynamicModuleFieldComponent,\r\n ],\r\n imports: [\r\n BrowserModule,\r\n MaterialModule,\r\n FormsModule,\r\n CommonModule,\r\n ReactiveFormsModule,\r\n EqpTableModule,\r\n EqpAttachmentsModule,\r\n EqpSelectModule,\r\n EqpDatetimepickerModule,\r\n EqpFiltersModule,\r\n EqpNumericModule\r\n ],\r\n exports: [\r\n EqpDynamicModuleComponent,\r\n EqpDynamicModuleConfiguratorComponent\r\n ]\r\n})\r\nexport class EqpDynamicModuleModule { }\r\n","import { IRootObject } from \"../interfaces/iRootObject.interface\";\r\nimport { BaseField } from \"./baseField.model\";\r\nimport { BaseObj } from \"./baseObj.model\";\r\n\r\n/**\r\n * Rappresenta l'entità su cui vengono eseguite le operazioni di salvataggio.\r\n */\r\nexport class Entity extends BaseObj implements IRootObject {\r\n Name: string;\r\n Fields: Array<BaseField>;\r\n}\r\n","import { BaseField } from \"../baseField.model\";\r\nimport { AttachmentField } from \"./attachmentField.model\";\r\n\r\nexport class ImageField extends BaseField {\r\n // ??\r\n ImgName: string;\r\n\r\n /**Se true il medico può indicare più punti nell'immagine */\r\n IsMultiPoint: boolean;\r\n\r\n /**se true l'immagine non è fissa, ma viene caricata come un allegato; */\r\n ImageIsContextualAttachment: boolean;\r\n\r\n AttachDefinition: AttachmentField;\r\n}","import { BaseField } from \"../baseField.model\";\r\n\r\n/**Questo tipo di campo rappresenta una lookup ad altri valori */\r\nexport class LookupField extends BaseField {\r\n /**Entità relazionata (il padre) */\r\n EntitySourceName: string;\r\n\r\n /**Elenco di campi ordinato che verrà visualizzato nella lookup */\r\n FieldNames: string[];\r\n\r\n /**Se true la lookup viene visualizzata in una modale per lo scegli scarta */\r\n UseAsGetOrDiscard: boolean;\r\n}","import { BaseField } from \"../baseField.model\";\r\n\r\n/**Classe contiene la configurazione dei campi numerici */\r\nexport class NumericField extends BaseField {\r\n IsInteger: boolean;\r\n MinValue: number;\r\n MaxValue: number;\r\n NumberFormat: string;\r\n CurrencySymbol: string;\r\n}","import { BaseField } from \"../baseField.model\";\r\n\r\nexport class TextareaField extends BaseField {\r\n /**Numero di righe in altezza con cui viene rappresentata la text area */\r\n Rows: number;\r\n MaxLenght: number;\r\n MinLenght: number;\r\n}","import { BaseField } from \"../baseField.model\";\r\n\r\n/**Campo di testo */\r\nexport class TextField extends BaseField {\r\n TextMask: string;\r\n MaxLenght: number;\r\n MinLenght: number;\r\n}","/*\r\n * Public API Surface of eqp-dynamic-module\r\n */\r\nexport * from './lib/eqp-dynamic-module.module';\r\nexport * from './lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component';\r\nexport * from './lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component';\r\nexport * from './lib/components/private/add-form-field/add-form-field.component';\r\nexport * from './lib/components/private/dynamic-module-field/dynamic-module-field.component';\r\nexport * from './lib/components/private/field-templates/attachment-field-template/attachment-field-template.component';\r\nexport * from './lib/components/private/field-templates/boolean-field-template/boolean-field-template.component';\r\nexport * from './lib/components/private/field-templates/date-field-template/date-field-template.component';\r\nexport * from './lib/components/private/field-templates/image-field-template/image-field-template.component';\r\nexport * from './lib/components/private/field-templates/list-value-field-template/list-value-field-template.component';\r\nexport * from './lib/components/private/field-templates/numeric-field-template/numeric-field-template.component';\r\nexport * from './lib/components/private/field-templates/text-field-template/text-field-template.component';\r\nexport * from './lib/components/private/field-templates/textarea-field-template/textarea-field-template.component';\r\nexport * from './lib/components/private/form-records/add-form-record/add-form-record.component';\r\nexport * from './lib/components/private/form-records/list-form-record/list-form-record.component';\r\nexport * from './lib/interfaces/iBaseFieldComponent.interface';\r\nexport * from './lib/interfaces/iRootObject.interface';\r\nexport * from './lib/models/baseField.model';\r\nexport * from './lib/models/baseObj.model';\r\nexport * from './lib/models/context.model';\r\nexport * from './lib/models/entity.model';\r\nexport * from './lib/models/form.model';\r\nexport * from './lib/models/record.model';\r\nexport * from './lib/models/fields/attachmentField.model';\r\nexport * from './lib/models/fields/booleanField.model';\r\nexport * from './lib/models/fields/dateField.model';\r\nexport * from './lib/models/fields/imageField.model';\r\nexport * from './lib/models/fields/listValueField.model';\r\nexport * from './lib/models/fields/lookupField.model';\r\nexport * from './lib/models/fields/numericField.model';\r\nexport * from './lib/models/fields/testareaField.model';\r\nexport * from './lib/models/fields/textField.model';\r\nexport * from './lib/services/custom-form-validators.service';\r\nexport * from './lib/services/eqp-dynamic-module-dialog.service';\r\nexport * from './lib/services/utilityHelper.services';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {MaterialModule as ɵa} from './lib/modules/material.module';"],"names":["UtilityHelperService","EqpDynamicModuleDialogService","FieldTypeEnum","DateTimeTypeEnum"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { Context } from '../../../models/context.model';
3
+ import { Form, FormTypeEnum } from '../../../models/form.model';
4
+ import { Record } from '../../../models/record.model';
5
+ export declare class EqpDynamicModuleComponent implements OnInit {
6
+ context: Context;
7
+ form: Form;
8
+ values: Array<Record>;
9
+ showButtons: boolean;
10
+ viewMode: FormTypeEnum;
11
+ FormTypeEnum: typeof FormTypeEnum;
12
+ selectedRecord: Record;
13
+ onlyView: boolean;
14
+ constructor();
15
+ ngOnInit(): void;
16
+ onAddViewEditRecord(event: {
17
+ record: Record;
18
+ onlyView: boolean;
19
+ }): void;
20
+ onSaveForm(event: Record): void;
21
+ }