@10x-media/form-builder 0.1.0-beta.4 → 0.1.0-beta.6

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 (372) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/README.md +3 -3
  3. package/dist/actions/body/serializeBody.d.ts +8 -5
  4. package/dist/actions/body/serializeBody.js.map +1 -1
  5. package/dist/actions/body/textOfBody.d.ts +13 -0
  6. package/dist/actions/body/textOfBody.js +35 -0
  7. package/dist/actions/body/textOfBody.js.map +1 -0
  8. package/dist/actions/builtin/confirmation.js +81 -48
  9. package/dist/actions/builtin/confirmation.js.map +1 -1
  10. package/dist/actions/builtin/emailTeam.js +67 -38
  11. package/dist/actions/builtin/emailTeam.js.map +1 -1
  12. package/dist/actions/builtin/index.d.ts +9 -3
  13. package/dist/actions/builtin/index.js +8 -5
  14. package/dist/actions/builtin/index.js.map +1 -1
  15. package/dist/actions/defineAction.d.ts +1 -1
  16. package/dist/actions/emailRecipients.d.ts +12 -0
  17. package/dist/actions/emailRecipients.js +72 -0
  18. package/dist/actions/emailRecipients.js.map +1 -0
  19. package/dist/actions/fromAddresses.d.ts +21 -0
  20. package/dist/actions/fromAddresses.js +74 -0
  21. package/dist/actions/fromAddresses.js.map +1 -0
  22. package/dist/actions/task.js +9 -8
  23. package/dist/actions/task.js.map +1 -1
  24. package/dist/aggregation/aggregateResponses.d.ts +9 -0
  25. package/dist/aggregation/aggregateResponses.js +8 -14
  26. package/dist/aggregation/aggregateResponses.js.map +1 -1
  27. package/dist/aggregation/resolveResultsRequest.d.ts +19 -6
  28. package/dist/aggregation/resolveResultsRequest.js +58 -12
  29. package/dist/aggregation/resolveResultsRequest.js.map +1 -1
  30. package/dist/calc/computeCalcFields.js +2 -1
  31. package/dist/calc/computeCalcFields.js.map +1 -1
  32. package/dist/client/ByteSizeField.d.ts +8 -0
  33. package/dist/client/ByteSizeField.js +3 -1
  34. package/dist/client/ByteSizeField.js.map +1 -1
  35. package/dist/client/ClosePollButton.d.ts +15 -0
  36. package/dist/client/ClosePollButton.js +80 -0
  37. package/dist/client/ClosePollButton.js.map +1 -0
  38. package/dist/client/CondensedArray.d.ts +15 -0
  39. package/dist/client/CondensedArray.js +97 -0
  40. package/dist/client/CondensedArray.js.map +1 -0
  41. package/dist/client/ConsentBlockLabel.d.ts +15 -0
  42. package/dist/client/ConsentBlockLabel.js +71 -0
  43. package/dist/client/ConsentBlockLabel.js.map +1 -0
  44. package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
  45. package/dist/client/ConsentSourceRowLabel.js +21 -0
  46. package/dist/client/ConsentSourceRowLabel.js.map +1 -0
  47. package/dist/client/EndpointOptionsSelect.d.ts +46 -0
  48. package/dist/client/EndpointOptionsSelect.js +106 -0
  49. package/dist/client/EndpointOptionsSelect.js.map +1 -0
  50. package/dist/client/FieldBlockLabel.d.ts +18 -0
  51. package/dist/client/FieldBlockLabel.js +34 -0
  52. package/dist/client/FieldBlockLabel.js.map +1 -0
  53. package/dist/client/FieldNameSelect.d.ts +21 -4
  54. package/dist/client/FieldNameSelect.js +29 -15
  55. package/dist/client/FieldNameSelect.js.map +1 -1
  56. package/dist/client/FlowBuilder.d.ts +2 -1
  57. package/dist/client/FlowBuilder.js +63 -57
  58. package/dist/client/FlowBuilder.js.map +1 -1
  59. package/dist/client/RecipientsSelect.d.ts +31 -0
  60. package/dist/client/RecipientsSelect.js +174 -0
  61. package/dist/client/RecipientsSelect.js.map +1 -0
  62. package/dist/client/RuleDescription.d.ts +21 -0
  63. package/dist/client/RuleDescription.js +19 -0
  64. package/dist/client/RuleDescription.js.map +1 -0
  65. package/dist/client/admin.css +41 -0
  66. package/dist/client/endpointOptions.js +29 -0
  67. package/dist/client/endpointOptions.js.map +1 -0
  68. package/dist/client/flowAuthoring.js +114 -7
  69. package/dist/client/flowAuthoring.js.map +1 -1
  70. package/dist/client/synthesizeClientField.js +15 -8
  71. package/dist/client/synthesizeClientField.js.map +1 -1
  72. package/dist/collections/buttonFields.d.ts +34 -0
  73. package/dist/collections/buttonFields.js +35 -0
  74. package/dist/collections/buttonFields.js.map +1 -0
  75. package/dist/collections/cells/FieldCountCell.d.ts +15 -0
  76. package/dist/collections/cells/FieldCountCell.js +18 -0
  77. package/dist/collections/cells/FieldCountCell.js.map +1 -0
  78. package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
  79. package/dist/collections/cells/FlowStepsCell.js +17 -0
  80. package/dist/collections/cells/FlowStepsCell.js.map +1 -0
  81. package/dist/collections/formSubmissions.js +23 -17
  82. package/dist/collections/formSubmissions.js.map +1 -1
  83. package/dist/collections/forms.js +323 -134
  84. package/dist/collections/forms.js.map +1 -1
  85. package/dist/collections/redirectFields.d.ts +29 -0
  86. package/dist/consent/applyConsentStatements.d.ts +14 -0
  87. package/dist/consent/applyConsentStatements.js +17 -0
  88. package/dist/consent/applyConsentStatements.js.map +1 -0
  89. package/dist/consent/captureConsent.d.ts +31 -11
  90. package/dist/consent/captureConsent.js +53 -13
  91. package/dist/consent/captureConsent.js.map +1 -1
  92. package/dist/consent/consentSourcesField.d.ts +62 -0
  93. package/dist/consent/consentSourcesField.js +86 -0
  94. package/dist/consent/consentSourcesField.js.map +1 -0
  95. package/dist/consent/resolveConsentEntries.d.ts +24 -0
  96. package/dist/consent/resolveConsentEntries.js +43 -0
  97. package/dist/consent/resolveConsentEntries.js.map +1 -0
  98. package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
  99. package/dist/consent/resolveConsentSourcesRequest.js +55 -0
  100. package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
  101. package/dist/consent/resolveConsentStatements.d.ts +45 -0
  102. package/dist/consent/resolveConsentStatements.js +44 -0
  103. package/dist/consent/resolveConsentStatements.js.map +1 -0
  104. package/dist/consent/resolvePublishedVersionRef.d.ts +17 -11
  105. package/dist/consent/resolvePublishedVersionRef.js +13 -10
  106. package/dist/consent/resolvePublishedVersionRef.js.map +1 -1
  107. package/dist/consent/types.d.ts +53 -0
  108. package/dist/email/departments.d.ts +59 -0
  109. package/dist/email/departments.js +87 -0
  110. package/dist/email/departments.js.map +1 -0
  111. package/dist/email/departmentsField.d.ts +53 -0
  112. package/dist/email/departmentsField.js +73 -0
  113. package/dist/email/departmentsField.js.map +1 -0
  114. package/dist/exports/client.d.ts +11 -1
  115. package/dist/exports/client.js +11 -1
  116. package/dist/exports/react.d.ts +8 -3
  117. package/dist/exports/react.js +6 -2
  118. package/dist/exports/rsc.d.ts +3 -1
  119. package/dist/exports/rsc.js +4 -2
  120. package/dist/exports/types.d.ts +16 -8
  121. package/dist/fields/buildFieldBlocks.js +28 -13
  122. package/dist/fields/buildFieldBlocks.js.map +1 -1
  123. package/dist/fields/builtin/calculation.js +7 -0
  124. package/dist/fields/builtin/calculation.js.map +1 -1
  125. package/dist/fields/builtin/checkbox.js +8 -0
  126. package/dist/fields/builtin/checkbox.js.map +1 -1
  127. package/dist/fields/builtin/consent.js +32 -21
  128. package/dist/fields/builtin/consent.js.map +1 -1
  129. package/dist/fields/builtin/country.d.ts +13 -0
  130. package/dist/fields/builtin/country.js +30 -0
  131. package/dist/fields/builtin/country.js.map +1 -0
  132. package/dist/fields/builtin/date.js +2 -0
  133. package/dist/fields/builtin/date.js.map +1 -1
  134. package/dist/fields/builtin/file.js +14 -7
  135. package/dist/fields/builtin/file.js.map +1 -1
  136. package/dist/fields/builtin/index.d.ts +8 -6
  137. package/dist/fields/builtin/index.js +12 -11
  138. package/dist/fields/builtin/index.js.map +1 -1
  139. package/dist/fields/builtin/message.js +8 -4
  140. package/dist/fields/builtin/message.js.map +1 -1
  141. package/dist/fields/builtin/repeater.js +1 -0
  142. package/dist/fields/builtin/repeater.js.map +1 -1
  143. package/dist/fields/builtin/select.js +1 -0
  144. package/dist/fields/builtin/select.js.map +1 -1
  145. package/dist/fields/builtin/state.d.ts +13 -0
  146. package/dist/fields/builtin/state.js +30 -0
  147. package/dist/fields/builtin/state.js.map +1 -0
  148. package/dist/fields/data/regions.d.ts +21 -0
  149. package/dist/fields/data/regions.js +1238 -0
  150. package/dist/fields/data/regions.js.map +1 -0
  151. package/dist/fields/fieldKey.d.ts +15 -0
  152. package/dist/fields/fieldKey.js +16 -0
  153. package/dist/fields/fieldKey.js.map +1 -0
  154. package/dist/fields/fieldNamesOfType.js +13 -8
  155. package/dist/fields/fieldNamesOfType.js.map +1 -1
  156. package/dist/fields/instanceOptions.js +20 -0
  157. package/dist/fields/instanceOptions.js.map +1 -0
  158. package/dist/fields/registry.d.ts +1 -0
  159. package/dist/fields/registry.js +21 -2
  160. package/dist/fields/registry.js.map +1 -1
  161. package/dist/fields/sharedConfig.js +46 -9
  162. package/dist/fields/sharedConfig.js.map +1 -1
  163. package/dist/fields/types.d.ts +63 -5
  164. package/dist/flow/engine.d.ts +6 -4
  165. package/dist/flow/engine.js +11 -6
  166. package/dist/flow/engine.js.map +1 -1
  167. package/dist/flow/normalizeFlow.js +16 -7
  168. package/dist/flow/normalizeFlow.js.map +1 -1
  169. package/dist/flow/types.d.ts +12 -3
  170. package/dist/flow/types.js +11 -0
  171. package/dist/flow/types.js.map +1 -0
  172. package/dist/form/pollState.d.ts +4 -4
  173. package/dist/form/pollState.js.map +1 -1
  174. package/dist/form/toFormDocument.d.ts +54 -12
  175. package/dist/form/toFormDocument.js +56 -8
  176. package/dist/form/toFormDocument.js.map +1 -1
  177. package/dist/form/types.d.ts +31 -14
  178. package/dist/index.d.ts +153 -29
  179. package/dist/index.js +47 -15
  180. package/dist/index.js.map +1 -1
  181. package/dist/plugin/customState.js +26 -0
  182. package/dist/plugin/customState.js.map +1 -0
  183. package/dist/plugin/registerCollections.js +24 -13
  184. package/dist/plugin/registerCollections.js.map +1 -1
  185. package/dist/plugin/uploadsCollection.d.ts +5 -0
  186. package/dist/plugin/uploadsCollection.js +10 -1
  187. package/dist/plugin/uploadsCollection.js.map +1 -1
  188. package/dist/poll/applyPollOptions.js +3 -2
  189. package/dist/poll/applyPollOptions.js.map +1 -1
  190. package/dist/poll/buildPollOptionSourceFields.js +2 -5
  191. package/dist/poll/buildPollOptionSourceFields.js.map +1 -1
  192. package/dist/poll/closeJob.d.ts +52 -0
  193. package/dist/poll/closeJob.js +119 -0
  194. package/dist/poll/closeJob.js.map +1 -0
  195. package/dist/poll/definePollOptionSource.d.ts +10 -1
  196. package/dist/poll/definePollOptionSource.js.map +1 -1
  197. package/dist/poll/definePollType.d.ts +34 -0
  198. package/dist/poll/definePollType.js +6 -0
  199. package/dist/poll/definePollType.js.map +1 -0
  200. package/dist/poll/effectivePollOptions.d.ts +38 -0
  201. package/dist/poll/effectivePollOptions.js +64 -0
  202. package/dist/poll/effectivePollOptions.js.map +1 -0
  203. package/dist/poll/mostVoted.d.ts +21 -0
  204. package/dist/poll/mostVoted.js +32 -0
  205. package/dist/poll/mostVoted.js.map +1 -0
  206. package/dist/poll/outcomeBeforeChange.js +91 -0
  207. package/dist/poll/outcomeBeforeChange.js.map +1 -0
  208. package/dist/poll/outcomeFields.d.ts +38 -0
  209. package/dist/poll/outcomeFields.js +52 -0
  210. package/dist/poll/outcomeFields.js.map +1 -0
  211. package/dist/poll/pollTypeRegistry.d.ts +34 -0
  212. package/dist/poll/pollTypeRegistry.js +71 -0
  213. package/dist/poll/pollTypeRegistry.js.map +1 -0
  214. package/dist/poll/resolvePollCloseRequest.js +105 -0
  215. package/dist/poll/resolvePollCloseRequest.js.map +1 -0
  216. package/dist/poll/resolvePollOptions.d.ts +2 -1
  217. package/dist/poll/resolvePollOptions.js +5 -17
  218. package/dist/poll/resolvePollOptions.js.map +1 -1
  219. package/dist/poll/resolvePollOptionsRequest.js +51 -0
  220. package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
  221. package/dist/poll/resolvePollOutcome.d.ts +22 -9
  222. package/dist/poll/resolvePollOutcome.js +54 -14
  223. package/dist/poll/resolvePollOutcome.js.map +1 -1
  224. package/dist/poll/resultsField.js +21 -0
  225. package/dist/poll/resultsField.js.map +1 -0
  226. package/dist/prefill/valuesFromSearchParams.js +2 -1
  227. package/dist/prefill/valuesFromSearchParams.js.map +1 -1
  228. package/dist/react/Form.d.ts +8 -8
  229. package/dist/react/Form.js +74 -62
  230. package/dist/react/Form.js.map +1 -1
  231. package/dist/react/FormContext.d.ts +6 -4
  232. package/dist/react/FormContext.js.map +1 -1
  233. package/dist/react/FormControls.d.ts +3 -3
  234. package/dist/react/FormControls.js +3 -3
  235. package/dist/react/FormControls.js.map +1 -1
  236. package/dist/react/FormResults.d.ts +5 -5
  237. package/dist/react/FormResults.js +6 -6
  238. package/dist/react/FormResults.js.map +1 -1
  239. package/dist/react/Poll.d.ts +2 -2
  240. package/dist/react/Poll.js +5 -5
  241. package/dist/react/Poll.js.map +1 -1
  242. package/dist/react/contract.d.ts +2 -3
  243. package/dist/react/contract.js.map +1 -1
  244. package/dist/react/primitives/Checkbox.d.ts +4 -2
  245. package/dist/react/primitives/Checkbox.js +2 -1
  246. package/dist/react/primitives/Checkbox.js.map +1 -1
  247. package/dist/react/primitives/FieldShell.d.ts +2 -4
  248. package/dist/react/primitives/FieldShell.js +12 -19
  249. package/dist/react/primitives/FieldShell.js.map +1 -1
  250. package/dist/react/renderers/calculation.js +1 -2
  251. package/dist/react/renderers/calculation.js.map +1 -1
  252. package/dist/react/renderers/checkbox.js +1 -2
  253. package/dist/react/renderers/checkbox.js.map +1 -1
  254. package/dist/react/renderers/consent.js +78 -34
  255. package/dist/react/renderers/consent.js.map +1 -1
  256. package/dist/react/renderers/date.js +1 -3
  257. package/dist/react/renderers/date.js.map +1 -1
  258. package/dist/react/renderers/email.js +1 -2
  259. package/dist/react/renderers/email.js.map +1 -1
  260. package/dist/react/renderers/file.js +1 -2
  261. package/dist/react/renderers/file.js.map +1 -1
  262. package/dist/react/renderers/index.js +3 -0
  263. package/dist/react/renderers/index.js.map +1 -1
  264. package/dist/react/renderers/number.js +1 -2
  265. package/dist/react/renderers/number.js.map +1 -1
  266. package/dist/react/renderers/region.js +45 -0
  267. package/dist/react/renderers/region.js.map +1 -0
  268. package/dist/react/renderers/repeater.js +7 -10
  269. package/dist/react/renderers/repeater.js.map +1 -1
  270. package/dist/react/renderers/select.js +1 -2
  271. package/dist/react/renderers/select.js.map +1 -1
  272. package/dist/react/renderers/text.js +1 -2
  273. package/dist/react/renderers/text.js.map +1 -1
  274. package/dist/react/renderers/textarea.js +1 -2
  275. package/dist/react/renderers/textarea.js.map +1 -1
  276. package/dist/react/state.d.ts +0 -3
  277. package/dist/react/state.js +7 -11
  278. package/dist/react/state.js.map +1 -1
  279. package/dist/react/useField.d.ts +0 -1
  280. package/dist/react/useField.js +0 -1
  281. package/dist/react/useField.js.map +1 -1
  282. package/dist/react/useFormState.d.ts +1 -1
  283. package/dist/react/useFormState.js +1 -1
  284. package/dist/react/useFormState.js.map +1 -1
  285. package/dist/react/validateField.js +3 -6
  286. package/dist/react/validateField.js.map +1 -1
  287. package/dist/recall/interpolate.d.ts +4 -3
  288. package/dist/recall/interpolate.js +5 -4
  289. package/dist/recall/interpolate.js.map +1 -1
  290. package/dist/recall/resolver.d.ts +1 -1
  291. package/dist/recall/resolver.js +14 -2
  292. package/dist/recall/resolver.js.map +1 -1
  293. package/dist/spam/captcha.d.ts +1 -1
  294. package/dist/spam/captcha.js +1 -1
  295. package/dist/spam/captcha.js.map +1 -1
  296. package/dist/submissions/SubmissionAnswers.js +6 -2
  297. package/dist/submissions/SubmissionAnswers.js.map +1 -1
  298. package/dist/submissions/SubmissionAnswersClient.js +100 -64
  299. package/dist/submissions/SubmissionAnswersClient.js.map +1 -1
  300. package/dist/submissions/createSubmission.d.ts +36 -0
  301. package/dist/submissions/createSubmission.js +26 -0
  302. package/dist/submissions/createSubmission.js.map +1 -0
  303. package/dist/submissions/runSubmission.d.ts +10 -0
  304. package/dist/submissions/runSubmission.js +31 -19
  305. package/dist/submissions/runSubmission.js.map +1 -1
  306. package/dist/submissions/types.d.ts +11 -4
  307. package/dist/submissions/validateSubmission.js +39 -23
  308. package/dist/submissions/validateSubmission.js.map +1 -1
  309. package/dist/submissions/votedCookie.js +3 -3
  310. package/dist/submissions/votedCookie.js.map +1 -1
  311. package/dist/translations/de.js +104 -26
  312. package/dist/translations/de.js.map +1 -1
  313. package/dist/translations/en.js +105 -27
  314. package/dist/translations/en.js.map +1 -1
  315. package/dist/translations/keys.d.ts +99 -21
  316. package/dist/translations/keys.js +100 -22
  317. package/dist/translations/keys.js.map +1 -1
  318. package/dist/uploads/resolveFileRef.js +2 -1
  319. package/dist/uploads/resolveFileRef.js.map +1 -1
  320. package/dist/validation/buildRuleBlocks.js +18 -17
  321. package/dist/validation/buildRuleBlocks.js.map +1 -1
  322. package/dist/validation/builtin/email.js +1 -0
  323. package/dist/validation/builtin/email.js.map +1 -1
  324. package/dist/validation/builtin/matchesField.js +3 -7
  325. package/dist/validation/builtin/matchesField.js.map +1 -1
  326. package/dist/validation/builtin/max.js +1 -0
  327. package/dist/validation/builtin/max.js.map +1 -1
  328. package/dist/validation/builtin/maxDate.js +1 -0
  329. package/dist/validation/builtin/maxDate.js.map +1 -1
  330. package/dist/validation/builtin/maxLength.js +1 -0
  331. package/dist/validation/builtin/maxLength.js.map +1 -1
  332. package/dist/validation/builtin/min.js +1 -0
  333. package/dist/validation/builtin/min.js.map +1 -1
  334. package/dist/validation/builtin/minDate.js +1 -0
  335. package/dist/validation/builtin/minDate.js.map +1 -1
  336. package/dist/validation/builtin/minLength.js +1 -0
  337. package/dist/validation/builtin/minLength.js.map +1 -1
  338. package/dist/validation/builtin/notAlreadySubmitted.js +1 -0
  339. package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
  340. package/dist/validation/builtin/oneOf.js +1 -0
  341. package/dist/validation/builtin/oneOf.js.map +1 -1
  342. package/dist/validation/builtin/pattern.js +11 -2
  343. package/dist/validation/builtin/pattern.js.map +1 -1
  344. package/dist/validation/builtin/url.js +1 -0
  345. package/dist/validation/builtin/url.js.map +1 -1
  346. package/dist/validation/builtin/validateRegexParams.js +44 -0
  347. package/dist/validation/builtin/validateRegexParams.js.map +1 -0
  348. package/dist/validation/fieldTargetParam.d.ts +22 -0
  349. package/dist/validation/fieldTargetParam.js +38 -0
  350. package/dist/validation/fieldTargetParam.js.map +1 -0
  351. package/dist/validation/runValidation.js +8 -29
  352. package/dist/validation/runValidation.js.map +1 -1
  353. package/dist/validation/types.d.ts +5 -11
  354. package/package.json +6 -6
  355. package/dist/consent/buildConsentSourceConfig.js +0 -49
  356. package/dist/consent/buildConsentSourceConfig.js.map +0 -1
  357. package/dist/consent/builtin/index.d.ts +0 -17
  358. package/dist/consent/builtin/index.js +0 -21
  359. package/dist/consent/builtin/index.js.map +0 -1
  360. package/dist/consent/builtin/pageReference.js +0 -75
  361. package/dist/consent/builtin/pageReference.js.map +0 -1
  362. package/dist/consent/builtin/static.js +0 -48
  363. package/dist/consent/builtin/static.js.map +0 -1
  364. package/dist/consent/defineConsentSource.d.ts +0 -35
  365. package/dist/consent/defineConsentSource.js +0 -6
  366. package/dist/consent/defineConsentSource.js.map +0 -1
  367. package/dist/consent/registry.d.ts +0 -16
  368. package/dist/consent/registry.js +0 -16
  369. package/dist/consent/registry.js.map +0 -1
  370. package/dist/consent/resolveConsentLinks.d.ts +0 -19
  371. package/dist/consent/resolveConsentLinks.js +0 -26
  372. package/dist/consent/resolveConsentLinks.js.map +0 -1
