@piserve-tech/form-submission 1.3.314 → 1.3.316

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 (443) hide show
  1. package/README.md +24 -24
  2. package/ng-package.json +30 -0
  3. package/package.json +33 -46
  4. package/{assets → src/assets}/icons/close-sidebar-mark-icon.svg +3 -3
  5. package/{assets → src/assets}/icons/copy-icon.svg +5 -5
  6. package/{assets → src/assets}/icons/delete-icon.svg +7 -7
  7. package/{assets → src/assets}/icons/delete-no-outline-icon.svg +7 -7
  8. package/src/environment/environment.ts +6 -0
  9. package/src/form-fields/aggregate-function/aggregate-function.component.html +63 -0
  10. package/src/form-fields/aggregate-function/aggregate-function.component.scss +1 -0
  11. package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +21 -0
  12. package/src/form-fields/aggregate-function/aggregate-function.component.ts +148 -0
  13. package/src/form-fields/check-box-fields/check-box-fields.component.html +81 -0
  14. package/src/form-fields/check-box-fields/check-box-fields.component.scss +28 -0
  15. package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +21 -0
  16. package/src/form-fields/check-box-fields/check-box-fields.component.ts +538 -0
  17. package/src/form-fields/currency-fields/currency-fields.component.html +85 -0
  18. package/src/form-fields/currency-fields/currency-fields.component.scss +48 -0
  19. package/src/form-fields/currency-fields/currency-fields.component.spec.ts +21 -0
  20. package/src/form-fields/currency-fields/currency-fields.component.ts +589 -0
  21. package/src/form-fields/date-time-fields/date-time-fields.component.html +268 -0
  22. package/src/form-fields/date-time-fields/date-time-fields.component.scss +88 -0
  23. package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +21 -0
  24. package/src/form-fields/date-time-fields/date-time-fields.component.ts +693 -0
  25. package/src/form-fields/drop-down-fields/drop-down-fields.component.html +77 -0
  26. package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +12 -0
  27. package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +21 -0
  28. package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +698 -0
  29. package/src/form-fields/file-picker-fields/file-picker-fields.component.html +72 -0
  30. package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +33 -0
  31. package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +21 -0
  32. package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +256 -0
  33. package/src/form-fields/form-fields.module.ts +110 -0
  34. package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
  35. package/src/form-fields/hidden-field/hidden-field.component.spec.ts +21 -0
  36. package/src/form-fields/hidden-field/hidden-field.component.ts +156 -0
  37. package/src/form-fields/iframe-fields/iframe-fields.component.html +31 -0
  38. package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
  39. package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +21 -0
  40. package/src/form-fields/iframe-fields/iframe-fields.component.ts +225 -0
  41. package/src/form-fields/location-fields/location-fields.component.html +54 -0
  42. package/src/form-fields/location-fields/location-fields.component.scss +22 -0
  43. package/src/form-fields/location-fields/location-fields.component.spec.ts +21 -0
  44. package/src/form-fields/location-fields/location-fields.component.ts +83 -0
  45. package/src/form-fields/mail-fields/mail-fields.component.html +66 -0
  46. package/src/form-fields/mail-fields/mail-fields.component.scss +10 -0
  47. package/src/form-fields/mail-fields/mail-fields.component.spec.ts +21 -0
  48. package/src/form-fields/mail-fields/mail-fields.component.ts +127 -0
  49. package/src/form-fields/mobile-fields/mobile-fields.component.html +97 -0
  50. package/src/form-fields/mobile-fields/mobile-fields.component.scss +52 -0
  51. package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +21 -0
  52. package/src/form-fields/mobile-fields/mobile-fields.component.ts +310 -0
  53. package/src/form-fields/number-fields/number-fields.component.html +70 -0
  54. package/src/form-fields/number-fields/number-fields.component.scss +17 -0
  55. package/src/form-fields/number-fields/number-fields.component.spec.ts +21 -0
  56. package/src/form-fields/number-fields/number-fields.component.ts +256 -0
  57. package/src/form-fields/password-fields/password-fields.component.html +113 -0
  58. package/src/form-fields/password-fields/password-fields.component.scss +61 -0
  59. package/src/form-fields/password-fields/password-fields.component.spec.ts +21 -0
  60. package/src/form-fields/password-fields/password-fields.component.ts +273 -0
  61. package/src/form-fields/radio-button-fields/radio-button-fields.component.html +82 -0
  62. package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +28 -0
  63. package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +21 -0
  64. package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +391 -0
  65. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +67 -0
  66. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +23 -0
  67. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +21 -0
  68. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +145 -0
  69. package/src/form-fields/section-fields/section-fields.component.html +4 -0
  70. package/src/form-fields/section-fields/section-fields.component.scss +37 -0
  71. package/src/form-fields/section-fields/section-fields.component.spec.ts +21 -0
  72. package/src/form-fields/section-fields/section-fields.component.ts +25 -0
  73. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +93 -0
  74. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +52 -0
  75. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +21 -0
  76. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +155 -0
  77. package/src/form-fields/signature-fields/signature-fields.component.html +43 -0
  78. package/src/form-fields/signature-fields/signature-fields.component.scss +10 -0
  79. package/src/form-fields/signature-fields/signature-fields.component.spec.ts +21 -0
  80. package/src/form-fields/signature-fields/signature-fields.component.ts +25 -0
  81. package/src/form-fields/slider-fields/slider-fields.component.html +67 -0
  82. package/src/form-fields/slider-fields/slider-fields.component.scss +55 -0
  83. package/src/form-fields/slider-fields/slider-fields.component.spec.ts +21 -0
  84. package/src/form-fields/slider-fields/slider-fields.component.ts +63 -0
  85. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +52 -0
  86. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +85 -0
  87. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +21 -0
  88. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +62 -0
  89. package/src/form-fields/text-area-fields/text-area-fields.component.html +68 -0
  90. package/src/form-fields/text-area-fields/text-area-fields.component.scss +19 -0
  91. package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +21 -0
  92. package/src/form-fields/text-area-fields/text-area-fields.component.ts +166 -0
  93. package/src/form-fields/text-fields/text-fields.component.html +67 -0
  94. package/src/form-fields/text-fields/text-fields.component.scss +26 -0
  95. package/src/form-fields/text-fields/text-fields.component.spec.ts +21 -0
  96. package/src/form-fields/text-fields/text-fields.component.ts +248 -0
  97. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +70 -0
  98. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +112 -0
  99. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +21 -0
  100. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +74 -0
  101. package/src/form-fields/url-fields/url-fields.component.html +109 -0
  102. package/src/form-fields/url-fields/url-fields.component.scss +22 -0
  103. package/src/form-fields/url-fields/url-fields.component.spec.ts +21 -0
  104. package/src/form-fields/url-fields/url-fields.component.ts +123 -0
  105. package/src/form-submission/form-submission.module.ts +40 -0
  106. package/src/form-submission/header/header.component.html +6 -0
  107. package/src/form-submission/header/header.component.scss +26 -0
  108. package/src/form-submission/header/header.component.spec.ts +21 -0
  109. package/src/form-submission/header/header.component.ts +12 -0
  110. package/src/form-submission/navigation-tabs/navigation-tabs.component.html +134 -0
  111. package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +200 -0
  112. package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +21 -0
  113. package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +134 -0
  114. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +207 -0
  115. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +208 -0
  116. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +21 -0
  117. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +74 -0
  118. package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +60 -0
  119. package/src/form-submission/save-as-draft/saveDraftModalComponent.html +33 -0
  120. package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +195 -0
  121. package/src/form-submission/submission-container/submission-container.component.html +30 -0
  122. package/src/form-submission/submission-container/submission-container.component.scss +67 -0
  123. package/src/form-submission/submission-container/submission-container.component.spec.ts +21 -0
  124. package/src/form-submission/submission-container/submission-container.component.ts +14 -0
  125. package/src/form-submission/submit-form/submit-form.component.html +76 -0
  126. package/src/form-submission/submit-form/submit-form.component.scss +88 -0
  127. package/src/form-submission/submit-form/submit-form.component.spec.ts +21 -0
  128. package/src/form-submission/submit-form/submit-form.component.ts +1953 -0
  129. package/src/lib/form-submission.component.html +15 -0
  130. package/src/lib/form-submission.component.scss +1 -0
  131. package/src/lib/form-submission.component.ts +120 -0
  132. package/src/lib/form-submission.module.ts +31 -0
  133. package/src/lib/form-submission.service.spec.ts +16 -0
  134. package/src/lib/form-submission.service.ts +9 -0
  135. package/src/models/aggregate.model.ts +4 -0
  136. package/{models/answer.model.d.ts → src/models/answer.model.ts} +25 -23
  137. package/src/models/appearance.model.ts +64 -0
  138. package/{models/attachment.model.d.ts → src/models/attachment.model.ts} +6 -6
  139. package/{models/defaultAnswerEntry.model.d.ts → src/models/defaultAnswerEntry.model.ts} +7 -5
  140. package/{models/defaultAnswersModel.model.d.ts → src/models/defaultAnswersModel.model.ts} +5 -4
  141. package/{models/defaultQuestionAnswer.model.d.ts → src/models/defaultQuestionAnswer.model.ts} +6 -6
  142. package/src/models/elementOptionAPI.model.ts +13 -0
  143. package/src/models/elementOptionAPIData.model.ts +5 -0
  144. package/src/models/elementOptionDB.model.ts +9 -0
  145. package/src/models/elementOptionDBCriteria.model.ts +7 -0
  146. package/{models/emitters.model.d.ts → src/models/emitters.model.ts} +8 -8
  147. package/{models/enum/condition.enum.d.ts → src/models/enum/condition.enum.ts} +2 -2
  148. package/src/models/enum/elementType .enum.ts +22 -0
  149. package/src/models/enum/entityType.enum.ts +10 -0
  150. package/{models/formConfiguration.model.d.ts → src/models/formConfiguration.model.ts} +2 -2
  151. package/{models/formElement.model.d.ts → src/models/formElement.model.ts} +22 -22
  152. package/{models/formElementType.model.d.ts → src/models/formElementType.model.ts} +3 -2
  153. package/{models/grid.model.d.ts → src/models/grid.model.ts} +14 -13
  154. package/{models/hiddenField.model.d.ts → src/models/hiddenField.model.ts} +5 -5
  155. package/{models/iFrameProperties.model.d.ts → src/models/iFrameProperties.model.ts} +13 -13
  156. package/src/models/logic.model.ts +11 -0
  157. package/src/models/multifields.model.ts +12 -0
  158. package/{models/option.model.d.ts → src/models/option.model.ts} +5 -5
  159. package/src/models/page.model.ts +7 -0
  160. package/src/models/publicForm.model.ts +19 -0
  161. package/src/models/question.model.ts +27 -0
  162. package/src/models/questionAnswer.model.ts +8 -0
  163. package/src/models/questionGroup.model.ts +12 -0
  164. package/src/models/response.model.ts +9 -0
  165. package/src/models/result.model.ts +5 -0
  166. package/{models/row.model.d.ts → src/models/row.model.ts} +2 -1
  167. package/src/models/scoring.model.ts +10 -0
  168. package/src/models/section.model.ts +6 -0
  169. package/src/models/subForm.model.ts +25 -0
  170. package/src/models/subformConfiguration.model.ts +4 -0
  171. package/src/models/subformPropery.model.ts +8 -0
  172. package/{models/submission.model.d.ts → src/models/submission.model.ts} +16 -14
  173. package/{models/submissionCopyConfig.mopdel.d.ts → src/models/submissionCopyConfig.mopdel.ts} +4 -4
  174. package/{models/terms&condition.model.d.ts → src/models/terms&condition.model.ts} +1 -1
  175. package/src/models/validation.model.ts +48 -0
  176. package/src/models/whenClause.model.ts +7 -0
  177. package/{models/whenClauseCondition.model.d.ts → src/models/whenClauseCondition.model.ts} +6 -6
  178. package/{models/whenClauseElements.model.d.ts → src/models/whenClauseElements.model.ts} +6 -5
  179. package/{public-api.d.ts → src/public-api.ts} +4 -0
  180. package/src/question/card-subform/card-subform.component.html +282 -0
  181. package/src/question/card-subform/card-subform.component.scss +49 -0
  182. package/src/question/card-subform/card-subform.component.spec.ts +21 -0
  183. package/src/question/card-subform/card-subform.component.ts +407 -0
  184. package/src/question/confirm-dialog/confirm-dialog.component.html +32 -0
  185. package/src/question/confirm-dialog/confirm-dialog.component.scss +109 -0
  186. package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +21 -0
  187. package/src/question/confirm-dialog/confirm-dialog.component.ts +24 -0
  188. package/src/question/form-elements/form-elements.component.html +28 -0
  189. package/src/question/form-elements/form-elements.component.scss +0 -0
  190. package/src/question/form-elements/form-elements.component.spec.ts +21 -0
  191. package/src/question/form-elements/form-elements.component.ts +41 -0
  192. package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +321 -0
  193. package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +78 -0
  194. package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +21 -0
  195. package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +425 -0
  196. package/src/question/multifields/multifields.component.html +78 -0
  197. package/src/question/multifields/multifields.component.scss +6 -0
  198. package/src/question/multifields/multifields.component.spec.ts +21 -0
  199. package/src/question/multifields/multifields.component.ts +27 -0
  200. package/src/question/multiple-subform/multiple-subform.component.html +185 -0
  201. package/src/question/multiple-subform/multiple-subform.component.scss +52 -0
  202. package/src/question/multiple-subform/multiple-subform.component.spec.ts +21 -0
  203. package/src/question/multiple-subform/multiple-subform.component.ts +481 -0
  204. package/src/question/question/question.component.html +51 -0
  205. package/src/question/question/question.component.scss +0 -0
  206. package/src/question/question/question.component.spec.ts +21 -0
  207. package/src/question/question/question.component.ts +129 -0
  208. package/src/question/question-group/question-group.component.html +147 -0
  209. package/src/question/question-group/question-group.component.scss +36 -0
  210. package/src/question/question-group/question-group.component.spec.ts +21 -0
  211. package/src/question/question-group/question-group.component.ts +94 -0
  212. package/src/question/question.module.ts +22 -0
  213. package/src/question/recursive-logic/recursive-logic.component.html +33 -0
  214. package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
  215. package/src/question/recursive-logic/recursive-logic.component.spec.ts +21 -0
  216. package/src/question/recursive-logic/recursive-logic.component.ts +29 -0
  217. package/src/question/sub-form/sub-form.component.html +254 -0
  218. package/src/question/sub-form/sub-form.component.scss +83 -0
  219. package/src/question/sub-form/sub-form.component.spec.ts +21 -0
  220. package/src/question/sub-form/sub-form.component.ts +421 -0
  221. package/src/services/aggregate.service.ts +148 -0
  222. package/src/services/countryService.ts +92 -0
  223. package/src/services/data.service.ts +36 -0
  224. package/src/services/element-tracker.service.spec.ts +16 -0
  225. package/src/services/element-tracker.service.ts +24 -0
  226. package/src/services/form-validation.service.ts +151 -0
  227. package/src/services/form.service.spec.ts +16 -0
  228. package/src/services/form.service.ts +407 -0
  229. package/src/services/mapper.service.ts +625 -0
  230. package/src/services/recaptcha.service.spec.ts +16 -0
  231. package/src/services/recaptcha.service.ts +179 -0
  232. package/src/services/score.service.ts +352 -0
  233. package/src/services/subform-copy.service.ts +148 -0
  234. package/src/services/validation.service.spec.ts +16 -0
  235. package/src/services/validation.service.ts +33 -0
  236. package/src/services/whenClause.service.ts +502 -0
  237. package/src/shared/shared.module.ts +58 -0
  238. package/src/styles/shared-style.scss +86 -0
  239. package/src/sub-form/sub-form.module.ts +24 -0
  240. package/src/sub-form/submission-modal/submission-modal.component.html +160 -0
  241. package/src/sub-form/submission-modal/submission-modal.component.scss +54 -0
  242. package/src/sub-form/submission-modal/submission-modal.component.spec.ts +21 -0
  243. package/src/sub-form/submission-modal/submission-modal.component.ts +127 -0
  244. package/tsconfig.lib.json +14 -0
  245. package/tsconfig.lib.prod.json +10 -0
  246. package/tsconfig.spec.json +14 -0
  247. package/environment/environment.d.ts +0 -5
  248. package/esm2022/environment/environment.mjs +0 -6
  249. package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +0 -146
  250. package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +0 -473
  251. package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +0 -502
  252. package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +0 -608
  253. package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +0 -585
  254. package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +0 -224
  255. package/esm2022/form-fields/form-fields.module.mjs +0 -174
  256. package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +0 -137
  257. package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +0 -198
  258. package/esm2022/form-fields/location-fields/location-fields.component.mjs +0 -85
  259. package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +0 -131
  260. package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +0 -270
  261. package/esm2022/form-fields/number-fields/number-fields.component.mjs +0 -242
  262. package/esm2022/form-fields/password-fields/password-fields.component.mjs +0 -257
  263. package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +0 -346
  264. package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +0 -148
  265. package/esm2022/form-fields/section-fields/section-fields.component.mjs +0 -29
  266. package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +0 -158
  267. package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +0 -32
  268. package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +0 -73
  269. package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +0 -66
  270. package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +0 -159
  271. package/esm2022/form-fields/text-fields/text-fields.component.mjs +0 -245
  272. package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +0 -85
  273. package/esm2022/form-fields/url-fields/url-fields.component.mjs +0 -124
  274. package/esm2022/form-submission/form-submission.module.mjs +0 -64
  275. package/esm2022/form-submission/header/header.component.mjs +0 -20
  276. package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +0 -171
  277. package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +0 -124
  278. package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +0 -50
  279. package/esm2022/form-submission/submission-container/submission-container.component.mjs +0 -17
  280. package/esm2022/form-submission/submit-form/submit-form.component.mjs +0 -1610
  281. package/esm2022/lib/form-submission.component.mjs +0 -113
  282. package/esm2022/lib/form-submission.module.mjs +0 -56
  283. package/esm2022/lib/form-submission.service.mjs +0 -14
  284. package/esm2022/models/aggregate.model.mjs +0 -2
  285. package/esm2022/models/answer.model.mjs +0 -2
  286. package/esm2022/models/appearance.model.mjs +0 -2
  287. package/esm2022/models/attachment.model.mjs +0 -2
  288. package/esm2022/models/defaultAnswerEntry.model.mjs +0 -2
  289. package/esm2022/models/defaultAnswersModel.model.mjs +0 -2
  290. package/esm2022/models/defaultQuestionAnswer.model.mjs +0 -2
  291. package/esm2022/models/elementOptionAPI.model.mjs +0 -2
  292. package/esm2022/models/elementOptionAPIData.model.mjs +0 -2
  293. package/esm2022/models/elementOptionDB.model.mjs +0 -2
  294. package/esm2022/models/elementOptionDBCriteria.model.mjs +0 -2
  295. package/esm2022/models/emitters.model.mjs +0 -2
  296. package/esm2022/models/enum/condition.enum.mjs +0 -18
  297. package/esm2022/models/enum/elementType .enum.mjs +0 -24
  298. package/esm2022/models/enum/entityType.enum.mjs +0 -12
  299. package/esm2022/models/formConfiguration.model.mjs +0 -2
  300. package/esm2022/models/formElement.model.mjs +0 -2
  301. package/esm2022/models/formElementType.model.mjs +0 -2
  302. package/esm2022/models/grid.model.mjs +0 -2
  303. package/esm2022/models/hiddenField.model.mjs +0 -2
  304. package/esm2022/models/iFrameProperties.model.mjs +0 -2
  305. package/esm2022/models/logic.model.mjs +0 -2
  306. package/esm2022/models/multifields.model.mjs +0 -2
  307. package/esm2022/models/option.model.mjs +0 -2
  308. package/esm2022/models/page.model.mjs +0 -2
  309. package/esm2022/models/publicForm.model.mjs +0 -2
  310. package/esm2022/models/question.model.mjs +0 -2
  311. package/esm2022/models/questionAnswer.model.mjs +0 -2
  312. package/esm2022/models/questionGroup.model.mjs +0 -2
  313. package/esm2022/models/row.model.mjs +0 -2
  314. package/esm2022/models/scoring.model.mjs +0 -2
  315. package/esm2022/models/section.model.mjs +0 -2
  316. package/esm2022/models/subForm.model.mjs +0 -2
  317. package/esm2022/models/subformConfiguration.model.mjs +0 -2
  318. package/esm2022/models/subformPropery.model.mjs +0 -2
  319. package/esm2022/models/submission.model.mjs +0 -2
  320. package/esm2022/models/submissionCopyConfig.mopdel.mjs +0 -2
  321. package/esm2022/models/terms&condition.model.mjs +0 -2
  322. package/esm2022/models/validation.model.mjs +0 -2
  323. package/esm2022/models/whenClause.model.mjs +0 -2
  324. package/esm2022/models/whenClauseCondition.model.mjs +0 -2
  325. package/esm2022/models/whenClauseElements.model.mjs +0 -2
  326. package/esm2022/piserve-tech-form-submission.mjs +0 -5
  327. package/esm2022/public-api.mjs +0 -7
  328. package/esm2022/question/card-subform/card-subform.component.mjs +0 -354
  329. package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +0 -27
  330. package/esm2022/question/form-elements/form-elements.component.mjs +0 -62
  331. package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +0 -384
  332. package/esm2022/question/multifields/multifields.component.mjs +0 -54
  333. package/esm2022/question/multiple-subform/multiple-subform.component.mjs +0 -413
  334. package/esm2022/question/question/question.component.mjs +0 -145
  335. package/esm2022/question/question-group/question-group.component.mjs +0 -102
  336. package/esm2022/question/recursive-logic/recursive-logic.component.mjs +0 -49
  337. package/esm2022/question/sub-form/sub-form.component.mjs +0 -351
  338. package/esm2022/services/aggregate.service.mjs +0 -139
  339. package/esm2022/services/countryService.mjs +0 -89
  340. package/esm2022/services/data.service.mjs +0 -36
  341. package/esm2022/services/element-tracker.service.mjs +0 -27
  342. package/esm2022/services/form-validation.service.mjs +0 -128
  343. package/esm2022/services/form.service.mjs +0 -333
  344. package/esm2022/services/mapper.service.mjs +0 -519
  345. package/esm2022/services/recaptcha.service.mjs +0 -136
  346. package/esm2022/services/score.service.mjs +0 -268
  347. package/esm2022/services/subform-copy.service.mjs +0 -122
  348. package/esm2022/services/validation.service.mjs +0 -35
  349. package/esm2022/services/whenClause.service.mjs +0 -423
  350. package/esm2022/shared/shared.module.mjs +0 -97
  351. package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +0 -133
  352. package/fesm2022/piserve-tech-form-submission.mjs +0 -11658
  353. package/fesm2022/piserve-tech-form-submission.mjs.map +0 -1
  354. package/form-fields/aggregate-function/aggregate-function.component.d.ts +0 -43
  355. package/form-fields/check-box-fields/check-box-fields.component.d.ts +0 -73
  356. package/form-fields/currency-fields/currency-fields.component.d.ts +0 -62
  357. package/form-fields/date-time-fields/date-time-fields.component.d.ts +0 -96
  358. package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +0 -88
  359. package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +0 -72
  360. package/form-fields/form-fields.module.d.ts +0 -40
  361. package/form-fields/hidden-field/hidden-field.component.d.ts +0 -38
  362. package/form-fields/iframe-fields/iframe-fields.component.d.ts +0 -35
  363. package/form-fields/location-fields/location-fields.component.d.ts +0 -29
  364. package/form-fields/mail-fields/mail-fields.component.d.ts +0 -41
  365. package/form-fields/mobile-fields/mobile-fields.component.d.ts +0 -71
  366. package/form-fields/number-fields/number-fields.component.d.ts +0 -53
  367. package/form-fields/password-fields/password-fields.component.d.ts +0 -57
  368. package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +0 -70
  369. package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +0 -46
  370. package/form-fields/section-fields/section-fields.component.d.ts +0 -10
  371. package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +0 -45
  372. package/form-fields/signature-fields/signature-fields.component.d.ts +0 -13
  373. package/form-fields/slider-fields/slider-fields.component.d.ts +0 -32
  374. package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +0 -26
  375. package/form-fields/text-area-fields/text-area-fields.component.d.ts +0 -49
  376. package/form-fields/text-fields/text-fields.component.d.ts +0 -49
  377. package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +0 -29
  378. package/form-fields/url-fields/url-fields.component.d.ts +0 -41
  379. package/form-submission/form-submission.module.d.ts +0 -20
  380. package/form-submission/header/header.component.d.ts +0 -7
  381. package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +0 -57
  382. package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +0 -46
  383. package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +0 -17
  384. package/form-submission/submission-container/submission-container.component.d.ts +0 -7
  385. package/form-submission/submit-form/submit-form.component.d.ts +0 -237
  386. package/index.d.ts +0 -5
  387. package/lib/form-submission.component.d.ts +0 -30
  388. package/lib/form-submission.module.d.ts +0 -16
  389. package/lib/form-submission.service.d.ts +0 -6
  390. package/models/aggregate.model.d.ts +0 -4
  391. package/models/appearance.model.d.ts +0 -64
  392. package/models/elementOptionAPI.model.d.ts +0 -12
  393. package/models/elementOptionAPIData.model.d.ts +0 -5
  394. package/models/elementOptionDB.model.d.ts +0 -8
  395. package/models/elementOptionDBCriteria.model.d.ts +0 -7
  396. package/models/enum/elementType .enum.d.ts +0 -22
  397. package/models/enum/entityType.enum.d.ts +0 -10
  398. package/models/logic.model.d.ts +0 -9
  399. package/models/multifields.model.d.ts +0 -11
  400. package/models/page.model.d.ts +0 -6
  401. package/models/publicForm.model.d.ts +0 -18
  402. package/models/question.model.d.ts +0 -26
  403. package/models/questionAnswer.model.d.ts +0 -7
  404. package/models/questionGroup.model.d.ts +0 -11
  405. package/models/scoring.model.d.ts +0 -10
  406. package/models/section.model.d.ts +0 -6
  407. package/models/subForm.model.d.ts +0 -24
  408. package/models/subformConfiguration.model.d.ts +0 -4
  409. package/models/subformPropery.model.d.ts +0 -7
  410. package/models/validation.model.d.ts +0 -48
  411. package/models/whenClause.model.d.ts +0 -6
  412. package/question/card-subform/card-subform.component.d.ts +0 -44
  413. package/question/confirm-dialog/confirm-dialog.component.d.ts +0 -12
  414. package/question/form-elements/form-elements.component.d.ts +0 -20
  415. package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +0 -47
  416. package/question/multifields/multifields.component.d.ts +0 -11
  417. package/question/multiple-subform/multiple-subform.component.d.ts +0 -39
  418. package/question/question/question.component.d.ts +0 -30
  419. package/question/question-group/question-group.component.d.ts +0 -29
  420. package/question/recursive-logic/recursive-logic.component.d.ts +0 -19
  421. package/question/sub-form/sub-form.component.d.ts +0 -70
  422. package/services/aggregate.service.d.ts +0 -29
  423. package/services/countryService.d.ts +0 -21
  424. package/services/data.service.d.ts +0 -19
  425. package/services/element-tracker.service.d.ts +0 -10
  426. package/services/form-validation.service.d.ts +0 -16
  427. package/services/form.service.d.ts +0 -27
  428. package/services/mapper.service.d.ts +0 -31
  429. package/services/recaptcha.service.d.ts +0 -46
  430. package/services/score.service.d.ts +0 -27
  431. package/services/subform-copy.service.d.ts +0 -10
  432. package/services/validation.service.d.ts +0 -14
  433. package/services/whenClause.service.d.ts +0 -45
  434. package/shared/shared.module.d.ts +0 -25
  435. package/sub-form/submission-modal/submission-modal.component.d.ts +0 -31
  436. /package/{assets → src/assets}/fonts/Garamond.woff2 +0 -0
  437. /package/{assets → src/assets}/fonts/Georgia.woff2 +0 -0
  438. /package/{assets → src/assets}/fonts/Poppins.woff2 +0 -0
  439. /package/{assets → src/assets}/fonts/Tahoma.woff2 +0 -0
  440. /package/{assets → src/assets}/fonts/Tajawal.woff2 +0 -0
  441. /package/{assets → src/assets}/fonts/Verdana.woff2 +0 -0
  442. /package/{assets → src/assets}/icons/left_arrow.svg +0 -0
  443. /package/{assets → src/assets}/icons/right_arrow.svg +0 -0
