@piserve-tech/form-submission 1.3.317 → 1.3.319

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 (442) hide show
  1. package/environment/environment.d.ts +5 -0
  2. package/esm2022/environment/environment.mjs +6 -0
  3. package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +146 -0
  4. package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +473 -0
  5. package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +502 -0
  6. package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +608 -0
  7. package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +585 -0
  8. package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +224 -0
  9. package/esm2022/form-fields/form-fields.module.mjs +174 -0
  10. package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +137 -0
  11. package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +198 -0
  12. package/esm2022/form-fields/location-fields/location-fields.component.mjs +85 -0
  13. package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +131 -0
  14. package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +270 -0
  15. package/esm2022/form-fields/number-fields/number-fields.component.mjs +242 -0
  16. package/esm2022/form-fields/password-fields/password-fields.component.mjs +257 -0
  17. package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +346 -0
  18. package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +148 -0
  19. package/esm2022/form-fields/section-fields/section-fields.component.mjs +29 -0
  20. package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +158 -0
  21. package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +32 -0
  22. package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +73 -0
  23. package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +66 -0
  24. package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +159 -0
  25. package/esm2022/form-fields/text-fields/text-fields.component.mjs +245 -0
  26. package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +85 -0
  27. package/esm2022/form-fields/url-fields/url-fields.component.mjs +124 -0
  28. package/esm2022/form-submission/form-submission.module.mjs +64 -0
  29. package/esm2022/form-submission/header/header.component.mjs +20 -0
  30. package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +171 -0
  31. package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +124 -0
  32. package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +50 -0
  33. package/esm2022/form-submission/submission-container/submission-container.component.mjs +17 -0
  34. package/esm2022/form-submission/submit-form/submit-form.component.mjs +1610 -0
  35. package/esm2022/lib/form-submission.component.mjs +113 -0
  36. package/esm2022/lib/form-submission.module.mjs +56 -0
  37. package/esm2022/lib/form-submission.service.mjs +14 -0
  38. package/esm2022/models/aggregate.model.mjs +2 -0
  39. package/esm2022/models/answer.model.mjs +2 -0
  40. package/esm2022/models/appearance.model.mjs +2 -0
  41. package/esm2022/models/attachment.model.mjs +2 -0
  42. package/esm2022/models/defaultAnswerEntry.model.mjs +2 -0
  43. package/esm2022/models/defaultAnswersModel.model.mjs +2 -0
  44. package/esm2022/models/defaultQuestionAnswer.model.mjs +2 -0
  45. package/esm2022/models/elementOptionAPI.model.mjs +2 -0
  46. package/esm2022/models/elementOptionAPIData.model.mjs +2 -0
  47. package/esm2022/models/elementOptionDB.model.mjs +2 -0
  48. package/esm2022/models/elementOptionDBCriteria.model.mjs +2 -0
  49. package/esm2022/models/emitters.model.mjs +2 -0
  50. package/esm2022/models/enum/condition.enum.mjs +18 -0
  51. package/esm2022/models/enum/elementType .enum.mjs +24 -0
  52. package/esm2022/models/enum/entityType.enum.mjs +12 -0
  53. package/esm2022/models/formConfiguration.model.mjs +2 -0
  54. package/esm2022/models/formElement.model.mjs +2 -0
  55. package/esm2022/models/formElementType.model.mjs +2 -0
  56. package/esm2022/models/grid.model.mjs +2 -0
  57. package/esm2022/models/hiddenField.model.mjs +2 -0
  58. package/esm2022/models/iFrameProperties.model.mjs +2 -0
  59. package/esm2022/models/logic.model.mjs +2 -0
  60. package/esm2022/models/multifields.model.mjs +2 -0
  61. package/esm2022/models/option.model.mjs +2 -0
  62. package/esm2022/models/page.model.mjs +2 -0
  63. package/esm2022/models/publicForm.model.mjs +2 -0
  64. package/esm2022/models/question.model.mjs +2 -0
  65. package/esm2022/models/questionAnswer.model.mjs +2 -0
  66. package/esm2022/models/questionGroup.model.mjs +2 -0
  67. package/esm2022/models/row.model.mjs +2 -0
  68. package/esm2022/models/scoring.model.mjs +2 -0
  69. package/esm2022/models/section.model.mjs +2 -0
  70. package/esm2022/models/subForm.model.mjs +2 -0
  71. package/esm2022/models/subformConfiguration.model.mjs +2 -0
  72. package/esm2022/models/subformPropery.model.mjs +2 -0
  73. package/esm2022/models/submission.model.mjs +2 -0
  74. package/esm2022/models/submissionCopyConfig.mopdel.mjs +2 -0
  75. package/esm2022/models/terms&condition.model.mjs +2 -0
  76. package/esm2022/models/validation.model.mjs +2 -0
  77. package/esm2022/models/whenClause.model.mjs +2 -0
  78. package/esm2022/models/whenClauseCondition.model.mjs +2 -0
  79. package/esm2022/models/whenClauseElements.model.mjs +2 -0
  80. package/esm2022/piserve-tech-form-submission.mjs +5 -0
  81. package/esm2022/public-api.mjs +7 -0
  82. package/esm2022/question/card-subform/card-subform.component.mjs +354 -0
  83. package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +27 -0
  84. package/esm2022/question/form-elements/form-elements.component.mjs +62 -0
  85. package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +384 -0
  86. package/esm2022/question/multifields/multifields.component.mjs +54 -0
  87. package/esm2022/question/multiple-subform/multiple-subform.component.mjs +413 -0
  88. package/esm2022/question/question/question.component.mjs +145 -0
  89. package/esm2022/question/question-group/question-group.component.mjs +102 -0
  90. package/esm2022/question/recursive-logic/recursive-logic.component.mjs +49 -0
  91. package/esm2022/question/sub-form/sub-form.component.mjs +355 -0
  92. package/esm2022/services/aggregate.service.mjs +139 -0
  93. package/esm2022/services/countryService.mjs +89 -0
  94. package/esm2022/services/data.service.mjs +36 -0
  95. package/esm2022/services/element-tracker.service.mjs +27 -0
  96. package/esm2022/services/form-validation.service.mjs +128 -0
  97. package/esm2022/services/form.service.mjs +332 -0
  98. package/esm2022/services/mapper.service.mjs +519 -0
  99. package/esm2022/services/recaptcha.service.mjs +136 -0
  100. package/esm2022/services/score.service.mjs +268 -0
  101. package/esm2022/services/subform-copy.service.mjs +122 -0
  102. package/esm2022/services/validation.service.mjs +35 -0
  103. package/esm2022/services/whenClause.service.mjs +423 -0
  104. package/esm2022/shared/shared.module.mjs +97 -0
  105. package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +133 -0
  106. package/fesm2022/piserve-tech-form-submission.mjs +11661 -0
  107. package/fesm2022/piserve-tech-form-submission.mjs.map +1 -0
  108. package/form-fields/aggregate-function/aggregate-function.component.d.ts +43 -0
  109. package/form-fields/check-box-fields/check-box-fields.component.d.ts +73 -0
  110. package/form-fields/currency-fields/currency-fields.component.d.ts +62 -0
  111. package/form-fields/date-time-fields/date-time-fields.component.d.ts +96 -0
  112. package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +88 -0
  113. package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +72 -0
  114. package/form-fields/form-fields.module.d.ts +40 -0
  115. package/form-fields/hidden-field/hidden-field.component.d.ts +38 -0
  116. package/form-fields/iframe-fields/iframe-fields.component.d.ts +35 -0
  117. package/form-fields/location-fields/location-fields.component.d.ts +29 -0
  118. package/form-fields/mail-fields/mail-fields.component.d.ts +41 -0
  119. package/form-fields/mobile-fields/mobile-fields.component.d.ts +71 -0
  120. package/form-fields/number-fields/number-fields.component.d.ts +53 -0
  121. package/form-fields/password-fields/password-fields.component.d.ts +57 -0
  122. package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +70 -0
  123. package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +46 -0
  124. package/form-fields/section-fields/section-fields.component.d.ts +10 -0
  125. package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +45 -0
  126. package/form-fields/signature-fields/signature-fields.component.d.ts +13 -0
  127. package/form-fields/slider-fields/slider-fields.component.d.ts +32 -0
  128. package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +26 -0
  129. package/form-fields/text-area-fields/text-area-fields.component.d.ts +49 -0
  130. package/form-fields/text-fields/text-fields.component.d.ts +49 -0
  131. package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +29 -0
  132. package/form-fields/url-fields/url-fields.component.d.ts +41 -0
  133. package/form-submission/form-submission.module.d.ts +20 -0
  134. package/form-submission/header/header.component.d.ts +7 -0
  135. package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +57 -0
  136. package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +46 -0
  137. package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +17 -0
  138. package/form-submission/submission-container/submission-container.component.d.ts +7 -0
  139. package/form-submission/submit-form/submit-form.component.d.ts +237 -0
  140. package/index.d.ts +5 -0
  141. package/lib/form-submission.component.d.ts +30 -0
  142. package/lib/form-submission.module.d.ts +16 -0
  143. package/lib/form-submission.service.d.ts +6 -0
  144. package/models/aggregate.model.d.ts +4 -0
  145. package/{src/models/answer.model.ts → models/answer.model.d.ts} +23 -25
  146. package/models/appearance.model.d.ts +64 -0
  147. package/{src/models/attachment.model.ts → models/attachment.model.d.ts} +6 -6
  148. package/{src/models/defaultAnswerEntry.model.ts → models/defaultAnswerEntry.model.d.ts} +5 -7
  149. package/{src/models/defaultAnswersModel.model.ts → models/defaultAnswersModel.model.d.ts} +4 -5
  150. package/{src/models/defaultQuestionAnswer.model.ts → models/defaultQuestionAnswer.model.d.ts} +6 -6
  151. package/models/elementOptionAPI.model.d.ts +12 -0
  152. package/models/elementOptionAPIData.model.d.ts +5 -0
  153. package/models/elementOptionDB.model.d.ts +8 -0
  154. package/models/elementOptionDBCriteria.model.d.ts +7 -0
  155. package/{src/models/emitters.model.ts → models/emitters.model.d.ts} +8 -8
  156. package/{src/models/enum/condition.enum.ts → models/enum/condition.enum.d.ts} +2 -2
  157. package/models/enum/elementType .enum.d.ts +22 -0
  158. package/models/enum/entityType.enum.d.ts +10 -0
  159. package/{src/models/formConfiguration.model.ts → models/formConfiguration.model.d.ts} +2 -2
  160. package/{src/models/formElement.model.ts → models/formElement.model.d.ts} +22 -22
  161. package/{src/models/formElementType.model.ts → models/formElementType.model.d.ts} +2 -3
  162. package/{src/models/grid.model.ts → models/grid.model.d.ts} +13 -14
  163. package/{src/models/hiddenField.model.ts → models/hiddenField.model.d.ts} +5 -5
  164. package/{src/models/iFrameProperties.model.ts → models/iFrameProperties.model.d.ts} +13 -13
  165. package/models/logic.model.d.ts +9 -0
  166. package/models/multifields.model.d.ts +11 -0
  167. package/{src/models/option.model.ts → models/option.model.d.ts} +5 -5
  168. package/models/page.model.d.ts +6 -0
  169. package/models/publicForm.model.d.ts +18 -0
  170. package/models/question.model.d.ts +26 -0
  171. package/models/questionAnswer.model.d.ts +7 -0
  172. package/models/questionGroup.model.d.ts +11 -0
  173. package/{src/models/row.model.ts → models/row.model.d.ts} +1 -2
  174. package/models/scoring.model.d.ts +10 -0
  175. package/models/section.model.d.ts +6 -0
  176. package/models/subForm.model.d.ts +24 -0
  177. package/models/subformConfiguration.model.d.ts +4 -0
  178. package/models/subformPropery.model.d.ts +7 -0
  179. package/{src/models/submission.model.ts → models/submission.model.d.ts} +14 -16
  180. package/{src/models/submissionCopyConfig.mopdel.ts → models/submissionCopyConfig.mopdel.d.ts} +4 -4
  181. package/{src/models/terms&condition.model.ts → models/terms&condition.model.d.ts} +1 -1
  182. package/models/validation.model.d.ts +48 -0
  183. package/models/whenClause.model.d.ts +6 -0
  184. package/{src/models/whenClauseCondition.model.ts → models/whenClauseCondition.model.d.ts} +6 -6
  185. package/{src/models/whenClauseElements.model.ts → models/whenClauseElements.model.d.ts} +5 -6
  186. package/package.json +46 -33
  187. package/{src/public-api.ts → public-api.d.ts} +0 -4
  188. package/question/card-subform/card-subform.component.d.ts +44 -0
  189. package/question/confirm-dialog/confirm-dialog.component.d.ts +12 -0
  190. package/question/form-elements/form-elements.component.d.ts +20 -0
  191. package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +47 -0
  192. package/question/multifields/multifields.component.d.ts +11 -0
  193. package/question/multiple-subform/multiple-subform.component.d.ts +39 -0
  194. package/question/question/question.component.d.ts +30 -0
  195. package/question/question-group/question-group.component.d.ts +29 -0
  196. package/question/recursive-logic/recursive-logic.component.d.ts +19 -0
  197. package/question/sub-form/sub-form.component.d.ts +70 -0
  198. package/services/aggregate.service.d.ts +29 -0
  199. package/services/countryService.d.ts +21 -0
  200. package/services/data.service.d.ts +19 -0
  201. package/services/element-tracker.service.d.ts +10 -0
  202. package/services/form-validation.service.d.ts +16 -0
  203. package/services/form.service.d.ts +27 -0
  204. package/services/mapper.service.d.ts +31 -0
  205. package/services/recaptcha.service.d.ts +46 -0
  206. package/services/score.service.d.ts +27 -0
  207. package/services/subform-copy.service.d.ts +10 -0
  208. package/services/validation.service.d.ts +14 -0
  209. package/services/whenClause.service.d.ts +45 -0
  210. package/shared/shared.module.d.ts +25 -0
  211. package/sub-form/submission-modal/submission-modal.component.d.ts +31 -0
  212. package/ng-package.json +0 -30
  213. package/src/environment/environment.ts +0 -6
  214. package/src/form-fields/aggregate-function/aggregate-function.component.html +0 -63
  215. package/src/form-fields/aggregate-function/aggregate-function.component.scss +0 -1
  216. package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +0 -21
  217. package/src/form-fields/aggregate-function/aggregate-function.component.ts +0 -148
  218. package/src/form-fields/check-box-fields/check-box-fields.component.html +0 -81
  219. package/src/form-fields/check-box-fields/check-box-fields.component.scss +0 -28
  220. package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +0 -21
  221. package/src/form-fields/check-box-fields/check-box-fields.component.ts +0 -538
  222. package/src/form-fields/currency-fields/currency-fields.component.html +0 -85
  223. package/src/form-fields/currency-fields/currency-fields.component.scss +0 -48
  224. package/src/form-fields/currency-fields/currency-fields.component.spec.ts +0 -21
  225. package/src/form-fields/currency-fields/currency-fields.component.ts +0 -589
  226. package/src/form-fields/date-time-fields/date-time-fields.component.html +0 -268
  227. package/src/form-fields/date-time-fields/date-time-fields.component.scss +0 -88
  228. package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +0 -21
  229. package/src/form-fields/date-time-fields/date-time-fields.component.ts +0 -693
  230. package/src/form-fields/drop-down-fields/drop-down-fields.component.html +0 -77
  231. package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +0 -12
  232. package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +0 -21
  233. package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +0 -698
  234. package/src/form-fields/file-picker-fields/file-picker-fields.component.html +0 -72
  235. package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +0 -33
  236. package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +0 -21
  237. package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +0 -256
  238. package/src/form-fields/form-fields.module.ts +0 -110
  239. package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
  240. package/src/form-fields/hidden-field/hidden-field.component.spec.ts +0 -21
  241. package/src/form-fields/hidden-field/hidden-field.component.ts +0 -156
  242. package/src/form-fields/iframe-fields/iframe-fields.component.html +0 -31
  243. package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
  244. package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +0 -21
  245. package/src/form-fields/iframe-fields/iframe-fields.component.ts +0 -225
  246. package/src/form-fields/location-fields/location-fields.component.html +0 -54
  247. package/src/form-fields/location-fields/location-fields.component.scss +0 -22
  248. package/src/form-fields/location-fields/location-fields.component.spec.ts +0 -21
  249. package/src/form-fields/location-fields/location-fields.component.ts +0 -83
  250. package/src/form-fields/mail-fields/mail-fields.component.html +0 -66
  251. package/src/form-fields/mail-fields/mail-fields.component.scss +0 -10
  252. package/src/form-fields/mail-fields/mail-fields.component.spec.ts +0 -21
  253. package/src/form-fields/mail-fields/mail-fields.component.ts +0 -127
  254. package/src/form-fields/mobile-fields/mobile-fields.component.html +0 -97
  255. package/src/form-fields/mobile-fields/mobile-fields.component.scss +0 -52
  256. package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +0 -21
  257. package/src/form-fields/mobile-fields/mobile-fields.component.ts +0 -310
  258. package/src/form-fields/number-fields/number-fields.component.html +0 -70
  259. package/src/form-fields/number-fields/number-fields.component.scss +0 -17
  260. package/src/form-fields/number-fields/number-fields.component.spec.ts +0 -21
  261. package/src/form-fields/number-fields/number-fields.component.ts +0 -256
  262. package/src/form-fields/password-fields/password-fields.component.html +0 -113
  263. package/src/form-fields/password-fields/password-fields.component.scss +0 -61
  264. package/src/form-fields/password-fields/password-fields.component.spec.ts +0 -21
  265. package/src/form-fields/password-fields/password-fields.component.ts +0 -273
  266. package/src/form-fields/radio-button-fields/radio-button-fields.component.html +0 -82
  267. package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +0 -28
  268. package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +0 -21
  269. package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +0 -391
  270. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +0 -67
  271. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +0 -23
  272. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +0 -21
  273. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +0 -145
  274. package/src/form-fields/section-fields/section-fields.component.html +0 -4
  275. package/src/form-fields/section-fields/section-fields.component.scss +0 -37
  276. package/src/form-fields/section-fields/section-fields.component.spec.ts +0 -21
  277. package/src/form-fields/section-fields/section-fields.component.ts +0 -25
  278. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +0 -93
  279. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +0 -52
  280. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +0 -21
  281. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +0 -155
  282. package/src/form-fields/signature-fields/signature-fields.component.html +0 -43
  283. package/src/form-fields/signature-fields/signature-fields.component.scss +0 -10
  284. package/src/form-fields/signature-fields/signature-fields.component.spec.ts +0 -21
  285. package/src/form-fields/signature-fields/signature-fields.component.ts +0 -25
  286. package/src/form-fields/slider-fields/slider-fields.component.html +0 -67
  287. package/src/form-fields/slider-fields/slider-fields.component.scss +0 -55
  288. package/src/form-fields/slider-fields/slider-fields.component.spec.ts +0 -21
  289. package/src/form-fields/slider-fields/slider-fields.component.ts +0 -63
  290. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +0 -52
  291. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +0 -85
  292. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +0 -21
  293. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +0 -62
  294. package/src/form-fields/text-area-fields/text-area-fields.component.html +0 -68
  295. package/src/form-fields/text-area-fields/text-area-fields.component.scss +0 -19
  296. package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +0 -21
  297. package/src/form-fields/text-area-fields/text-area-fields.component.ts +0 -166
  298. package/src/form-fields/text-fields/text-fields.component.html +0 -67
  299. package/src/form-fields/text-fields/text-fields.component.scss +0 -26
  300. package/src/form-fields/text-fields/text-fields.component.spec.ts +0 -21
  301. package/src/form-fields/text-fields/text-fields.component.ts +0 -248
  302. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +0 -70
  303. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +0 -112
  304. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +0 -21
  305. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +0 -74
  306. package/src/form-fields/url-fields/url-fields.component.html +0 -109
  307. package/src/form-fields/url-fields/url-fields.component.scss +0 -22
  308. package/src/form-fields/url-fields/url-fields.component.spec.ts +0 -21
  309. package/src/form-fields/url-fields/url-fields.component.ts +0 -123
  310. package/src/form-submission/form-submission.module.ts +0 -40
  311. package/src/form-submission/header/header.component.html +0 -6
  312. package/src/form-submission/header/header.component.scss +0 -26
  313. package/src/form-submission/header/header.component.spec.ts +0 -21
  314. package/src/form-submission/header/header.component.ts +0 -12
  315. package/src/form-submission/navigation-tabs/navigation-tabs.component.html +0 -134
  316. package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +0 -200
  317. package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +0 -21
  318. package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +0 -134
  319. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +0 -207
  320. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +0 -208
  321. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +0 -21
  322. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +0 -74
  323. package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +0 -60
  324. package/src/form-submission/save-as-draft/saveDraftModalComponent.html +0 -33
  325. package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +0 -195
  326. package/src/form-submission/submission-container/submission-container.component.html +0 -30
  327. package/src/form-submission/submission-container/submission-container.component.scss +0 -67
  328. package/src/form-submission/submission-container/submission-container.component.spec.ts +0 -21
  329. package/src/form-submission/submission-container/submission-container.component.ts +0 -14
  330. package/src/form-submission/submit-form/submit-form.component.html +0 -76
  331. package/src/form-submission/submit-form/submit-form.component.scss +0 -88
  332. package/src/form-submission/submit-form/submit-form.component.spec.ts +0 -21
  333. package/src/form-submission/submit-form/submit-form.component.ts +0 -1953
  334. package/src/lib/form-submission.component.html +0 -15
  335. package/src/lib/form-submission.component.scss +0 -1
  336. package/src/lib/form-submission.component.ts +0 -120
  337. package/src/lib/form-submission.module.ts +0 -31
  338. package/src/lib/form-submission.service.spec.ts +0 -16
  339. package/src/lib/form-submission.service.ts +0 -9
  340. package/src/models/aggregate.model.ts +0 -4
  341. package/src/models/appearance.model.ts +0 -64
  342. package/src/models/elementOptionAPI.model.ts +0 -13
  343. package/src/models/elementOptionAPIData.model.ts +0 -5
  344. package/src/models/elementOptionDB.model.ts +0 -9
  345. package/src/models/elementOptionDBCriteria.model.ts +0 -7
  346. package/src/models/enum/elementType .enum.ts +0 -22
  347. package/src/models/enum/entityType.enum.ts +0 -10
  348. package/src/models/logic.model.ts +0 -11
  349. package/src/models/multifields.model.ts +0 -12
  350. package/src/models/page.model.ts +0 -7
  351. package/src/models/publicForm.model.ts +0 -19
  352. package/src/models/question.model.ts +0 -27
  353. package/src/models/questionAnswer.model.ts +0 -8
  354. package/src/models/questionGroup.model.ts +0 -12
  355. package/src/models/response.model.ts +0 -9
  356. package/src/models/result.model.ts +0 -5
  357. package/src/models/scoring.model.ts +0 -10
  358. package/src/models/section.model.ts +0 -6
  359. package/src/models/subForm.model.ts +0 -25
  360. package/src/models/subformConfiguration.model.ts +0 -4
  361. package/src/models/subformPropery.model.ts +0 -8
  362. package/src/models/validation.model.ts +0 -48
  363. package/src/models/whenClause.model.ts +0 -7
  364. package/src/question/card-subform/card-subform.component.html +0 -282
  365. package/src/question/card-subform/card-subform.component.scss +0 -49
  366. package/src/question/card-subform/card-subform.component.spec.ts +0 -21
  367. package/src/question/card-subform/card-subform.component.ts +0 -407
  368. package/src/question/confirm-dialog/confirm-dialog.component.html +0 -32
  369. package/src/question/confirm-dialog/confirm-dialog.component.scss +0 -109
  370. package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +0 -21
  371. package/src/question/confirm-dialog/confirm-dialog.component.ts +0 -24
  372. package/src/question/form-elements/form-elements.component.html +0 -28
  373. package/src/question/form-elements/form-elements.component.scss +0 -0
  374. package/src/question/form-elements/form-elements.component.spec.ts +0 -21
  375. package/src/question/form-elements/form-elements.component.ts +0 -41
  376. package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +0 -321
  377. package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +0 -78
  378. package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +0 -21
  379. package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +0 -425
  380. package/src/question/multifields/multifields.component.html +0 -78
  381. package/src/question/multifields/multifields.component.scss +0 -6
  382. package/src/question/multifields/multifields.component.spec.ts +0 -21
  383. package/src/question/multifields/multifields.component.ts +0 -27
  384. package/src/question/multiple-subform/multiple-subform.component.html +0 -185
  385. package/src/question/multiple-subform/multiple-subform.component.scss +0 -52
  386. package/src/question/multiple-subform/multiple-subform.component.spec.ts +0 -21
  387. package/src/question/multiple-subform/multiple-subform.component.ts +0 -481
  388. package/src/question/question/question.component.html +0 -51
  389. package/src/question/question/question.component.scss +0 -0
  390. package/src/question/question/question.component.spec.ts +0 -21
  391. package/src/question/question/question.component.ts +0 -129
  392. package/src/question/question-group/question-group.component.html +0 -147
  393. package/src/question/question-group/question-group.component.scss +0 -36
  394. package/src/question/question-group/question-group.component.spec.ts +0 -21
  395. package/src/question/question-group/question-group.component.ts +0 -94
  396. package/src/question/question.module.ts +0 -22
  397. package/src/question/recursive-logic/recursive-logic.component.html +0 -33
  398. package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
  399. package/src/question/recursive-logic/recursive-logic.component.spec.ts +0 -21
  400. package/src/question/recursive-logic/recursive-logic.component.ts +0 -29
  401. package/src/question/sub-form/sub-form.component.html +0 -254
  402. package/src/question/sub-form/sub-form.component.scss +0 -83
  403. package/src/question/sub-form/sub-form.component.spec.ts +0 -21
  404. package/src/question/sub-form/sub-form.component.ts +0 -421
  405. package/src/services/aggregate.service.ts +0 -148
  406. package/src/services/countryService.ts +0 -92
  407. package/src/services/data.service.ts +0 -36
  408. package/src/services/element-tracker.service.spec.ts +0 -16
  409. package/src/services/element-tracker.service.ts +0 -24
  410. package/src/services/form-validation.service.ts +0 -151
  411. package/src/services/form.service.spec.ts +0 -16
  412. package/src/services/form.service.ts +0 -407
  413. package/src/services/mapper.service.ts +0 -625
  414. package/src/services/recaptcha.service.spec.ts +0 -16
  415. package/src/services/recaptcha.service.ts +0 -179
  416. package/src/services/score.service.ts +0 -352
  417. package/src/services/subform-copy.service.ts +0 -148
  418. package/src/services/validation.service.spec.ts +0 -16
  419. package/src/services/validation.service.ts +0 -33
  420. package/src/services/whenClause.service.ts +0 -502
  421. package/src/shared/shared.module.ts +0 -58
  422. package/src/styles/shared-style.scss +0 -86
  423. package/src/sub-form/sub-form.module.ts +0 -24
  424. package/src/sub-form/submission-modal/submission-modal.component.html +0 -160
  425. package/src/sub-form/submission-modal/submission-modal.component.scss +0 -54
  426. package/src/sub-form/submission-modal/submission-modal.component.spec.ts +0 -21
  427. package/src/sub-form/submission-modal/submission-modal.component.ts +0 -127
  428. package/tsconfig.lib.json +0 -14
  429. package/tsconfig.lib.prod.json +0 -10
  430. package/tsconfig.spec.json +0 -14
  431. /package/{src/assets → assets}/fonts/Garamond.woff2 +0 -0
  432. /package/{src/assets → assets}/fonts/Georgia.woff2 +0 -0
  433. /package/{src/assets → assets}/fonts/Poppins.woff2 +0 -0
  434. /package/{src/assets → assets}/fonts/Tahoma.woff2 +0 -0
  435. /package/{src/assets → assets}/fonts/Tajawal.woff2 +0 -0
  436. /package/{src/assets → assets}/fonts/Verdana.woff2 +0 -0
  437. /package/{src/assets → assets}/icons/close-sidebar-mark-icon.svg +0 -0
  438. /package/{src/assets → assets}/icons/copy-icon.svg +0 -0
  439. /package/{src/assets → assets}/icons/delete-icon.svg +0 -0
  440. /package/{src/assets → assets}/icons/delete-no-outline-icon.svg +0 -0
  441. /package/{src/assets → assets}/icons/left_arrow.svg +0 -0
  442. /package/{src/assets → assets}/icons/right_arrow.svg +0 -0