@@ -1,25 +1,61 @@
1
+ import { fieldNamesOfType } from "../fields/fieldNamesOfType.js";
1
2
  import { localizedIf } from "../fields/localizedIf.js";
2
3
  import { keys } from "../translations/keys.js";
3
- import { labelForKey } from "../translations/server.js";
4
+ import { asTranslate, labelFor, labelForKey } from "../translations/server.js";
5
+ import { resolveFromAddressesRequest } from "../actions/fromAddresses.js";
4
6
  import { validateUrl } from "../validation/validateUrl.js";
5
7
  import { normalizeCalc } from "../calc/normalizeCalc.js";
6
8
  import { isLoggedIn } from "../plugin/access.js";
7
9
  import { buildActionBlocks } from "../actions/buildActionBlocks.js";
10
+ import { resolvePollTypes } from "../poll/pollTypeRegistry.js";
11
+ import { enqueuePollClose } from "../poll/closeJob.js";
8
12
  import { resolveFormResultsRequest } from "../aggregation/resolveResultsRequest.js";
9
13
  import { buildConditionTypeMap } from "../conditions/conditionType.js";
10
14
  import { normalizeFormConditions } from "../conditions/normalizeConditions.js";
15
+ import { resolveConsentSourcesRequest } from "../consent/resolveConsentSourcesRequest.js";
16
+ import { resolveConsentStatements } from "../consent/resolveConsentStatements.js";
17
+ import { resolveDepartmentsRequest } from "../email/departments.js";
11
18
  import { buildFieldBlocks } from "../fields/buildFieldBlocks.js";