@@ -0,0 +1,481 @@
1
+ import { SubformProperty } from './../../models/subformPropery.model';
2
+ import { add } from 'ngx-bootstrap/chronos';
3
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
4
+ import { MatDialog, MatDialogConfig } from '@angular/material/dialog';
5
+ import { SubmissionModalComponent } from '../../sub-form/submission-modal/submission-modal.component';
6
+ import { Attachment } from '../../models/attachment.model';
7
+ import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
8
+ import { ScoreCalculationService } from '../../services/score.service';
9
+ import { Submission } from '../../models/submission.model';
10
+ import { Answer } from '../../models/answer.model';
11
+ import { WhenClauseService } from '../../services/whenClause.service';
12
+
13
+
14
+ @Component({
15
+ selector: 'lib-multiple-subform',
16
+ templateUrl: './multiple-subform.component.html',
17
+ styleUrls: ['./multiple-subform.component.scss'],
18
+ })
19
+ export class MultipleSubformComponent {
20
+ @Input() subForm: any = {};
21
+ @Output() subFormChange = new EventEmitter<any>();
22
+ @Input() acceptedLanguage: string = '';
23
+
24
+ submissions: Submission[] = [];
25
+ deletedSubmissions: string[] = [];
26
+ displayedColumns: string[] = [];
27
+ addButtonLabel: string = 'Add New Submission';
28
+ maxPossibleGoodScore!:number;
29
+ maxPossibleBadScore!:number
30
+
31
+ constructor(
32
+ public dialog: MatDialog,
33
+ private sanitizer: DomSanitizer,
34
+ private scoreCalcService: ScoreCalculationService,
35
+ private whenClauseService:WhenClauseService
36
+ ) {}
37
+
38
+ ngOnInit() {
39
+ const { goodMax, badMax } = this.scoreCalcService.getMaxPossibleScore(this.subForm);
40
+ this.maxPossibleGoodScore = goodMax;
41
+ this.maxPossibleBadScore = badMax;
42
+ if (this.subForm?.submissions) {
43
+ this.submissions = this.subForm.submissions;
44
+ this.subForm.deletedSubmissions = [];
45
+ }
46
+ if(this.subForm?.property?.addButtonLabel) {
47
+ this.addButtonLabel = this.subForm.property.addButtonLabel;
48
+ }
49
+ this.initializeDisplayedColumns();
50
+ this.whenClauseService.addGridsFromSubform(this.subForm);
51
+ }
52
+
53
+ initializeDisplayedColumns() {
54
+ this.displayedColumns = this.subForm.rows.flatMap((item: any) =>
55
+ item.grid
56
+ .filter((gridItem: any) => gridItem.element?.formElement?.elementType !== 'HIDDEN_FIELD')
57
+ .map((gridItem: any) => gridItem.element.question)
58
+ );
59
+
60
+ this.displayedColumns.push('actions');
61
+ }
62
+
63
+ getAnswerByQuestionId(submission: Submission, question: any) {
64
+ const questionId = question.element.id;
65
+ const answerObj = submission.answers.find(
66
+ (answer) => answer.questionId === questionId
67
+ );
68
+
69
+ if (!answerObj) {
70
+ return null;
71
+ }
72
+
73
+ let content: string = '';
74
+
75
+ if (answerObj.answer) {
76
+ if (Array.isArray(answerObj.answer)) {
77
+ const processedItems = answerObj.answer.map((item: any) => {
78
+ if (typeof item === 'string' && item.includes('|')) {
79
+ return item.split('|')[0];
80
+ }
81
+ return item;
82
+ });
83
+ content = processedItems.join(', ');
84
+ } else if (typeof answerObj.answer === 'string') {
85
+ content = answerObj.answer.includes('|')
86
+ ? answerObj.answer.split('|')[0]
87
+ : answerObj.answer;
88
+ }
89
+ }
90
+ let currencySymbol = '';
91
+ if(question.element.formElement.elementType === 'CURRENCY'){
92
+ currencySymbol = this.fetchCurrencySymbol(question.element);
93
+ answerObj['htmlContent'] = this.sanitizer.bypassSecurityTrustHtml(currencySymbol + ' ' +content);
94
+ } else{
95
+ answerObj['htmlContent'] = this.sanitizer.bypassSecurityTrustHtml(content);
96
+ }
97
+ return answerObj;
98
+ }
99
+
100
+ fetchCurrencySymbol(question:any){
101
+ let currencySymbol = '';
102
+ if (question.formElement?.appearance?.currency) {
103
+ let userLocaleCureency = question.formElement?.appearance?.currency;
104
+ if (question.formElement.appearance.currencyOption) {
105
+ let currencyOption =
106
+ question.formElement.appearance.currencyOption;
107
+ if (currencyOption == 'auto') {
108
+ if (
109
+ question.formElement.appearance.limitCurrencySymbol &&
110
+ question.formElement.appearance.limitCurrencySymbol.length > 0
111
+ ) {
112
+ currencySymbol =
113
+ question.formElement.appearance.limitCurrencySymbol.includes(
114
+ userLocaleCureency
115
+ )
116
+ ? userLocaleCureency
117
+ : question.formElement?.appearance?.currencySymbol;
118
+ } else {
119
+ currencySymbol = userLocaleCureency;
120
+ }
121
+ } else if (currencyOption == 'specific') {
122
+ currencySymbol =
123
+ question.formElement?.appearance?.specificCurrencySymbol;
124
+ }
125
+ }
126
+ }
127
+ if (
128
+ !currencySymbol &&
129
+ question.formElement?.appearance?.currencySymbol
130
+ ) {
131
+ currencySymbol =
132
+ question.formElement?.appearance?.currencySymbol;
133
+ }
134
+ return currencySymbol;
135
+ }
136
+
137
+ subFormSubmission(subForm: any) {
138
+ const processFormElements = (
139
+ rows: any[],
140
+ isChild: boolean = false
141
+ ): Answer[] => {
142
+ const answers: Answer[] = [];
143
+
144
+ rows.flatMap((item: any) =>
145
+ item.grid.forEach((formElement: any) => {
146
+ const answer: Answer = {
147
+ questionId: formElement.element.id,
148
+ answer: formElement.element?.answer || '',
149
+ files:
150
+ formElement.element.formElement.elementType == 'FILE_PICKER' &&
151
+ formElement.element.answer
152
+ ? formElement.element.answer
153
+ : undefined,
154
+ isChild: isChild,
155
+ amountInWords: formElement.element.amountInWords
156
+ };
157
+
158
+ if (
159
+ formElement.element.formElement.elementType == 'FILE_PICKER' &&
160
+ formElement.element.answer
161
+ ) {
162
+ const fileNames = formElement.element.answer.map(
163
+ (file: any) => file?._file.name
164
+ );
165
+ answer.answer = fileNames;
166
+ }
167
+ answers.push(answer);
168
+ if(
169
+ formElement.element.formElement &&
170
+ (formElement.element.formElement.elementType === 'DROP_DOWN' ||
171
+ formElement.element.formElement.elementType === 'RADIO_BUTTON' ||
172
+ formElement.element.formElement.elementType === 'CHECKBOX') &&
173
+ formElement.element.formElement.scoring &&
174
+ formElement.element.formElement.scoring.enableScoring
175
+ ){
176
+ answers.forEach((ans) => {
177
+ if(formElement.element.id === ans.questionId){
178
+ const scoreResult = this.scoreCalcService.calculateScoreFromAnswer(ans.answer, formElement.element);
179
+ // Save total score and individual scores
180
+ // ans.score = scoreResult?.totalScore ?? 1;
181
+ ans.scores = scoreResult?.scores;
182
+ }
183
+ });
184
+ }
185
+ if (formElement.element.childLogics) {
186
+ formElement.element.childLogics.forEach((logic: any) => {
187
+ if (logic.showLogic) {
188
+ answers.push(...processFormElements(logic.rows, true));
189
+ logic.showLogic = false;
190
+ }
191
+ });
192
+ }
193
+ })
194
+ );
195
+ return answers;
196
+ };
197
+
198
+ const answers = processFormElements(subForm.rows);
199
+
200
+ if (answers.length > 0) {
201
+ const submission: Submission = {
202
+ submissionId: '',
203
+ answers: answers,
204
+ };
205
+ if (this.scoreCalcService.shouldCalculateScore(this.subForm, submission)) {
206
+ // Mark that this submission had all scoring questions answered at least once
207
+ submission.hasAllScoringAnsweredOnce = true;
208
+ }
209
+
210
+ if (submission.hasAllScoringAnsweredOnce) {
211
+ // Recalculate score always after once satisfied
212
+ submission.scores = this.scoreCalcService.calculateSubmissionScore(submission.answers);
213
+ }
214
+ this.submissions.push(submission);
215
+ this.submissions = [...this.submissions];
216
+ this.updateSubFormWithSubmissions();
217
+ }
218
+ // this.subForm.score = this.scoreCalcService.calculateFinalScore(this.submissions,this.maxPossibleScore);
219
+ }
220
+
221
+ editSubFormSubmission(index: number, submission: Submission) {
222
+ const subForm = this.bindAnswers(this.subForm, submission);
223
+ const dialogConfig = new MatDialogConfig();
224
+ dialogConfig.position = { top: '5%' };
225
+ dialogConfig.width = '100%';
226
+ dialogConfig.data = {
227
+ subForm: subForm,
228
+ acceptedLanguage: this.acceptedLanguage,
229
+ };
230
+ dialogConfig.hasBackdrop = true;
231
+ dialogConfig.disableClose = true;
232
+ dialogConfig.maxHeight = '80vh';
233
+ const dialogRef = this.dialog.open(SubmissionModalComponent, dialogConfig);
234
+
235
+ dialogRef.afterClosed().subscribe((result: any) => {
236
+ if (result) {
237
+ this.updateSubmission(result, index);
238
+ }
239
+ });
240
+ }
241
+
242
+ bindAnswers(subForm: any, submission: Submission): any {
243
+ const bindElementAnswers = (rows: any[], answers: Answer[]) => {
244
+ rows.forEach((row: any) => {
245
+ row.grid.forEach((grid: any) => {
246
+ const answer = answers.find((a) => a.questionId === grid.element.id);
247
+ if (answer) {
248
+ grid.element.answer =
249
+ grid.element.formElement.elementType == 'FILE_PICKER'
250
+ ? answer?.files
251
+ : answer.answer;
252
+ grid.element.amountInWords = answer?.amountInWords;
253
+ grid.element.answerId = answer.answerId;
254
+ grid.element.attachments = answer.attachments;
255
+ }
256
+ if (grid.element.childLogics) {
257
+ grid.element.childLogics.forEach((logic: any) => {
258
+ bindElementAnswers(logic.rows, answers);
259
+ });
260
+ }
261
+ });
262
+ });
263
+ };
264
+
265
+ const updatedSubForm = { ...subForm };
266
+ bindElementAnswers(updatedSubForm.rows, submission.answers);
267
+ return updatedSubForm;
268
+ }
269
+
270
+ deleteSubForm(index: number) {
271
+ const submission = this.submissions[index];
272
+ if (submission.submissionId) {
273
+ this.deletedSubmissions.push(submission.submissionId);
274
+ }
275
+ this.submissions.splice(index, 1);
276
+ this.submissions = [...this.submissions];
277
+ this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.submissions,this.maxPossibleGoodScore,this.maxPossibleBadScore);
278
+ this.updateSubFormWithSubmissions();
279
+ }
280
+
281
+ addNewSubmission() {
282
+ const subForm = this.cleanCircularReferences(this.subForm);
283
+ subForm.rows.forEach((row: any) => {
284
+ row.grid.forEach((grid: any) => {
285
+ grid.element.answer = grid.element.formElement.elementType === 'FILE_PICKER' ? [] : '';
286
+ grid.element.attachments = [];
287
+ grid.element.answerId = null;
288
+ });
289
+ });
290
+
291
+ const dialogConfig = new MatDialogConfig();
292
+ dialogConfig.position = { top: '5%' };
293
+ dialogConfig.width = '100%';
294
+ dialogConfig.data = {
295
+ subForm: subForm,
296
+ acceptedLanguage: this.acceptedLanguage,
297
+ };
298
+ dialogConfig.hasBackdrop = true;
299
+ dialogConfig.disableClose = true;
300
+ dialogConfig.maxHeight = '80vh';
301
+ dialogConfig.autoFocus = false;
302
+ const dialogRef = this.dialog.open(SubmissionModalComponent, dialogConfig);
303
+
304
+ dialogRef.afterClosed().subscribe((result: any) => {
305
+ if (result) {
306
+ const hasData = result.rows.flatMap((item: any) =>
307
+ item.grid.some(
308
+ (formElement: any) =>
309
+ formElement.element.answer &&
310
+ formElement.element.answer.length > 0
311
+ )
312
+ );
313
+
314
+ if (hasData) {
315
+ this.subFormSubmission(result);
316
+ }
317
+ }
318
+ });
319
+ }
320
+
321
+ cleanCircularReferences(obj: any, seen = new WeakSet()) {
322
+ if (obj === null || typeof obj !== 'object') {
323
+ return obj;
324
+ }
325
+
326
+ if (seen.has(obj)) {
327
+ return;
328
+ }
329
+
330
+ seen.add(obj);
331
+
332
+ const cleanedObj: any = Array.isArray(obj) ? [] : {};
333
+
334
+ for (const key in obj) {
335
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
336
+ cleanedObj[key] = this.cleanCircularReferences(obj[key], seen);
337
+ }
338
+ }
339
+
340
+ return cleanedObj;
341
+ }
342
+
343
+ updateSubmission(result: any, index: number) {
344
+ const processFormElements = (rows: any[], answers: Answer[]) => {
345
+ rows.forEach((row: any) => {
346
+ row.grid.forEach((grid: any) => {
347
+ let answer: Answer = {
348
+ questionId: grid.element.id,
349
+ answerId: grid.element?.answerId || '',
350
+ attachments: grid.element.attachments || [],
351
+ answer: [],
352
+ files: [],
353
+ deleteFiles: [],
354
+ };
355
+
356
+ if (answer.attachments) {
357
+ answer.answer = answer.attachments.map(
358
+ (attachment: Attachment) => attachment.fileName
359
+ );
360
+ }
361
+ if (grid.element.formElement.elementType === 'FILE_PICKER') {
362
+ if (grid.element?.deleteFiles.length > 0) {
363
+ answer.answer = []; // Reset answer.answer only once
364
+ answer.deleteFiles = answer.deleteFiles || [];
365
+
366
+ // Collect deleted file IDs
367
+ grid.element.deleteFiles.forEach((deletedId: string) => {
368
+ answer.deleteFiles?.push(deletedId);
369
+ });
370
+
371
+ if (answer.attachments) {
372
+ // Filter out deleted attachments
373
+ answer.attachments = answer.attachments.filter((attachment: Attachment) => {
374
+ if (!grid.element.deleteFiles.includes(attachment.fileId)) {
375
+ return true;
376
+ }
377
+ return false;
378
+ });
379
+
380
+ // Rebuild answer.answer with the remaining attachments
381
+ answer.answer = answer.attachments.map((attachment) => attachment.fileName);
382
+ }
383
+
384
+ }
385
+ if (grid.element.answer) {
386
+ answer.files = grid.element.answer;
387
+ let fileNamesArray = Array.isArray(answer.answer) ? [...answer.answer] : [];
388
+
389
+ grid.element.answer.forEach((file: any) => {
390
+ const fileName = file._file?.name;
391
+ if (!fileNamesArray.includes(fileName)) {
392
+ fileNamesArray.push(fileName);
393
+ }
394
+ });
395
+
396
+ answer.answer = fileNamesArray; // Append to existing array instead of overwriting
397
+ }
398
+ } else {
399
+ answer = {
400
+ questionId: grid.element.id,
401
+ answerId: grid.element?.answerId || '',
402
+ attachments: grid.element.attachments,
403
+ answer: grid.element.answer,
404
+ maximumPossibleScore: grid.element.maxPossibleScore,
405
+ amountInWords: grid.element.amountInWords
406
+ };
407
+ }
408
+ grid.element.answer = '';
409
+ answers.push(answer);
410
+ if(
411
+ grid.element.formElement &&
412
+ (grid.element.formElement.elementType === 'DROP_DOWN' ||
413
+ grid.element.formElement.elementType === 'RADIO_BUTTON' ||
414
+ grid.element.formElement.elementType === 'CHECK_BOX') &&
415
+ grid.element.formElement.scoring &&
416
+ grid.element.formElement.scoring.enableScoring
417
+ ){
418
+ answers.forEach((ans) => {
419
+ if(grid.element.id === ans.questionId){
420
+ const scoreResult = this.scoreCalcService.calculateScoreFromAnswer(ans.answer, grid.element);
421
+ // Save total score and individual scores
422
+ ans.scores = scoreResult?.scores;
423
+ }
424
+ });
425
+ }
426
+
427
+ if (grid.element.childLogics) {
428
+ grid.element.childLogics.forEach((logic: any) => {
429
+ if (logic.showLogic) {
430
+ processFormElements(logic.rows, answers);
431
+ }
432
+ });
433
+ }
434
+ });
435
+ });
436
+ };
437
+
438
+ this.submissions[index].answers = [];
439
+ processFormElements(result.rows, this.submissions[index].answers);
440
+ this.submissions[index].scores = this.scoreCalcService.calculateSubmissionScore(this.submissions[index].answers);
441
+ this.submissions = [...this.submissions];
442
+ const hasAnyScore = this.submissions.some(
443
+ sub => sub.scores?.some(s => s.score !== null && s.score !== undefined)
444
+ );
445
+
446
+ if (hasAnyScore) {
447
+ this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.submissions,this.maxPossibleGoodScore,this.maxPossibleBadScore);
448
+ } else {
449
+ this.subForm.scores = null; // or 0, depending on how you want to represent "no score yet"
450
+ }
451
+ this.updateSubFormWithSubmissions();
452
+ this.clearEmptyRows();
453
+ }
454
+
455
+ updateSubFormWithSubmissions() {
456
+ this.subForm.submissions = this.submissions;
457
+ this.subForm.maxPossibleScore = {
458
+ 'good': this.maxPossibleGoodScore,
459
+ 'bad': this.maxPossibleBadScore
460
+ }
461
+ this.subForm.deletedSubmissions = this.deletedSubmissions;
462
+ this.subFormChange.emit(this.subForm);
463
+ }
464
+
465
+ clearEmptyRows() {
466
+ const nonEmptySubmissions: Submission[] = [];
467
+ const emptySubmissionIds: string[] = [];
468
+
469
+ this.submissions.forEach((submission) => {
470
+ if (submission.answers.some((answer) => answer.answer !== '')) {
471
+ nonEmptySubmissions.push(submission);
472
+ } else if (submission.submissionId) {
473
+ emptySubmissionIds.push(submission.submissionId);
474
+ }
475
+ });
476
+
477
+ this.submissions = nonEmptySubmissions;
478
+ this.deletedSubmissions.push(...emptySubmissionIds);
479
+ this.updateSubFormWithSubmissions();
480
+ }
481
+ }
@@ -0,0 +1,51 @@
1
+ <div [ngSwitch]="question.formElement.elementType">
2
+
3
+ <lib-check-box-fields *ngSwitchCase="'CHECK_BOX'" [question]="question" (validate)="handleValidation($event)"></lib-check-box-fields>
4
+ <lib-date-time-fields *ngSwitchCase="'DATE_TIME'" [question]="question" (validate)="handleValidation($event)"></lib-date-time-fields>
5
+ <lib-drop-down-fields *ngSwitchCase="'DROP_DOWN'" [question]="question" (validate)="handleValidation($event)"></lib-drop-down-fields>
6
+ <lib-file-picker-fields *ngSwitchCase="'FILE_PICKER'" [question]="question" (validate)="handleValidation($event)"></lib-file-picker-fields>
7
+ <lib-location-fields *ngSwitchCase="'LOCATION'" [question]="question" (validate)="handleValidation($event)"></lib-location-fields>
8
+ <lib-mail-fields *ngSwitchCase="'EMAIL'" [question]="question" (validate)="handleValidation($event)"></lib-mail-fields>
9
+ <lib-mobile-fields *ngSwitchCase="'MOBILE'" [question]="question" (validate)="handleValidation($event)"></lib-mobile-fields>
10
+ <lib-number-fields *ngSwitchCase="'NUMBER'" [question]="question" (validate)="handleValidation($event)" [rowId]="'0'"></lib-number-fields>
11
+ <lib-password-fields *ngSwitchCase="'PASSWORD'" [question]="question" (validate)="handleValidation($event)"></lib-password-fields>
12
+ <lib-radio-button-fields *ngSwitchCase="'RADIO_BUTTON'" [question]="question" (validate)="handleValidation($event)"></lib-radio-button-fields>
13
+ <lib-rich-text-editor-fields *ngSwitchCase="'RICH_TEXT_EDITOR'" [question]="question" (validate)="handleValidation($event)"></lib-rich-text-editor-fields>
14
+ <lib-selection-matrix-fields *ngSwitchCase="'SELECTION_MATRIX'" [question]="question" [acceptedLanguage]="acceptedLanguage" (validate)="handleValidation($event)"></lib-selection-matrix-fields>
15
+ <lib-signature-fields *ngSwitchCase="'SIGNATURE'" [question]="question" (validate)="handleValidation($event)"></lib-signature-fields>
16
+ <lib-slider-fields *ngSwitchCase="'SLIDER'" [question]="question" (validate)="handleValidation($event)"></lib-slider-fields>
17
+ <lib-terms-and-condition-fields *ngSwitchCase="'TERMS_AND_CONDITION'" [question]="question" (validate)="handleValidation($event)"></lib-terms-and-condition-fields>
18
+ <lib-text-area-fields *ngSwitchCase="'TEXT_AREA'" [question]="question" (validate)="handleValidation($event)"></lib-text-area-fields>
19
+ <lib-text-fields *ngSwitchCase="'TEXT_BOX'" [question]="question" (validate)="handleValidation($event)"></lib-text-fields>
20
+ <lib-toggle-switch-fields *ngSwitchCase="'TOGGLE_SWITCH'" [question]="question" [acceptedLanguage]="acceptedLanguage" (validate)="handleValidation($event)"></lib-toggle-switch-fields>
21
+ <lib-url-fields *ngSwitchCase="'URL'" [question]="question" (validate)="handleValidation($event)"></lib-url-fields>
22
+ <lib-aggregate-function *ngSwitchCase="'AGGREGATE_FUNCTION'" [question]="question" (validate)="handleValidation($event)" [rowId]="'0'"></lib-aggregate-function>
23
+ <lib-currency-fields *ngSwitchCase="'CURRENCY'" [question]="question" (validate)="handleValidation($event)" [rowId]="'0'"></lib-currency-fields>
24
+ <lib-hidden-field *ngSwitchCase="'HIDDEN_FIELD'" [question]="question" (validate)="handleValidation($event)"></lib-hidden-field>
25
+ <lib-iframe-fields *ngSwitchCase="'IFRAME_WIDGET'" [question]="question" ></lib-iframe-fields>
26
+ </div>
27
+
28
+ <ng-container *ngIf="question.childLogics">
29
+
30
+ <!-- <ng-container *ngIf="componentToLoad">
31
+ <ng-container *ngComponentOutlet="componentToLoad;
32
+ inputs: { grid: question.childLogics,
33
+ answer: question.answer,
34
+ state: 'child' }"></ng-container>
35
+ </ng-container> -->
36
+
37
+ <!-- <ng-container *ngIf="getComponentForChildLogics(question.childLogics, 'child', question.answer) as cached">
38
+ <ng-container
39
+ *ngComponentOutlet="cached.component | async; injector: cached.injector">
40
+ </ng-container>
41
+ </ng-container> -->
42
+
43
+
44
+ <ng-container *ngIf="componentToLoad">
45
+
46
+ <ng-container *ngComponentOutlet="componentToLoad;
47
+ inputs: { grid: question.childLogics,
48
+ answer: question?.answer,
49
+ state: 'child' }"></ng-container>
50
+ </ng-container>
51
+ </ng-container>
File without changes
@@ -0,0 +1,21 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { QuestionComponent } from './question.component';
4
+
5
+ describe('QuestionComponent', () => {
6
+ let component: QuestionComponent;
7
+ let fixture: ComponentFixture<QuestionComponent>;
8
+
9
+ beforeEach(() => {
10
+ TestBed.configureTestingModule({
11
+ declarations: [QuestionComponent]
12
+ });
13
+ fixture = TestBed.createComponent(QuestionComponent);
14
+ component = fixture.componentInstance;
15
+ fixture.detectChanges();
16
+ });
17
+
18
+ it('should create', () => {
19
+ expect(component).toBeTruthy();
20
+ });
21
+ });
@@ -0,0 +1,129 @@
1
+ import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'lib-question',
5
+ templateUrl: './question.component.html',
6
+ styleUrls: ['./question.component.scss']
7
+ })
8
+ export class QuestionComponent {
9
+ @Input() question: any = {};
10
+ @Input() edit: boolean = false;
11
+ @Input() acceptedLanguage: string = '';
12
+ @Input() currentPageIndex: number = 0;
13
+ @Output() emitValidations = new EventEmitter<any>();
14
+ @Output() subFormChange = new EventEmitter<any>();
15
+ validations: any = [];
16
+ componentToLoad: any;
17
+ injector!: Injector;
18
+ childLogicCache: { [key: string]: { component: Promise<any>, injector: Injector } } = {};
19
+
20
+
21
+ constructor(private cdr: ChangeDetectorRef) { }
22
+
23
+ ngOnInit(): void {
24
+ this.loadComponent()
25
+ }
26
+
27
+ // private async loadComponent(): Promise<void> {
28
+ // this.componentToLoad = await this.loadFormElementsComponent();
29
+ // this.injector = this.createInjector();
30
+ // }
31
+ // safeStringify(obj: any) {
32
+ // const seen = new WeakSet();
33
+ // return JSON.stringify(obj, (key, value) => {
34
+ // if (typeof value === "object" && value !== null) {
35
+ // if (seen.has(value)) return;
36
+ // seen.add(value);
37
+ // }
38
+ // return value;
39
+ // }, 2);
40
+ // }
41
+ // getComponentForChildLogics(grid: any, state: string, answer: any): { component: Promise<any>, injector: Injector } {
42
+ // const key = this.safeStringify({grid, state});
43
+ // if (!this.childLogicCache[key]) {
44
+ // const component = this.loadFormElementsComponent();
45
+ // const injector = this.createInjector(grid, state, answer);
46
+ // this.childLogicCache[key] = { component, injector };
47
+ // }
48
+ // return this.childLogicCache[key];
49
+ // }
50
+
51
+ // private async loadFormElementsComponent() {
52
+ // const { FormElementsComponent } = await import('../form-elements/form-elements.component');
53
+ // return FormElementsComponent;
54
+ // }
55
+
56
+ // private createInjector(grid: any, state: string, answer: any): Injector {
57
+ // return Injector.create({
58
+ // providers: [
59
+ // { provide: 'grid', useValue:grid},
60
+ // { provide: 'edit', useValue: this.edit },
61
+ // { provide: 'answer', useValue: answer },
62
+ // { provide: 'state', useValue:state },
63
+ // { provide: 'acceptedLanguage', useValue: this.acceptedLanguage }
64
+ // ],
65
+ // });
66
+ // }
67
+
68
+
69
+
70
+ removeCircularReferences(obj: any): any {
71
+ const seen = new WeakSet();
72
+
73
+ function recurse(value: any): any {
74
+ if (value === null || typeof value !== 'object') {
75
+ return value;
76
+ }
77
+
78
+ if (seen.has(value)) {
79
+ return '[Circular]';
80
+ }
81
+
82
+ seen.add(value);
83
+
84
+ if (Array.isArray(value)) {
85
+ return value.map(item => recurse(item));
86
+ }
87
+
88
+ const output: any = {};
89
+ for (const key of Object.keys(value)) {
90
+ output[key] = recurse(value[key]);
91
+ }
92
+
93
+ seen.delete(value);
94
+ return output;
95
+ }
96
+
97
+ return recurse(obj);
98
+ }
99
+
100
+ private async loadComponent(): Promise<void> {
101
+ this.componentToLoad = await this.loadFormElementsComponent();
102
+ this.injector = this.createInjector();
103
+ }
104
+
105
+ private async loadFormElementsComponent() {
106
+ const { FormElementsComponent } = await import('../form-elements/form-elements.component');
107
+ return FormElementsComponent;
108
+ }
109
+
110
+ createInjector(): Injector {
111
+ return Injector.create({
112
+ providers: [
113
+ { provide: 'grid', useValue: this.question?.childLogics },
114
+ { provide: 'state', useValue: 'child' },
115
+ ],
116
+ });
117
+ }
118
+
119
+ updateSubFormWithSubmissions(event: any) {
120
+ this.subFormChange.emit(event);
121
+ }
122
+
123
+ handleValidation(validation: any) {
124
+ this.validations.push(validation);
125
+ this.emitValidations.emit(this.validations);
126
+ this.cdr.detectChanges();
127
+ }
128
+
129
+ }