@@ -1,179 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable } from '@angular/core';
3
- import { ToastrService } from 'ngx-toastr';
4
- import { map, Observable } from 'rxjs';
5
- import { DataService } from './data.service';
6
-
7
- declare global {
8
- interface Window {
9
- onRecaptchaLoadCallback: () => void;
10
- }
11
-
12
- var grecaptcha: {
13
- ready: (callback: () => void) => void;
14
- render: (
15
- container: string | HTMLElement,
16
- parameters: {
17
- sitekey: string;
18
- callback?: (token: string) => void;
19
- 'expired-callback'?: () => void;
20
- 'error-callback'?: () => void;
21
- size?: 'normal' | 'compact' | 'invisible';
22
- theme?: 'light' | 'dark';
23
- }
24
- ) => number;
25
- execute: (widgetId?: number) => void;
26
- getResponse: (widgetId?: number) => string;
27
- reset: (widgetId?: number) => void;
28
- };
29
- }
30
-
31
- @Injectable({
32
- providedIn: 'root',
33
- })
34
- export class RecaptchaService {
35
- private siteKey = '';
36
- private apiUrl: string = '';
37
- private widgetId: number | null = null;
38
- private initialized = false;
39
- private resolved = false;
40
-
41
- constructor(private toastr: ToastrService,private http: HttpClient, private dataService: DataService) {
42
- this.dataService.apiUrl$.subscribe((data) => {
43
- this.apiUrl = data;
44
- });
45
-
46
- }
47
-
48
- ngOnInit() {
49
- this.fetchSiteKeyFromApi().subscribe({
50
- next: (key) => (this.siteKey = key),
51
- error: () => this.toastr.error('Failed to load CAPTCHA config')
52
- });
53
- }
54
-
55
-
56
-
57
- fetchSiteKeyFromApi(): Observable<string> {
58
-
59
- return this.http.get<{ message: string }>(`${this.apiUrl}/api/application-settings/recaptcha/siteKey`).pipe(
60
- map((response: { message: string }) => {
61
- const siteKey = response.message;
62
- return siteKey;
63
- })
64
- );
65
- }
66
-
67
- initialize(): Promise<void> {
68
- if(!this.siteKey || this.siteKey === '') {
69
- this.fetchSiteKeyFromApi().subscribe({
70
- next: (key) => (this.siteKey = key),
71
- error: () => this.toastr.error('Failed to load CAPTCHA config')
72
- });
73
- }
74
-
75
-
76
- return new Promise((resolve, reject) => {
77
- if (this.widgetId !== null) {
78
- resolve();
79
- return;
80
- }
81
- if (this.initialized && typeof grecaptcha !== 'undefined' && typeof grecaptcha.render === 'function') {
82
- resolve();
83
- return;
84
- }
85
-
86
- const existingScript = document.querySelector('script[src*="recaptcha/api.js"]');
87
- if (existingScript) {
88
- existingScript.addEventListener('load', () => resolve());
89
- resolve();
90
- return;
91
- }
92
-
93
- const script = document.createElement('script');
94
- script.src = 'https://www.google.com/recaptcha/api.js?onload=onRecaptchaLoadCallback&render=explicit';
95
- script.async = true;
96
- script.defer = true;
97
-
98
- window.onRecaptchaLoadCallback = () => {
99
- this.initialized = true;
100
- resolve();
101
- };
102
-
103
- script.onerror = () => {
104
- reject('Failed to load reCAPTCHA script');
105
- };
106
-
107
- document.head.appendChild(script);
108
- });
109
- }
110
-
111
- render(containerId: string, callback: (token: string) => void): void {
112
- if (typeof grecaptcha === 'undefined') {
113
- throw new Error('reCAPTCHA is not loaded');
114
- }
115
-
116
- // ✅ Prevent rendering more than once
117
- if (this.widgetId !== null) {
118
- console.warn('reCAPTCHA already rendered, skipping render.');
119
- return;
120
- }
121
-
122
- this.widgetId = grecaptcha.render(containerId, {
123
- sitekey: this.siteKey,
124
- callback: (token: string) => {
125
- this.resolved = true;
126
- callback(token);
127
- },
128
- 'expired-callback': () => {
129
- this.resolved = false;
130
- this.toastr.warning('reCAPTCHA expired, please verify again');
131
- },
132
- 'error-callback': () => {
133
- this.resolved = false;
134
- this.toastr.error('reCAPTCHA error occurred');
135
- },
136
- size: 'normal',
137
- theme: 'light',
138
- });
139
- }
140
-
141
-
142
- reset(): void {
143
- if (typeof grecaptcha !== 'undefined' && this.widgetId !== null) {
144
- grecaptcha.reset(this.widgetId);
145
- this.resolved = false;
146
- }
147
- }
148
-
149
- getResponse(): string {
150
- if (typeof grecaptcha === 'undefined' || this.widgetId === null) {
151
- return '';
152
- }
153
- return grecaptcha.getResponse(this.widgetId);
154
- }
155
-
156
- isRendered(): boolean {
157
- return this.widgetId !== null;
158
- }
159
-
160
- isResolved(): boolean {
161
- return this.resolved && !!this.getResponse();
162
- }
163
-
164
- removeRecaptchaScript(): void {
165
- const script = document.querySelector('script[src*="recaptcha/api.js"]');
166
- if (script) {
167
- script.remove();
168
- }
169
-
170
- const badge = document.querySelector('.grecaptcha-badge');
171
- if (badge) {
172
- badge.remove();
173
- }
174
-
175
- this.widgetId = null;
176
- this.initialized = false;
177
- this.resolved = false;
178
- }
179
- }
@@ -1,352 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Answer } from '../models/answer.model';
3
- import { Submission } from '../models/submission.model';
4
-
5
- interface SubmissionScore {
6
- scoreType: string;
7
- score: number;
8
- }
9
-
10
- @Injectable({
11
- providedIn: 'root'
12
- })
13
- export class ScoreCalculationService {
14
- constructor() {}
15
-
16
- calculateScoreFromAnswer(
17
- newAnswer: string[] | string,
18
- question: any
19
- ): { scores: { scoreType: string; score: number }[] } | null {
20
-
21
- const scoring = question?.formElement?.scoring;
22
- if (!scoring || !scoring.enableScoring || !newAnswer || (Array.isArray(newAnswer) && newAnswer.length === 0)) {
23
- return null;
24
- }
25
-
26
- const defaultScore = scoring.defaultScore ?? 0;
27
- const scoreRules = scoring.score || [];
28
-
29
- const answers = Array.isArray(newAnswer) ? newAnswer : [newAnswer];
30
-
31
- // If scoringType is NOT enabled, behave like the old logic
32
- if (!scoring.enableScoringType) {
33
- let totalScore = 0;
34
- const scoreByOption: Record<string, number> = {};
35
-
36
- for (const answer of answers) {
37
- const value = answer.split('|')[1]; // Extract actual value
38
- const matchingScore = scoreRules.find((rule: any) => rule.label.includes(value));
39
-
40
- if (matchingScore && typeof matchingScore.score === 'number') {
41
- scoreByOption[answer] = matchingScore.score;
42
- totalScore += matchingScore.score;
43
- } else {
44
- scoreByOption[answer] = defaultScore;
45
- totalScore += defaultScore;
46
- }
47
- }
48
-
49
- return { scores: [{ scoreType: 'NOT_APPLICABLE', score:totalScore }] };
50
- }
51
-
52
- // ✅ Scoring Type ENABLED → separate Good/Bad scoring
53
- const groupedScores: Record<string, number> = {};
54
-
55
- for (const answer of answers) {
56
- const value = answer.split('|')[1];
57
- const matchingScore = scoreRules.find((rule: any) => rule.label.includes(value));
58
-
59
- if (matchingScore && typeof matchingScore.score === 'number') {
60
- const type = matchingScore.scoreType || 'NOT_APPLICABLE';
61
- groupedScores[type] = (groupedScores[type] || 0) + matchingScore.score;
62
- } else {
63
- // if no matching score, add default under NOT_APPLICABLE
64
- groupedScores['NOT_APPLICABLE'] = (groupedScores['NOT_APPLICABLE'] || 0) + defaultScore;
65
- }
66
- }
67
-
68
- // Convert grouped results into required array format
69
- const resultScores = Object.keys(groupedScores).map((type) => ({
70
- scoreType:type,
71
- score: groupedScores[type],
72
- }));
73
-
74
- return { scores: resultScores };
75
- }
76
-
77
-
78
- getMaxPossibleScore(subform: any): { goodMax: number; badMax: number } {
79
- let goodMaxProduct = 1;
80
- let badMaxProduct = 1;
81
-
82
- subform.rows.forEach((row: any) => {
83
- row.grid.forEach((gridItem: any) => {
84
- if (gridItem.entityType === "QUESTION") {
85
- const element = gridItem.element;
86
- const formElement = element?.formElement;
87
-
88
- if (
89
- formElement?.elementType === "DROP_DOWN" &&
90
- formElement?.scoring?.enableScoring &&
91
- Array.isArray(formElement.scoring.score)
92
- ) {
93
- // ---- GOOD SCORE CALC ----
94
- let maxGoodForQuestion = 0;
95
- const goodScores = formElement.scoring.score.filter(
96
- (s: any) => s.scoreType === "GOOD_SCORE"
97
- );
98
-
99
- if (formElement.appearance?.selectionType === "SINGLE") {
100
- if (goodScores.length > 0) {
101
- // Pick max abs, but return real value
102
- const maxAbs = goodScores.reduce(
103
- (max: any, s: any) =>
104
- Math.abs(s.score ?? 0) > Math.abs(max.score ?? 0) ? s : max,
105
- { score: 0 }
106
- );
107
- maxGoodForQuestion = maxAbs.score ?? 0;
108
- } else {
109
- maxGoodForQuestion = Math.max(
110
- ...formElement.scoring.score.map((s: any) => s.score ?? 0)
111
- );
112
- }
113
- } else if (formElement.appearance?.selectionType === "MULTIPLE") {
114
- const maxSelection = formElement.validation?.maximumSelection;
115
-
116
- if (maxSelection && maxSelection > 0) {
117
- const labelScores: number[] = [];
118
- const src = goodScores.length > 0 ? goodScores : formElement.scoring.score;
119
-
120
- src.forEach((s: any) => {
121
- const scoreValue = s.score ?? 0;
122
- const count = s.label?.length ?? 0;
123
- for (let i = 0; i < count; i++) {
124
- labelScores.push(scoreValue);
125
- }
126
- });
127
-
128
- labelScores.sort((a, b) => Math.abs(b) - Math.abs(a));
129
- maxGoodForQuestion = labelScores
130
- .slice(0, maxSelection)
131
- .reduce((sum, score) => sum + score, 0);
132
- } else {
133
- maxGoodForQuestion = formElement.scoring.score.reduce(
134
- (sum: number, s: any) =>
135
- sum + (s.score ?? 0) * (s.label?.length ?? 0),
136
- 0
137
- );
138
- }
139
- }
140
-
141
- // ---- BAD SCORE CALC ----
142
- let maxBadForQuestion = 0;
143
- const badScores = formElement.scoring.score.filter(
144
- (s: any) => s.scoreType === "BAD_SCORE"
145
- );
146
-
147
- if (formElement.appearance?.selectionType === "SINGLE") {
148
- if (badScores.length > 0) {
149
- maxBadForQuestion = Math.max(
150
- ...badScores.map((s: any) => s.score ?? 0)
151
- );
152
- } else {
153
- maxBadForQuestion = Math.max(
154
- ...formElement.scoring.score.map((s: any) => s.score ?? 0)
155
- );
156
- }
157
- } else if (formElement.appearance?.selectionType === "MULTIPLE") {
158
- const maxSelection = formElement.validation?.maximumSelection;
159
-
160
- if (maxSelection && maxSelection > 0) {
161
- const labelScores: number[] = [];
162
- const src = badScores.length > 0 ? badScores : formElement.scoring.score;
163
-
164
- src.forEach((s: any) => {
165
- const scoreValue = s.score ?? 0;
166
- const count = s.label?.length ?? 0;
167
- for (let i = 0; i < count; i++) {
168
- labelScores.push(scoreValue);
169
- }
170
- });
171
-
172
- labelScores.sort((a, b) => b - a);
173
- maxBadForQuestion = labelScores
174
- .slice(0, maxSelection)
175
- .reduce((sum, score) => sum + score, 0);
176
- } else {
177
- maxBadForQuestion = formElement.scoring.score.reduce(
178
- (sum: number, s: any) =>
179
- sum + (s.score ?? 0) * (s.label?.length ?? 0),
180
- 0
181
- );
182
- }
183
- }
184
-
185
- goodMaxProduct *= maxGoodForQuestion;
186
- badMaxProduct *= maxBadForQuestion;
187
- }
188
- }
189
- });
190
- });
191
-
192
- return { goodMax: goodMaxProduct, badMax: badMaxProduct };
193
- }
194
-
195
-
196
-
197
-
198
- calculateSubmissionScore = (answers: Answer[], enableScoringType = true): SubmissionScore[] => {
199
- let submissionScoreType: string | null = null;
200
- let totalScore = 1;
201
- for (const ans of answers) {
202
- if (!ans.scores) continue;
203
-
204
- for (const s of ans.scores) {
205
- // ✅ Always add scores (ignore type during summation)
206
- totalScore *= s.score ?? 1;
207
-
208
- // ✅ Decide submission-level scoreType
209
- if (enableScoringType) {
210
- if (s.scoreType === "GOOD_SCORE") {
211
- submissionScoreType = "GOOD_SCORE";
212
- } else if (s.scoreType === "BAD_SCORE") {
213
- submissionScoreType = "BAD_SCORE";
214
- }
215
- } else if (s.scoreType === "NOT_APPLICABLE") {
216
- submissionScoreType = "NOT_APPLICABLE";
217
- }
218
- }
219
- }
220
-
221
- // ✅ Default type if none found
222
- if (!submissionScoreType) {
223
- submissionScoreType = enableScoringType ? "GOOD_SCORE" : "NOT_APPLICABLE";
224
- }
225
-
226
- return [
227
- {
228
- scoreType: submissionScoreType,
229
- score: totalScore,
230
- },
231
- ];
232
- };
233
-
234
- calculateFinalScore(
235
- submissions: Submission[],
236
- maxPossibleGoodScore: number,
237
- maxPossibleBadScore: number
238
- ): SubmissionScore[] {
239
- let totalGood = 0;
240
- let totalBad = 0;
241
-
242
- const hasGood = (s: Submission) => s.scores?.some(x => x.scoreType === 'GOOD_SCORE');
243
- const hasBad = (s: Submission) => s.scores?.some(x => x.scoreType === 'BAD_SCORE');
244
-
245
- const goodCount = submissions.filter(hasGood).length;
246
- const badCount = submissions.filter(hasBad).length;
247
-
248
- for (const sub of submissions) {
249
- if (!sub.scores) continue;
250
- for (const s of sub.scores) {
251
- if (s.scoreType === 'GOOD_SCORE') totalGood += s.score ?? 0;
252
- if (s.scoreType === 'BAD_SCORE') totalBad += s.score ?? 0;
253
- }
254
- }
255
-
256
- const totalSubmissions = submissions.length;
257
-
258
- const maxGood = totalSubmissions * maxPossibleGoodScore;
259
- const maxBad = totalSubmissions * maxPossibleBadScore;
260
-
261
- const result: SubmissionScore[] = [];
262
-
263
- // use !== 0 (not > 0) because maxGood may be negative by design
264
- if (goodCount > 0 && maxGood !== 0) {
265
- result.push({
266
- scoreType: 'GOOD_SCORE',
267
- score: Math.round(100 - (totalGood / maxGood) * 100)
268
- });
269
- }
270
-
271
- if (badCount > 0 && maxBad !== 0) {
272
- result.push({
273
- scoreType: 'BAD_SCORE',
274
- score: Math.round(100 - (totalBad / maxBad) * 100)
275
- });
276
- }
277
-
278
- return result;
279
- }
280
-
281
-
282
-
283
- getMaxPossibleScoreForQuestion(question: any): number {
284
- const formElement = question?.formElement;
285
-
286
- if (
287
- !formElement?.scoring?.enableScoring ||
288
- !Array.isArray(formElement.scoring.score)
289
- ) {
290
- return 0; // No scoring or invalid config
291
- }
292
-
293
- let maxScoreForQuestion = 0;
294
-
295
- if (formElement.appearance?.selectionType === "SINGLE") {
296
- // For single selection: take the highest score
297
- maxScoreForQuestion = Math.max(
298
- ...formElement.scoring.score.map((s: any) => s.score ?? 0)
299
- );
300
- }
301
- else if (formElement.appearance?.selectionType === "MULTIPLE") {
302
- const maxSelection = formElement.validation?.maximumSelection;
303
-
304
- if (maxSelection && maxSelection > 0) {
305
- // Flatten scores per label
306
- const labelScores: number[] = [];
307
- formElement.scoring.score.forEach((s: any) => {
308
- const scoreValue = s.score ?? 0;
309
- const count = s.label?.length ?? 0;
310
- for (let i = 0; i < count; i++) {
311
- labelScores.push(scoreValue);
312
- }
313
- });
314
-
315
- // Sort descending & take top N
316
- labelScores.sort((a, b) => b - a);
317
- maxScoreForQuestion = labelScores
318
- .slice(0, maxSelection)
319
- .reduce((sum, score) => sum + score, 0);
320
- } else {
321
- // Sum all scores × label count
322
- maxScoreForQuestion = formElement.scoring.score.reduce(
323
- (sum: number, s: any) =>
324
- sum + (s.score ?? 0) * (s.label?.length ?? 0),
325
- 0
326
- );
327
- }
328
- }
329
- return maxScoreForQuestion;
330
- }
331
-
332
-
333
- shouldCalculateScore(subForm: any, submission: any): boolean {
334
- // Get all dropdown-like questions in subform that have scoring enabled
335
- const scoringQuestions = subForm.rows
336
- .flatMap((row: any) => row.grid)
337
- .filter((g: any) => g.entityType === 'QUESTION')
338
- .map((g: any) => g.element)
339
- .filter((q: any) =>
340
- q.formElement &&
341
- ['DROP_DOWN', 'RADIO_BUTTON', 'CHECK_BOX'].includes(q.formElement.elementType) &&
342
- q.formElement.scoring?.enableScoring
343
- );
344
-
345
- // Check if all scoring-enabled dropdown questions are answered in submission
346
- return scoringQuestions.every((q: any) => {
347
- const ans = submission.answers.find((a: any) => a.questionId === q.id);
348
- return ans && ans.answer !== '' && !(Array.isArray(ans.answer) && ans.answer.length === 0);
349
- });
350
- }
351
-
352
- }
@@ -1,148 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { v4 as uuidv4 } from 'uuid';
3
-
4
- @Injectable({
5
- providedIn: 'root',
6
- })
7
- export class SubformCopyService {
8
- copySubform(subForm: any, pages: any[]): { updatedPages: any[] } {
9
- const questionRelation: Record<string, string> = {};
10
- const copiedSubform = this.deepCopyWithNewIds(subForm, questionRelation);
11
-
12
- // Attach copy metadata directly inside the copied subform
13
- copiedSubform.copySubformMeta = {
14
- id: copiedSubform.id,
15
- title: '',
16
- description: '',
17
- parentSubform: subForm.id,
18
- questionRelation,
19
- };
20
-
21
- if (!subForm.copiedForms) {
22
- subForm.copiedForms = [];
23
- }
24
- subForm.copiedForms.push(copiedSubform.id);
25
-
26
- const page = this.findPageContainingSubform(subForm.id, pages);
27
-
28
- if (page) {
29
- const rowIndex = page.rows.findIndex((row: any) =>
30
- row.grid.some((grid: any) =>
31
- grid.entityType === 'SUBFORM' && grid.element.id === subForm.id
32
- )
33
- );
34
- copiedSubform.submissions = [];
35
- copiedSubform.score = null;
36
- if (rowIndex !== -1) {
37
- const newSubformGrid = {
38
- entityType: 'SUBFORM',
39
- element: copiedSubform,
40
- show: true
41
- };
42
-
43
- page.rows.splice(rowIndex + 1, 0, {
44
- grid: [newSubformGrid],
45
- });
46
- }
47
- }
48
-
49
- return {
50
- updatedPages: pages
51
- };
52
- }
53
-
54
- private deepCopyWithNewIds(subform: any, questionRelation: Record<string, string>): any {
55
- const idMap: Map<string, string> = new Map();
56
-
57
- const replaceIds = (obj: any): any => {
58
- if (Array.isArray(obj)) {
59
- return obj.map(replaceIds);
60
- } else if (obj !== null && typeof obj === 'object') {
61
- const newObj: any = {};
62
- for (const key of Object.keys(obj)) {
63
- const value = obj[key];
64
-
65
- if (key === 'id' && typeof value === 'string') {
66
- if (!idMap.has(value)) {
67
- idMap.set(value, uuidv4());
68
- }
69
- newObj[key] = idMap.get(value);
70
- } else {
71
- newObj[key] = replaceIds(value);
72
- }
73
- }
74
-
75
- // ✅ Now handle answer reset and questionRelation mapping
76
- if (
77
- obj.entityType === 'QUESTION' &&
78
- obj.element &&
79
- typeof obj.element.id === 'string'
80
- ) {
81
- const originalQuestionId = obj.element.id;
82
- const newQuestionId = newObj.element?.id;
83
-
84
- if (originalQuestionId && newQuestionId) {
85
- questionRelation[newQuestionId] = originalQuestionId;
86
- }
87
-
88
- // ✅ Reset answer here
89
- if (newObj.element) {
90
- newObj.element.answer = '';
91
- newObj.element.files = '';
92
- }
93
- }
94
-
95
- return newObj;
96
- }
97
-
98
- return obj;
99
- };
100
-
101
-
102
- const getCircularReplacer = () => {
103
- const seen = new WeakSet();
104
- return (_key: string, value: any) => {
105
- if (typeof value === "object" && value !== null) {
106
- if (seen.has(value)) {
107
- return undefined;
108
- }
109
- seen.add(value);
110
- }
111
- return value;
112
- };
113
- };
114
-
115
- const copied = replaceIds(JSON.parse(JSON.stringify(subform, getCircularReplacer())));
116
- if (
117
- copied.defaultAnswers &&
118
- Array.isArray(copied.defaultAnswers.answers)
119
- ) {
120
- copied.defaultAnswers.answers.forEach((answerBlock: any) => {
121
- if (Array.isArray(answerBlock.defaultQuestionsAnswers)) {
122
- answerBlock.defaultQuestionsAnswers.forEach((dqAnswer: any) => {
123
- const oldQId = dqAnswer.questionId;
124
- if (idMap.has(oldQId)) {
125
- dqAnswer.questionId = idMap.get(oldQId);
126
- }
127
- });
128
- }
129
- });
130
- }
131
-
132
- copied.copied = true;
133
- return copied;
134
- }
135
-
136
- private findPageContainingSubform(subformId: string, pages: any[]): any {
137
- return pages.find((page: any) =>
138
- page.rows.some((row: any) =>
139
- row.grid.some(
140
- (grid: any) =>
141
- grid.entityType === 'SUBFORM' &&
142
- grid.element &&
143
- grid.element.id === subformId
144
- )
145
- )
146
- );
147
- }
148
- }
@@ -1,16 +0,0 @@
1
- import { TestBed } from '@angular/core/testing';
2
-
3
- import { ValidationService } from './validation.service';
4
-
5
- describe('ValidationService', () => {
6
- let service: ValidationService;
7
-
8
- beforeEach(() => {
9
- TestBed.configureTestingModule({});
10
- service = TestBed.inject(ValidationService);
11
- });
12
-
13
- it('should be created', () => {
14
- expect(service).toBeTruthy();
15
- });
16
- });