12
19
  import { normalizeFlow } from "../flow/normalizeFlow.js";
20
+ import { END_OF_FORM } from "../flow/types.js";
13
21
  import { buildPollOptionSourceFields } from "../poll/buildPollOptionSourceFields.js";
22
+ import { pollOutcomeBeforeChange } from "../poll/outcomeBeforeChange.js";
23
+ import { buildDefaultOutcomeFields } from "../poll/outcomeFields.js";
24
+ import { resolvePollCloseRequest } from "../poll/resolvePollCloseRequest.js";
25
+ import { resolvePollOptionsRequest } from "../poll/resolvePollOptionsRequest.js";
26
+ import { buildValidateResultsField, pollEligibleTypes } from "../poll/resultsField.js";
27
+ import { buildDefaultButtonFields } from "./buttonFields.js";
14
28
  import { ValidationError } from "payload";
15
29
  //#region src/collections/forms.ts
16
30
  const FORMS_SLUG = "forms";
31
+ /**
32
+ * Require the title in the default locale (and on hosts without localization), but let it be empty in
33
+ * other locales so a localized form falls back to the default-locale title rather than forcing a
34
+ * translation for every locale. Payload's field-level `required` cannot express this: it enforces per
35
+ * write-locale, which would make a title mandatory in every locale and break the documented fallback.
36
+ */
37
+ const validateFormTitle = (value, { req }) => {
38
+ const localization = req.payload.config.localization;
39
+ const defaultLocale = localization ? localization.defaultLocale : void 0;
40
+ if ((defaultLocale === void 0 || req.locale === void 0 || req.locale === defaultLocale) && (typeof value !== "string" || value.trim().length === 0)) return req.t("validation:required");
41
+ return true;
42
+ };
43
+ /**
44
+ * Field-level validation for the raw flow JSON: step ids must be non-empty, unique, and not the
45
+ * reserved `END_OF_FORM` sentinel, and every explicit step-id reference (a string `next`, a
46
+ * transition `to`) must resolve to a known step. `next: null` (explicit end of form) and an
47
+ * absent `next` (fall through to the next step in array order) are always valid. On full-document
48
+ * saves the beforeValidate pass has already run `normalizeFlow` and laundered dangling
49
+ * references, so the unknown-target checks mainly protect partial API updates that send `flow`
50
+ * without `fields`.
51
+ */
17
52
  const validateFlow = (raw) => {
18
53
  if (raw === null || raw === void 0) return true;
19
54
  const r = raw;
20
55
  if (!Array.isArray(r.steps)) return true;
21
56
  const steps = r.steps;
22
57
  if (steps.find((s) => typeof s?.id !== "string" || s.id.length === 0)) return "Flow: every step must have a non-empty ID";
58
+ if (steps.some((s) => s.id === "__end__")) return `Flow: step ID "${END_OF_FORM}" is reserved`;
23
59
  const ids = steps.map((s) => s.id);
24
60
  if (new Set(ids).size !== ids.length) return "Flow: duplicate step IDs found";
25
61
  const idSet = new Set(ids);
@@ -51,17 +87,30 @@ const stampFileCollections = (rows, slug) => {
51
87
  if (Array.isArray(subFields)) stampFileCollections(subFields, slug);
52
88
  }
53
89
  };
54
- const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegistry, actionRegistry = /* @__PURE__ */ new Map(), localizeContent = true, uploadsCollectionSlug, resultsAccess, pollSourceRegistry }) => {
90
+ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentSources, actionRegistry = /* @__PURE__ */ new Map(), localizeContent = true, richText, uploadsCollectionSlug, resultsAccess, pollSourceRegistry, pollTypeRegistry, outcomeFields, buttons, response, fromAddresses, departments, redirectRelationships }) => {
55
91
  const conditionTypes = buildConditionTypeMap(registry);
92
+ const pollTypes = pollTypeRegistry ?? resolvePollTypes();
93
+ const pollResultsTypes = pollEligibleTypes(registry);
94
+ const bareTypes = new Set([...registry.values()].filter((d) => d.bare === true).map((d) => d.type));
95
+ const bareTypeLabels = Object.fromEntries([...registry.values()].filter((d) => d.bare === true).map((d) => [d.type, d.label]));
56
96
  const FLOW_BUILDER_REF = "@10x-media/form-builder/client#FlowBuilder";
97
+ const FIELD_NAME_SELECT_REF = "@10x-media/form-builder/client#FieldNameSelect";
98
+ const FLOW_STEPS_CELL_REF = "@10x-media/form-builder/client#FlowStepsCell";
99
+ const FIELD_COUNT_CELL_REF = "@10x-media/form-builder/client#FieldCountCell";
100
+ const CLOSE_POLL_BUTTON_REF = "@10x-media/form-builder/client#ClosePollButton";
101
+ const hasOptionSources = (pollSourceRegistry?.size ?? 0) > 0;
102
+ const orderedPollTypes = [...[...pollTypes.values()].filter((strategy) => strategy.type === "mostVoted"), ...[...pollTypes.values()].filter((strategy) => strategy.type !== "mostVoted")];
57
103
  const beforeValidate = ({ data, req }) => {
58
104
  if (data && Array.isArray(data.fields)) {
59
105
  const normalized = normalizeFormConditions(data.fields, conditionTypes);
60
106
  for (const field of normalized) if ("expression" in field) field.expression = normalizeCalc(field.expression);
61
107
  if (uploadsCollectionSlug) stampFileCollections(normalized, uploadsCollectionSlug);
62
108
  data.fields = normalized;
63
- const fieldNames = normalized.map((field) => typeof field.name === "string" ? field.name : void 0).filter((name) => name !== void 0);
64
- const normalizedFlow = normalizeFlow(data.flow, fieldNames);
109
+ const fieldKeys = normalized.map((field) => {
110
+ if (typeof field.name === "string" && field.name.length > 0) return field.name;
111
+ return bareTypes.has(field.blockType) && field.id != null ? String(field.id) : void 0;
112
+ }).filter((key) => key !== void 0);
113
+ const normalizedFlow = normalizeFlow(data.flow, fieldKeys);
65
114
  if (providedFlowStepCount(data.flow) > 0 && normalizedFlow === void 0) throw new ValidationError({
66
115
  collection: FORMS_SLUG,
67
116
  errors: [{
@@ -70,27 +119,64 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
70
119
  }]
71
120
  }, req.t);
72
121
  data.flow = normalizedFlow;
122
+ if (data.pollEnabled === true) {
123
+ const poll = data.poll != null && typeof data.poll === "object" ? data.poll : {};
124
+ const resultsField = typeof poll.resultsField === "string" ? poll.resultsField.trim() : "";
125
+ const sourceDriven = (typeof poll.optionSource === "string" ? poll.optionSource.trim() : "").length > 0 || poll.type === "source";
126
+ if (resultsField.length === 0 && !sourceDriven) {
127
+ const eligible = fieldNamesOfType(data.fields, pollResultsTypes);
128
+ if (eligible.length === 1) data.poll = {
129
+ ...poll,
130
+ resultsField: eligible[0]
131
+ };
132
+ else {
133
+ const messageKey = eligible.length > 1 ? keys.pollVoteFieldChoose : keys.pollVoteFieldMissing;
134
+ throw new ValidationError({
135
+ collection: FORMS_SLUG,
136
+ errors: [{
137
+ path: "poll.resultsField",
138
+ message: asTranslate(req.t)(messageKey)
139
+ }]
140
+ }, req.t);
141
+ }
142
+ }
143
+ }
73
144
  }
74
145
  return data;
75
146
  };
147
+ const pollCloseAfterChange = async ({ doc, req }) => {
148
+ await enqueuePollClose({
149
+ payload: req.payload,
150
+ form: doc,
151
+ req
152
+ });
153
+ return doc;
154
+ };
155
+ const pollTypeOptionLabel = (label) => typeof label === "string" ? labelFor(label) : label;
76
156
  const fieldsField = {
77
157
  name: "fields",
78
158
  type: "blocks",
79
159
  blocks: buildFieldBlocks({
80
160
  registry,
81
161
  ruleRegistry,
82
- consentRegistry,
83
162
  localize: localizeContent
84
- })
163
+ }),
164
+ admin: { components: { Cell: FIELD_COUNT_CELL_REF } }
85
165
  };
86
166
  const flowField = {
87
167
  name: "flow",
88
168
  type: "json",
89
169
  validate: validateFlow,
90
- admin: { components: { Field: {
91
- path: FLOW_BUILDER_REF,
92
- clientProps: { conditionTypes }
93
- } } },
170
+ admin: { components: {
171
+ Cell: FLOW_STEPS_CELL_REF,
172
+ Field: {
173
+ path: FLOW_BUILDER_REF,
174
+ clientProps: {
175
+ conditionTypes,
176
+ bareTypeLabels
177
+ }
178
+ }
179
+ } },
94
180
  typescriptSchema: [() => ({
95
181
  type: "object",
96
182
  required: ["steps"],
@@ -108,7 +194,7 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
108
194
  type: "array",
109
195
  items: { type: "string" }
110
196
  },
111
- next: { type: "string" },
197
+ next: { type: ["string", "null"] },
112
198
  transitions: {
113
199
  type: "array",
114
200
  items: {
@@ -136,6 +222,20 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
136
222
  label: labelForKey(keys.configActions),
137
223
  access: { read: isLoggedIn }
138
224
  };
225
+ const redirectReferenceField = redirectRelationships && redirectRelationships.length > 0 ? [{
226
+ name: "reference",
227
+ type: "relationship",
228
+ relationTo: redirectRelationships,
229
+ label: labelForKey(keys.responseRedirectReference),
230
+ admin: { description: labelForKey(keys.responseRedirectReferenceDescription) }
231
+ }] : [];
232
+ const defaultRedirectFields = [{
233
+ name: "url",
234
+ type: "text",
235
+ label: labelForKey(keys.responseUrl),
236
+ validate: validateUrl
237
+ }, ...redirectReferenceField];
238
+ const redirectFields = response?.redirect?.fields ? response.redirect.fields({ defaultFields: defaultRedirectFields }) : defaultRedirectFields;
139
239
  const responseField = {
140
240
  name: "response",
141
241
  type: "group",
@@ -159,50 +259,104 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
159
259
  type: "richText",
160
260
  label: labelForKey(keys.responseMessage),
161
261
  admin: { condition: (_data, siblingData) => siblingData?.type !== "redirect" },
262
+ ...richText?.editor ? { editor: richText.editor } : {},
162
263
  ...localizedIf(localizeContent)
163
264
  },
164
265
  {
165
266
  name: "redirect",
166
267
  type: "group",
167
268
  label: labelForKey(keys.responseRedirect),
168
- admin: { condition: (_data, siblingData) => siblingData?.type === "redirect" },
169
- fields: [{
170
- name: "url",
171
- type: "text",
172
- label: labelForKey(keys.responseUrl),
173
- validate: validateUrl
174
- }]
175
- },
176
- {
177
- name: "submitLabel",
178
- type: "text",
179
- label: labelForKey(keys.responseSubmitLabel),
180
- ...localizedIf(localizeContent)
269
+ admin: {
270
+ condition: (_data, siblingData) => siblingData?.type === "redirect",
271
+ hideGutter: true
272
+ },
273
+ fields: redirectFields
181
274
  }
182
275
  ]
183
276
  };
184
- const displayField = {
185
- name: "display",
277
+ const defaultOutcomeFields = buildDefaultOutcomeFields();
278
+ const defaultButtonFields = buildDefaultButtonFields(localizeContent);
279
+ const halfWidth = (field) => ({
280
+ ...field,
281
+ admin: {
282
+ ...field.admin,
283
+ width: "50%"
284
+ }
285
+ });
286
+ const composedButtons = buttons?.fields ? buttons.fields({ defaultFields: defaultButtonFields }) : defaultButtonFields;
287
+ const submitField = composedButtons.submit;
288
+ const prevNextRow = {
289
+ type: "row",
290
+ admin: { condition: (data) => {
291
+ const steps = data?.flow?.steps;
292
+ return Array.isArray(steps) && steps.length >= 1;
293
+ } },
294
+ fields: [halfWidth(composedButtons.prev), halfWidth(composedButtons.next)]
295
+ };
296
+ const pollGroupField = {
297
+ name: "poll",
186
298
  type: "group",
299
+ label: false,
187
300
  fields: [
188
301
  {
189
- name: "showTitle",
190
- type: "checkbox",
191
- defaultValue: false,
192
- label: labelForKey(keys.displayShowTitle)
302
+ name: "resultsField",
303
+ type: "text",
304
+ label: labelForKey(keys.pollResultsField),
305
+ validate: buildValidateResultsField(pollResultsTypes),
306
+ admin: { components: { Field: {
307
+ path: FIELD_NAME_SELECT_REF,
308
+ clientProps: {
309
+ types: pollResultsTypes,
310
+ descriptionKey: keys.pollResultsFieldDescription
311
+ }
312
+ } } }
193
313
  },
194
314
  {
195
- name: "title",
196
- type: "text",
197
- label: labelForKey(keys.displayTitle),
198
- admin: { condition: (_data, siblingData) => Boolean(siblingData?.showTitle) },
199
- ...localizedIf(localizeContent)
315
+ name: "type",
316
+ type: "select",
317
+ defaultValue: "mostVoted",
318
+ label: labelForKey(keys.pollType),
319
+ admin: {
320
+ isClearable: false,
321
+ description: labelForKey(keys.pollTypeDescription)
322
+ },
323
+ options: orderedPollTypes.filter((strategy) => strategy.type !== "source" || hasOptionSources).map((strategy) => ({
324
+ label: pollTypeOptionLabel(strategy.label),
325
+ value: strategy.type
326
+ }))
200
327
  },
201
328
  {
202
- name: "intro",
203
- type: "richText",
204
- label: labelForKey(keys.displayIntro),
205
- ...localizedIf(localizeContent)
329
+ name: "resultsVisibility",
330
+ type: "select",
331
+ defaultValue: "afterVote",
332
+ label: labelForKey(keys.pollResultsVisibility),
333
+ admin: { isClearable: false },
334
+ options: [{
335
+ label: labelForKey(keys.pollVisibilityAfterVote),
336
+ value: "afterVote"
337
+ }, {
338
+ label: labelForKey(keys.pollVisibilityAfterClose),
339
+ value: "afterClose"
340
+ }]
341
+ },
342
+ {
343
+ name: "closesAt",
344
+ type: "date",
345
+ label: labelForKey(keys.pollClosesAt),
346
+ admin: { date: { pickerAppearance: "dayAndTime" } }
347
+ },
348
+ {
349
+ name: "closePoll",
350
+ type: "ui",
351
+ admin: { components: { Field: CLOSE_POLL_BUTTON_REF } }
352
+ },
353
+ ...buildPollOptionSourceFields(pollSourceRegistry ?? /* @__PURE__ */ new Map()),
354
+ {
355
+ name: "outcome",
356
+ type: "group",
357
+ label: labelForKey(keys.pollOutcome),
358
+ admin: { hideGutter: true },
359
+ fields: outcomeFields ? outcomeFields({ defaultFields: defaultOutcomeFields }) : [defaultOutcomeFields.winningValues, defaultOutcomeFields.resolvedAt]
206
360
  }
207
361
  ]
208
362
  };
@@ -210,23 +364,42 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
210
364
  {
211
365
  name: "title",
212
366
  type: "text",
213
- required: true,
214
- label: labelForKey(keys.fieldTitle)
367
+ label: labelForKey(keys.fieldTitle),
368
+ ...localizedIf(localizeContent),
369
+ validate: validateFormTitle
370
+ },
371
+ {
372
+ type: "row",
373
+ fields: [{
374
+ name: "multistep",
375
+ type: "checkbox",
376
+ defaultValue: false,
377
+ label: labelForKey(keys.formMultistep),
378
+ admin: { width: "50%" }
379
+ }, {
380
+ name: "pollEnabled",
381
+ type: "checkbox",
382
+ defaultValue: false,
383
+ label: labelForKey(keys.formPollEnabled),
384
+ admin: { width: "50%" }
385
+ }]
215
386
  },
216
387
  {
217
388
  type: "tabs",
218
389
  tabs: [
219
390
  {
220
391
  label: labelForKey(keys.tabFields),
221
- fields: [fieldsField]
392
+ fields: [fieldsField, submitField]
222
393
  },
223
394
  {
224
- label: labelForKey(keys.tabDisplay),
225
- fields: [displayField]
395
+ label: labelForKey(keys.tabFlow),
396
+ admin: { condition: (_data, siblingData) => siblingData?.multistep === true },
397
+ fields: [flowField, prevNextRow]
226
398
  },
227
399
  {
228
- label: labelForKey(keys.tabFlow),
229
- fields: [flowField]
400
+ label: labelForKey(keys.pollGroup),
401
+ admin: { condition: (_data, siblingData) => siblingData?.pollEnabled === true },
402
+ fields: [pollGroupField]
230
403
  },
231
404
  {
232
405
  label: labelForKey(keys.tabActions),
@@ -237,99 +410,105 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
237
410
  fields: [responseField]
238
411
  }
239
412
  ]
240
- },
241
- {
242
- name: "poll",
243
- type: "group",
244
- label: labelForKey(keys.pollGroup),
245
- admin: { position: "sidebar" },
246
- fields: [
247
- {
248
- name: "enabled",
249
- type: "checkbox",
250
- defaultValue: false,
251
- label: labelForKey(keys.pollEnabled)
252
- },
253
- {
254
- name: "resultsField",
255
- type: "text",
256
- label: labelForKey(keys.pollResultsField),
257
- admin: {
258
- description: labelForKey(keys.pollResultsFieldDescription),
259
- condition: (_data, siblingData) => Boolean(siblingData?.enabled)
260
- }
261
- },
262
- {
263
- name: "resultsVisibility",
264
- type: "select",
265
- defaultValue: "afterVote",
266
- label: labelForKey(keys.pollResultsVisibility),
267
- admin: {
268
- isClearable: false,
269
- condition: (_data, siblingData) => Boolean(siblingData?.enabled)
270
- },
271
- options: [{
272
- label: labelForKey(keys.pollVisibilityAfterVote),
273
- value: "afterVote"
274
- }, {
275
- label: labelForKey(keys.pollVisibilityAfterClose),
276
- value: "afterClose"
277
- }]
278
- },
279
- {
280
- name: "closesAt",
281
- type: "date",
282
- label: labelForKey(keys.pollClosesAt),
283
- admin: {
284
- date: { pickerAppearance: "dayAndTime" },
285
- condition: (_data, siblingData) => Boolean(siblingData?.enabled)
286
- }
287
- },
288
- ...buildPollOptionSourceFields(pollSourceRegistry ?? /* @__PURE__ */ new Map()),
289
- {
290
- name: "outcome",
291
- type: "group",
292
- label: labelForKey(keys.pollOutcome),
293
- admin: { condition: (_data, siblingData) => Boolean(siblingData?.enabled) },
294
- fields: [{
295
- name: "winningValue",
296
- type: "text",
297
- label: labelForKey(keys.pollWinningValue),
298
- admin: { readOnly: true },
299
- access: {
300
- create: () => false,
301
- update: () => false
302
- }
303
- }, {
304
- name: "resolvedAt",
305
- type: "date",
306
- label: labelForKey(keys.pollResolvedAt),
307
- admin: { readOnly: true },
308
- access: {
309
- create: () => false,
310
- update: () => false
311
- }
312
- }]
313
- }
314
- ]
315
413
  }
316
414
  ];
317
- const defaultEndpoints = [{
318
- path: "/:id/results",
319
- method: "get",
320
- handler: async (req) => {
321
- const field = typeof req.query?.field === "string" ? req.query.field : void 0;
322
- const { status, body } = await resolveFormResultsRequest({
415
+ const consentAfterRead = consentSources ? async ({ doc, req }) => {
416
+ try {
417
+ const statements = await resolveConsentStatements({
323
418
  payload: req.payload,
324
- formId: req.routeParams?.id,
325
- field,
326
- isAuthed: Boolean(req.user),
327
419
  req,
328
- access: resultsAccess
420
+ form: doc,
421
+ sources: consentSources
329
422
  });
330
- return Response.json(body, { status });
423
+ if (Object.keys(statements).length > 0) doc.consentStatements = statements;
424
+ } catch (error) {
425
+ req.payload.logger?.warn(`form-builder consent afterRead: ${String(error)}`);
331
426
  }
332
- }];
427
+ return doc;
428
+ } : void 0;
429
+ const defaultEndpoints = [
430
+ {
431
+ path: "/:id/results",
432
+ method: "get",
433
+ handler: async (req) => {
434
+ const field = typeof req.query?.field === "string" ? req.query.field : void 0;
435
+ const { status, body } = await resolveFormResultsRequest({
436
+ payload: req.payload,
437
+ formId: req.routeParams?.id,
438
+ field,
439
+ isAuthed: Boolean(req.user),
440
+ req,
441
+ access: resultsAccess,
442
+ eligibleTypes: pollResultsTypes
443
+ });
444
+ return Response.json(body, { status });
445
+ }
446
+ },
447
+ {
448
+ path: "/:id/poll-options",
449
+ method: "get",
450
+ handler: async (req) => {
451
+ const { status, body } = await resolvePollOptionsRequest({
452
+ payload: req.payload,
453
+ formId: req.routeParams?.id,
454
+ isAuthed: Boolean(req.user),
455
+ req
456
+ });
457
+ return Response.json(body, { status });
458
+ }
459
+ },
460
+ {
461
+ path: "/:id/close",
462
+ method: "post",
463
+ handler: async (req) => {
464
+ const { status, body } = await resolvePollCloseRequest({
465
+ payload: req.payload,
466
+ formId: req.routeParams?.id,
467
+ isAuthed: Boolean(req.user),
468
+ req
469
+ });
470
+ return Response.json(body, { status });
471
+ }
472
+ },
473
+ ...consentSources ? [{
474
+ path: "/:id/consent-sources",
475
+ method: "get",
476
+ handler: async (req) => {
477
+ const { status, body } = await resolveConsentSourcesRequest({
478
+ payload: req.payload,
479
+ formId: req.routeParams?.id,
480
+ isAuthed: Boolean(req.user),
481
+ req,
482
+ resolver: consentSources
483
+ });
484
+ return Response.json(body, { status });
485
+ }
486
+ }] : [],
487
+ ...fromAddresses ? [{
488
+ path: "/:id/from-addresses",
489
+ method: "get",
490
+ handler: async (req) => {
491
+ const { status, body } = await resolveFromAddressesRequest({
492
+ isAuthed: Boolean(req.user),
493
+ req,
494
+ resolver: fromAddresses
495
+ });
496
+ return Response.json(body, { status });
497
+ }
498
+ }] : [],
499
+ ...departments ? [{
500
+ path: "/:id/departments",
501
+ method: "get",
502
+ handler: async (req) => {
503
+ const { status, body } = await resolveDepartmentsRequest({
504
+ isAuthed: Boolean(req.user),
505
+ req,
506
+ resolver: departments
507
+ });
508
+ return Response.json(body, { status });
509
+ }
510
+ }] : []
511
+ ];
333
512
  return {
334
513
  ...overrides ?? {},
335
514
  slug: FORMS_SLUG,
@@ -341,6 +520,13 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
341
520
  admin: {
342
521
  group: "Forms",
343
522
  useAsTitle: "title",
523
+ defaultColumns: [
524
+ "title",
525
+ "fields",
526
+ "flow",
527
+ "pollEnabled",
528
+ "updatedAt"
529
+ ],
344
530
  ...overrides?.admin ?? {}
345
531
  },
346
532
  access: {
@@ -349,7 +535,10 @@ const buildFormsCollection = ({ overrides, registry, ruleRegistry, consentRegist
349
535
  },
350
536
  hooks: {
351
537
  ...overrides?.hooks ?? {},
352
- beforeValidate: [beforeValidate, ...overrides?.hooks?.beforeValidate ?? []]
538
+ beforeValidate: [beforeValidate, ...overrides?.hooks?.beforeValidate ?? []],
539
+ beforeChange: [pollOutcomeBeforeChange, ...overrides?.hooks?.beforeChange ?? []],
540
+ afterChange: [pollCloseAfterChange, ...overrides?.hooks?.afterChange ?? []],
541
+ afterRead: [...consentAfterRead ? [consentAfterRead] : [], ...overrides?.hooks?.afterRead ?? []]
353
542
  },
354
543
  endpoints: [...defaultEndpoints, ...Array.isArray(overrides?.endpoints) ? overrides.endpoints : []],
355
544
  fields: overrides?.fields ? overrides.fields({ defaultFields }) : defaultFields