@10x-media/form-builder 0.1.0-beta.2 → 0.1.0-beta.21

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 (619) hide show
  1. package/CHANGELOG.md +360 -0
  2. package/README.md +7 -5
  3. package/dist/actions/assertNoBlockCollision.js +18 -0
  4. package/dist/actions/assertNoBlockCollision.js.map +1 -0
  5. package/dist/actions/body/converters.d.ts +20 -0
  6. package/dist/actions/body/converters.js +57 -0
  7. package/dist/actions/body/converters.js.map +1 -0
  8. package/dist/actions/body/escapeHtml.d.ts +6 -0
  9. package/dist/actions/body/escapeHtml.js +14 -0
  10. package/dist/actions/body/escapeHtml.js.map +1 -0
  11. package/dist/actions/body/serializeBody.d.ts +55 -0
  12. package/dist/actions/body/serializeBody.js +78 -0
  13. package/dist/actions/body/serializeBody.js.map +1 -0
  14. package/dist/actions/body/serializeSlate.js +31 -0
  15. package/dist/actions/body/serializeSlate.js.map +1 -0
  16. package/dist/actions/body/textOfBody.d.ts +13 -0
  17. package/dist/actions/body/textOfBody.js +35 -0
  18. package/dist/actions/body/textOfBody.js.map +1 -0
  19. package/dist/actions/body/wildcards.d.ts +10 -0
  20. package/dist/actions/body/wildcards.js +33 -0
  21. package/dist/actions/body/wildcards.js.map +1 -0
  22. package/dist/actions/buildActionBlocks.js +12 -9
  23. package/dist/actions/buildActionBlocks.js.map +1 -1
  24. package/dist/actions/builtin/confirmation.js +47 -43
  25. package/dist/actions/builtin/confirmation.js.map +1 -1
  26. package/dist/actions/builtin/emailAction.d.ts +20 -0
  27. package/dist/actions/builtin/emailAction.js +120 -0
  28. package/dist/actions/builtin/emailAction.js.map +1 -0
  29. package/dist/actions/builtin/emailTeam.js +20 -38
  30. package/dist/actions/builtin/emailTeam.js.map +1 -1
  31. package/dist/actions/builtin/index.d.ts +16 -1
  32. package/dist/actions/builtin/index.js +21 -7
  33. package/dist/actions/builtin/index.js.map +1 -1
  34. package/dist/actions/builtin/signedWebhook.js +6 -2
  35. package/dist/actions/builtin/signedWebhook.js.map +1 -1
  36. package/dist/actions/defineAction.d.ts +17 -5
  37. package/dist/actions/defineAction.js.map +1 -1
  38. package/dist/actions/dispatch.js +51 -6
  39. package/dist/actions/dispatch.js.map +1 -1
  40. package/dist/actions/dispatchContext.js +13 -0
  41. package/dist/actions/dispatchContext.js.map +1 -0
  42. package/dist/actions/emailRecipients.d.ts +12 -0
  43. package/dist/actions/emailRecipients.js +146 -0
  44. package/dist/actions/emailRecipients.js.map +1 -0
  45. package/dist/actions/fromAddresses.d.ts +37 -0
  46. package/dist/actions/fromAddresses.js +131 -0
  47. package/dist/actions/fromAddresses.js.map +1 -0
  48. package/dist/actions/recipientSources.d.ts +34 -0
  49. package/dist/actions/recipientSources.js +11 -0
  50. package/dist/actions/recipientSources.js.map +1 -0
  51. package/dist/actions/registry.d.ts +2 -1
  52. package/dist/actions/registry.js +5 -7
  53. package/dist/actions/registry.js.map +1 -1
  54. package/dist/actions/runActions.js +10 -1
  55. package/dist/actions/runActions.js.map +1 -1
  56. package/dist/actions/task.js +47 -16
  57. package/dist/actions/task.js.map +1 -1
  58. package/dist/aggregation/aggregateResponses.d.ts +9 -0
  59. package/dist/aggregation/aggregateResponses.js +8 -14
  60. package/dist/aggregation/aggregateResponses.js.map +1 -1
  61. package/dist/aggregation/resolveResultsRequest.d.ts +41 -6
  62. package/dist/aggregation/resolveResultsRequest.js +97 -11
  63. package/dist/aggregation/resolveResultsRequest.js.map +1 -1
  64. package/dist/calc/computeCalcFields.d.ts +5 -3
  65. package/dist/calc/computeCalcFields.js +6 -4
  66. package/dist/calc/computeCalcFields.js.map +1 -1
  67. package/dist/calc/evaluate.d.ts +26 -3
  68. package/dist/calc/evaluate.js +34 -13
  69. package/dist/calc/evaluate.js.map +1 -1
  70. package/dist/calc/formatCalc.d.ts +11 -0
  71. package/dist/calc/formatCalc.js +35 -0
  72. package/dist/calc/formatCalc.js.map +1 -0
  73. package/dist/calc/formatCalcValue.d.ts +17 -0
  74. package/dist/calc/formatCalcValue.js +17 -0
  75. package/dist/calc/formatCalcValue.js.map +1 -0
  76. package/dist/calc/normalizeCalc.d.ts +17 -3
  77. package/dist/calc/normalizeCalc.js +42 -33
  78. package/dist/calc/normalizeCalc.js.map +1 -1
  79. package/dist/calc/registry.d.ts +43 -0
  80. package/dist/calc/registry.js +27 -0
  81. package/dist/calc/registry.js.map +1 -0
  82. package/dist/calc/resolveCalcContext.d.ts +36 -0
  83. package/dist/calc/resolveCalcContext.js +87 -0
  84. package/dist/calc/resolveCalcContext.js.map +1 -0
  85. package/dist/calc/types.d.ts +25 -4
  86. package/dist/calc/types.js +23 -0
  87. package/dist/calc/types.js.map +1 -0
  88. package/dist/client/ByteSizeField.d.ts +29 -0
  89. package/dist/client/ByteSizeField.js +58 -0
  90. package/dist/client/ByteSizeField.js.map +1 -0
  91. package/dist/client/CalcExpressionBuilder.d.ts +20 -0
  92. package/dist/client/CalcExpressionBuilder.js +890 -0
  93. package/dist/client/CalcExpressionBuilder.js.map +1 -0
  94. package/dist/client/ClosePollButton.d.ts +15 -0
  95. package/dist/client/ClosePollButton.js +80 -0
  96. package/dist/client/ClosePollButton.js.map +1 -0
  97. package/dist/client/CondensedArray.d.ts +15 -0
  98. package/dist/client/CondensedArray.js +97 -0
  99. package/dist/client/CondensedArray.js.map +1 -0
  100. package/dist/client/ConditionBuilder.js +2 -1
  101. package/dist/client/ConditionBuilder.js.map +1 -1
  102. package/dist/client/ConsentBlockLabel.d.ts +15 -0
  103. package/dist/client/ConsentBlockLabel.js +71 -0
  104. package/dist/client/ConsentBlockLabel.js.map +1 -0
  105. package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
  106. package/dist/client/ConsentSourceRowLabel.js +21 -0
  107. package/dist/client/ConsentSourceRowLabel.js.map +1 -0
  108. package/dist/client/EndpointOptionsSelect.d.ts +55 -0
  109. package/dist/client/EndpointOptionsSelect.js +112 -0
  110. package/dist/client/EndpointOptionsSelect.js.map +1 -0
  111. package/dist/client/FieldBlockLabel.d.ts +18 -0
  112. package/dist/client/FieldBlockLabel.js +34 -0
  113. package/dist/client/FieldBlockLabel.js.map +1 -0
  114. package/dist/client/FieldNameSelect.d.ts +37 -0
  115. package/dist/client/FieldNameSelect.js +72 -0
  116. package/dist/client/FieldNameSelect.js.map +1 -0
  117. package/dist/client/FlowBuilder.d.ts +2 -2
  118. package/dist/client/FlowBuilder.js +137 -88
  119. package/dist/client/FlowBuilder.js.map +1 -1
  120. package/dist/client/FormConditionField.js +1 -4
  121. package/dist/client/FormConditionField.js.map +1 -1
  122. package/dist/client/RecipientsSelect.d.ts +37 -0
  123. package/dist/client/RecipientsSelect.js +197 -0
  124. package/dist/client/RecipientsSelect.js.map +1 -0
  125. package/dist/client/RuleDescription.d.ts +21 -0
  126. package/dist/client/RuleDescription.js +19 -0
  127. package/dist/client/RuleDescription.js.map +1 -0
  128. package/dist/client/admin.css +557 -0
  129. package/dist/client/endpointOptions.d.ts +11 -0
  130. package/dist/client/endpointOptions.js +38 -0
  131. package/dist/client/endpointOptions.js.map +1 -0
  132. package/dist/client/flowAuthoring.js +142 -0
  133. package/dist/client/flowAuthoring.js.map +1 -0
  134. package/dist/client/synthesizeClientField.js +21 -10
  135. package/dist/client/synthesizeClientField.js.map +1 -1
  136. package/dist/client/toStaticLabel.js +13 -0
  137. package/dist/client/toStaticLabel.js.map +1 -0
  138. package/dist/collections/buttonFields.d.ts +34 -0
  139. package/dist/collections/buttonFields.js +35 -0
  140. package/dist/collections/buttonFields.js.map +1 -0
  141. package/dist/collections/cells/FieldCountCell.d.ts +15 -0
  142. package/dist/collections/cells/FieldCountCell.js +18 -0
  143. package/dist/collections/cells/FieldCountCell.js.map +1 -0
  144. package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
  145. package/dist/collections/cells/FlowStepsCell.js +17 -0
  146. package/dist/collections/cells/FlowStepsCell.js.map +1 -0
  147. package/dist/collections/formSubmissions.js +114 -28
  148. package/dist/collections/formSubmissions.js.map +1 -1
  149. package/dist/collections/forms.js +449 -112
  150. package/dist/collections/forms.js.map +1 -1
  151. package/dist/collections/formsEndpoints.js +106 -0
  152. package/dist/collections/formsEndpoints.js.map +1 -0
  153. package/dist/collections/redirectFields.d.ts +29 -0
  154. package/dist/collections/settingsFields.d.ts +31 -0
  155. package/dist/collections/settingsFields.js +45 -0
  156. package/dist/collections/settingsFields.js.map +1 -0
  157. package/dist/conditions/conditionType.js +9 -2
  158. package/dist/conditions/conditionType.js.map +1 -1
  159. package/dist/conditions/evaluate.js +1 -1
  160. package/dist/conditions/evaluate.js.map +1 -1
  161. package/dist/conditions/fieldTypes.d.ts +3 -1
  162. package/dist/conditions/fieldTypes.js +4 -1
  163. package/dist/conditions/fieldTypes.js.map +1 -1
  164. package/dist/conditions/normalizeConditions.js +20 -6
  165. package/dist/conditions/normalizeConditions.js.map +1 -1
  166. package/dist/consent/applyConsentStatements.d.ts +14 -0
  167. package/dist/consent/applyConsentStatements.js +17 -0
  168. package/dist/consent/applyConsentStatements.js.map +1 -0
  169. package/dist/consent/captureConsent.d.ts +39 -11
  170. package/dist/consent/captureConsent.js +63 -13
  171. package/dist/consent/captureConsent.js.map +1 -1
  172. package/dist/consent/consentSourcesField.d.ts +66 -0
  173. package/dist/consent/consentSourcesField.js +98 -0
  174. package/dist/consent/consentSourcesField.js.map +1 -0
  175. package/dist/consent/effectiveStatement.js +16 -0
  176. package/dist/consent/effectiveStatement.js.map +1 -0
  177. package/dist/consent/resolveConsentEntries.d.ts +24 -0
  178. package/dist/consent/resolveConsentEntries.js +40 -0
  179. package/dist/consent/resolveConsentEntries.js.map +1 -0
  180. package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
  181. package/dist/consent/resolveConsentSourcesRequest.js +54 -0
  182. package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
  183. package/dist/consent/resolveConsentStatements.d.ts +45 -0
  184. package/dist/consent/resolveConsentStatements.js +46 -0
  185. package/dist/consent/resolveConsentStatements.js.map +1 -0
  186. package/dist/consent/resolvePublishedVersionRef.d.ts +17 -11
  187. package/dist/consent/resolvePublishedVersionRef.js +13 -10
  188. package/dist/consent/resolvePublishedVersionRef.js.map +1 -1
  189. package/dist/consent/types.d.ts +69 -0
  190. package/dist/context/formContext.d.ts +30 -0
  191. package/dist/context/formContext.js +54 -0
  192. package/dist/context/formContext.js.map +1 -0
  193. package/dist/email/departments.d.ts +59 -0
  194. package/dist/email/departments.js +87 -0
  195. package/dist/email/departments.js.map +1 -0
  196. package/dist/email/departmentsField.d.ts +53 -0
  197. package/dist/email/departmentsField.js +73 -0
  198. package/dist/email/departmentsField.js.map +1 -0
  199. package/dist/exports/client.d.ts +14 -1
  200. package/dist/exports/client.js +14 -1
  201. package/dist/exports/i18n.d.ts +5 -2
  202. package/dist/exports/i18n.js +5 -2
  203. package/dist/exports/react.d.ts +34 -10
  204. package/dist/exports/react.js +24 -4
  205. package/dist/exports/rsc.d.ts +10 -1
  206. package/dist/exports/rsc.js +10 -1
  207. package/dist/exports/types.d.ts +20 -12
  208. package/dist/fields/buildFieldBlocks.js +46 -25
  209. package/dist/fields/buildFieldBlocks.js.map +1 -1
  210. package/dist/fields/builtin/calculation.d.ts +17 -0
  211. package/dist/fields/builtin/calculation.js +193 -18
  212. package/dist/fields/builtin/calculation.js.map +1 -1
  213. package/dist/fields/builtin/checkbox.js +23 -0
  214. package/dist/fields/builtin/checkbox.js.map +1 -1
  215. package/dist/fields/builtin/consent.js +49 -14
  216. package/dist/fields/builtin/consent.js.map +1 -1
  217. package/dist/fields/builtin/country.d.ts +13 -0
  218. package/dist/fields/builtin/country.js +30 -0
  219. package/dist/fields/builtin/country.js.map +1 -0
  220. package/dist/fields/builtin/date.js +31 -0
  221. package/dist/fields/builtin/date.js.map +1 -0
  222. package/dist/fields/builtin/email.js +8 -1
  223. package/dist/fields/builtin/email.js.map +1 -1
  224. package/dist/fields/builtin/file.d.ts +15 -0
  225. package/dist/fields/builtin/file.js +95 -8
  226. package/dist/fields/builtin/file.js.map +1 -1
  227. package/dist/fields/builtin/index.d.ts +30 -0
  228. package/dist/fields/builtin/index.js +37 -10
  229. package/dist/fields/builtin/index.js.map +1 -1
  230. package/dist/fields/builtin/message.js +30 -0
  231. package/dist/fields/builtin/message.js.map +1 -0
  232. package/dist/fields/builtin/repeater.js +8 -3
  233. package/dist/fields/builtin/repeater.js.map +1 -1
  234. package/dist/fields/builtin/select.js +28 -4
  235. package/dist/fields/builtin/select.js.map +1 -1
  236. package/dist/fields/builtin/state.d.ts +13 -0
  237. package/dist/fields/builtin/state.js +30 -0
  238. package/dist/fields/builtin/state.js.map +1 -0
  239. package/dist/fields/builtin/text.js +7 -0
  240. package/dist/fields/builtin/text.js.map +1 -1
  241. package/dist/fields/data/regions.d.ts +21 -0
  242. package/dist/fields/data/regions.js +1238 -0
  243. package/dist/fields/data/regions.js.map +1 -0
  244. package/dist/fields/fieldKey.d.ts +15 -0
  245. package/dist/fields/fieldKey.js +16 -0
  246. package/dist/fields/fieldKey.js.map +1 -0
  247. package/dist/fields/fieldNamesOfType.js +30 -0
  248. package/dist/fields/fieldNamesOfType.js.map +1 -0
  249. package/dist/fields/instanceOptions.js +20 -0
  250. package/dist/fields/instanceOptions.js.map +1 -0
  251. package/dist/fields/localizedIf.d.ts +13 -0
  252. package/dist/fields/localizedIf.js +12 -0
  253. package/dist/fields/localizedIf.js.map +1 -0
  254. package/dist/fields/registry.d.ts +3 -1
  255. package/dist/fields/registry.js +23 -8
  256. package/dist/fields/registry.js.map +1 -1
  257. package/dist/fields/sharedConfig.js +125 -59
  258. package/dist/fields/sharedConfig.js.map +1 -1
  259. package/dist/fields/types.d.ts +78 -9
  260. package/dist/flow/engine.d.ts +6 -4
  261. package/dist/flow/engine.js +11 -6
  262. package/dist/flow/engine.js.map +1 -1
  263. package/dist/flow/normalizeFlow.js +28 -9
  264. package/dist/flow/normalizeFlow.js.map +1 -1
  265. package/dist/flow/stepLabel.js +15 -0
  266. package/dist/flow/stepLabel.js.map +1 -0
  267. package/dist/flow/types.d.ts +12 -3
  268. package/dist/flow/types.js +11 -0
  269. package/dist/flow/types.js.map +1 -0
  270. package/dist/form/pollState.d.ts +23 -0
  271. package/dist/form/pollState.js +17 -0
  272. package/dist/form/pollState.js.map +1 -0
  273. package/dist/form/toFormDocument.d.ts +110 -0
  274. package/dist/form/toFormDocument.js +89 -0
  275. package/dist/form/toFormDocument.js.map +1 -0
  276. package/dist/form/types.d.ts +73 -0
  277. package/dist/index.d.ts +67 -61
  278. package/dist/index.js +120 -25
  279. package/dist/index.js.map +1 -1
  280. package/dist/options.d.ts +281 -0
  281. package/dist/plugin/applyRegistryConfig.d.ts +11 -0
  282. package/dist/plugin/applyRegistryConfig.js +20 -0
  283. package/dist/plugin/applyRegistryConfig.js.map +1 -0
  284. package/dist/plugin/customState.js +26 -0
  285. package/dist/plugin/customState.js.map +1 -0
  286. package/dist/plugin/registerCollections.js +43 -40
  287. package/dist/plugin/registerCollections.js.map +1 -1
  288. package/dist/plugin/uploadsCollection.d.ts +16 -0
  289. package/dist/plugin/uploadsCollection.js +53 -0
  290. package/dist/plugin/uploadsCollection.js.map +1 -0
  291. package/dist/poll/applyPollOptions.js +18 -0
  292. package/dist/poll/applyPollOptions.js.map +1 -0
  293. package/dist/poll/buildPollOptionSourceFields.js +50 -0
  294. package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
  295. package/dist/poll/closeJob.d.ts +53 -0
  296. package/dist/poll/closeJob.js +121 -0
  297. package/dist/poll/closeJob.js.map +1 -0
  298. package/dist/poll/definePollOptionSource.d.ts +44 -0
  299. package/dist/poll/definePollOptionSource.js +6 -0
  300. package/dist/poll/definePollOptionSource.js.map +1 -0
  301. package/dist/poll/definePollType.d.ts +34 -0
  302. package/dist/poll/definePollType.js +6 -0
  303. package/dist/poll/definePollType.js.map +1 -0
  304. package/dist/poll/effectivePollOptions.d.ts +38 -0
  305. package/dist/poll/effectivePollOptions.js +64 -0
  306. package/dist/poll/effectivePollOptions.js.map +1 -0
  307. package/dist/poll/mostVoted.d.ts +21 -0
  308. package/dist/poll/mostVoted.js +32 -0
  309. package/dist/poll/mostVoted.js.map +1 -0
  310. package/dist/poll/outcomeBeforeChange.js +91 -0
  311. package/dist/poll/outcomeBeforeChange.js.map +1 -0
  312. package/dist/poll/outcomeFields.d.ts +38 -0
  313. package/dist/poll/outcomeFields.js +52 -0
  314. package/dist/poll/outcomeFields.js.map +1 -0
  315. package/dist/poll/pollTypeRegistry.d.ts +34 -0
  316. package/dist/poll/pollTypeRegistry.js +69 -0
  317. package/dist/poll/pollTypeRegistry.js.map +1 -0
  318. package/dist/poll/registry.d.ts +17 -0
  319. package/dist/poll/registry.js +12 -0
  320. package/dist/poll/registry.js.map +1 -0
  321. package/dist/poll/resolvePollCloseRequest.js +106 -0
  322. package/dist/poll/resolvePollCloseRequest.js.map +1 -0
  323. package/dist/poll/resolvePollOptions.d.ts +29 -0
  324. package/dist/poll/resolvePollOptions.js +52 -0
  325. package/dist/poll/resolvePollOptions.js.map +1 -0
  326. package/dist/poll/resolvePollOptionsRequest.js +50 -0
  327. package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
  328. package/dist/poll/resolvePollOutcome.d.ts +40 -0
  329. package/dist/poll/resolvePollOutcome.js +90 -0
  330. package/dist/poll/resolvePollOutcome.js.map +1 -0
  331. package/dist/poll/resultsField.js +21 -0
  332. package/dist/poll/resultsField.js.map +1 -0
  333. package/dist/poll/votes/aggregateFromVotes.d.ts +27 -0
  334. package/dist/poll/votes/aggregateFromVotes.js +54 -0
  335. package/dist/poll/votes/aggregateFromVotes.js.map +1 -0
  336. package/dist/poll/votes/answerValues.js +16 -0
  337. package/dist/poll/votes/answerValues.js.map +1 -0
  338. package/dist/poll/votes/bumpPollVote.js +88 -0
  339. package/dist/poll/votes/bumpPollVote.js.map +1 -0
  340. package/dist/poll/votes/recountPollVotes.d.ts +20 -0
  341. package/dist/poll/votes/recountPollVotes.js +63 -0
  342. package/dist/poll/votes/recountPollVotes.js.map +1 -0
  343. package/dist/poll/votes/voteTallyHook.js +76 -0
  344. package/dist/poll/votes/voteTallyHook.js.map +1 -0
  345. package/dist/poll/votes/votesCollection.d.ts +19 -0
  346. package/dist/poll/votes/votesCollection.js +89 -0
  347. package/dist/poll/votes/votesCollection.js.map +1 -0
  348. package/dist/prefill/valuesFromSearchParams.js +5 -9
  349. package/dist/prefill/valuesFromSearchParams.js.map +1 -1
  350. package/dist/presentations/types.d.ts +3 -2
  351. package/dist/react/Form.d.ts +77 -35
  352. package/dist/react/Form.js +368 -222
  353. package/dist/react/Form.js.map +1 -1
  354. package/dist/react/FormContext.d.ts +51 -1
  355. package/dist/react/FormContext.js.map +1 -1
  356. package/dist/react/FormControls.d.ts +55 -0
  357. package/dist/react/FormControls.js +56 -0
  358. package/dist/react/FormControls.js.map +1 -0
  359. package/dist/react/FormFields.d.ts +18 -0
  360. package/dist/react/FormFields.js +114 -0
  361. package/dist/react/FormFields.js.map +1 -0
  362. package/dist/react/FormLayout.d.ts +4 -2
  363. package/dist/react/FormLayout.js +3 -2
  364. package/dist/react/FormLayout.js.map +1 -1
  365. package/dist/react/FormResults.d.ts +8 -3
  366. package/dist/react/FormResults.js +50 -29
  367. package/dist/react/FormResults.js.map +1 -1
  368. package/dist/react/FormSteps.d.ts +17 -0
  369. package/dist/react/FormSteps.js +35 -0
  370. package/dist/react/FormSteps.js.map +1 -0
  371. package/dist/react/Poll.d.ts +40 -6
  372. package/dist/react/Poll.js +137 -33
  373. package/dist/react/Poll.js.map +1 -1
  374. package/dist/react/adapters.d.ts +35 -0
  375. package/dist/react/adapters.js +11 -0
  376. package/dist/react/adapters.js.map +1 -0
  377. package/dist/react/captcha/HcaptchaCaptcha.d.ts +31 -0
  378. package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
  379. package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
  380. package/dist/react/captcha/RecaptchaCaptcha.d.ts +44 -0
  381. package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
  382. package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
  383. package/dist/react/captcha/TurnstileCaptcha.d.ts +31 -0
  384. package/dist/react/captcha/TurnstileCaptcha.js +53 -0
  385. package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
  386. package/dist/react/captcha/types.d.ts +8 -0
  387. package/dist/react/captcha/useCaptchaScript.js +63 -0
  388. package/dist/react/captcha/useCaptchaScript.js.map +1 -0
  389. package/dist/react/captcha/vendors.js +8 -0
  390. package/dist/react/captcha/vendors.js.map +1 -0
  391. package/dist/react/contract.d.ts +2 -3
  392. package/dist/react/contract.js.map +1 -1
  393. package/dist/react/fetchResults.d.ts +1 -1
  394. package/dist/react/fetchResults.js +1 -1
  395. package/dist/react/fetchResults.js.map +1 -1
  396. package/dist/react/presentation/DialogSurface.js +1 -4
  397. package/dist/react/presentation/DialogSurface.js.map +1 -1
  398. package/dist/react/primitives/Checkbox.d.ts +6 -2
  399. package/dist/react/primitives/Checkbox.js +4 -2
  400. package/dist/react/primitives/Checkbox.js.map +1 -1
  401. package/dist/react/primitives/ChoiceGroup.d.ts +40 -0
  402. package/dist/react/primitives/ChoiceGroup.js +33 -0
  403. package/dist/react/primitives/ChoiceGroup.js.map +1 -0
  404. package/dist/react/primitives/FieldShell.d.ts +13 -5
  405. package/dist/react/primitives/FieldShell.js +35 -32
  406. package/dist/react/primitives/FieldShell.js.map +1 -1
  407. package/dist/react/primitives/Input.d.ts +4 -2
  408. package/dist/react/primitives/Input.js +2 -1
  409. package/dist/react/primitives/Input.js.map +1 -1
  410. package/dist/react/renderers/calculation.js +7 -5
  411. package/dist/react/renderers/calculation.js.map +1 -1
  412. package/dist/react/renderers/checkbox.js +3 -5
  413. package/dist/react/renderers/checkbox.js.map +1 -1
  414. package/dist/react/renderers/consent.js +84 -36
  415. package/dist/react/renderers/consent.js.map +1 -1
  416. package/dist/react/renderers/date.js +33 -0
  417. package/dist/react/renderers/date.js.map +1 -0
  418. package/dist/react/renderers/email.js +4 -5
  419. package/dist/react/renderers/email.js.map +1 -1
  420. package/dist/react/renderers/file.js +29 -14
  421. package/dist/react/renderers/file.js.map +1 -1
  422. package/dist/react/renderers/index.js +7 -0
  423. package/dist/react/renderers/index.js.map +1 -1
  424. package/dist/react/renderers/message.js +41 -0
  425. package/dist/react/renderers/message.js.map +1 -0
  426. package/dist/react/renderers/number.js +1 -4
  427. package/dist/react/renderers/number.js.map +1 -1
  428. package/dist/react/renderers/region.js +43 -0
  429. package/dist/react/renderers/region.js.map +1 -0
  430. package/dist/react/renderers/repeater.js +32 -14
  431. package/dist/react/renderers/repeater.js.map +1 -1
  432. package/dist/react/renderers/select.js +21 -6
  433. package/dist/react/renderers/select.js.map +1 -1
  434. package/dist/react/renderers/text.js +4 -5
  435. package/dist/react/renderers/text.js.map +1 -1
  436. package/dist/react/renderers/textarea.js +1 -4
  437. package/dist/react/renderers/textarea.js.map +1 -1
  438. package/dist/react/state.d.ts +46 -3
  439. package/dist/react/state.js +73 -10
  440. package/dist/react/state.js.map +1 -1
  441. package/dist/react/submitForm.js +1 -1
  442. package/dist/react/submitForm.js.map +1 -1
  443. package/dist/react/uploadFile.d.ts +2 -2
  444. package/dist/react/uploadFile.js +1 -1
  445. package/dist/react/uploadFile.js.map +1 -1
  446. package/dist/react/useCalcValues.d.ts +10 -0
  447. package/dist/react/useCalcValues.js +13 -0
  448. package/dist/react/useCalcValues.js.map +1 -0
  449. package/dist/react/useField.d.ts +0 -1
  450. package/dist/react/useField.js +7 -6
  451. package/dist/react/useField.js.map +1 -1
  452. package/dist/react/useFormState.d.ts +1 -1
  453. package/dist/react/useFormState.js +1 -1
  454. package/dist/react/useFormState.js.map +1 -1
  455. package/dist/react/validateField.js +3 -6
  456. package/dist/react/validateField.js.map +1 -1
  457. package/dist/recall/interpolate.d.ts +4 -3
  458. package/dist/recall/interpolate.js +5 -4
  459. package/dist/recall/interpolate.js.map +1 -1
  460. package/dist/recall/resolver.d.ts +1 -1
  461. package/dist/recall/resolver.js +15 -3
  462. package/dist/recall/resolver.js.map +1 -1
  463. package/dist/spam/captcha.d.ts +4 -3
  464. package/dist/spam/captcha.js +4 -3
  465. package/dist/spam/captcha.js.map +1 -1
  466. package/dist/spam/clientIp.js +9 -0
  467. package/dist/spam/clientIp.js.map +1 -0
  468. package/dist/spam/constants.js +13 -1
  469. package/dist/spam/constants.js.map +1 -1
  470. package/dist/spam/identify.js +3 -6
  471. package/dist/spam/identify.js.map +1 -1
  472. package/dist/spam/providers/hcaptcha.d.ts +17 -0
  473. package/dist/spam/providers/hcaptcha.js +18 -0
  474. package/dist/spam/providers/hcaptcha.js.map +1 -0
  475. package/dist/spam/providers/recaptcha.d.ts +23 -0
  476. package/dist/spam/providers/recaptcha.js +23 -0
  477. package/dist/spam/providers/recaptcha.js.map +1 -0
  478. package/dist/spam/providers/siteverify.js +34 -0
  479. package/dist/spam/providers/siteverify.js.map +1 -0
  480. package/dist/spam/providers/turnstile.d.ts +17 -0
  481. package/dist/spam/providers/turnstile.js +18 -0
  482. package/dist/spam/providers/turnstile.js.map +1 -0
  483. package/dist/spam/resolveSpam.js +2 -1
  484. package/dist/spam/resolveSpam.js.map +1 -1
  485. package/dist/spam/spamGuard.js +25 -11
  486. package/dist/spam/spamGuard.js.map +1 -1
  487. package/dist/spam/types.d.ts +19 -4
  488. package/dist/submissions/SubmissionAnswers.js +6 -2
  489. package/dist/submissions/SubmissionAnswers.js.map +1 -1
  490. package/dist/submissions/SubmissionAnswersClient.js +100 -64
  491. package/dist/submissions/SubmissionAnswersClient.js.map +1 -1
  492. package/dist/submissions/coerceBoolean.js +14 -0
  493. package/dist/submissions/coerceBoolean.js.map +1 -0
  494. package/dist/submissions/createSubmission.d.ts +36 -0
  495. package/dist/submissions/createSubmission.js +26 -0
  496. package/dist/submissions/createSubmission.js.map +1 -0
  497. package/dist/submissions/formIdOf.js +13 -0
  498. package/dist/submissions/formIdOf.js.map +1 -0
  499. package/dist/submissions/resolveVotedSubmission.d.ts +27 -0
  500. package/dist/submissions/resolveVotedSubmission.js +51 -0
  501. package/dist/submissions/resolveVotedSubmission.js.map +1 -0
  502. package/dist/submissions/runSubmission.d.ts +10 -0
  503. package/dist/submissions/runSubmission.js +104 -54
  504. package/dist/submissions/runSubmission.js.map +1 -1
  505. package/dist/submissions/types.d.ts +11 -4
  506. package/dist/submissions/validateSubmission.js +99 -13
  507. package/dist/submissions/validateSubmission.js.map +1 -1
  508. package/dist/submissions/verifyContext.js +35 -0
  509. package/dist/submissions/verifyContext.js.map +1 -0
  510. package/dist/submissions/voteChangeEndpoint.js +105 -0
  511. package/dist/submissions/voteChangeEndpoint.js.map +1 -0
  512. package/dist/submissions/votedCookie.d.ts +15 -0
  513. package/dist/submissions/votedCookie.js +74 -0
  514. package/dist/submissions/votedCookie.js.map +1 -0
  515. package/dist/translations/clientRuntimeKeys.d.ts +17 -0
  516. package/dist/translations/clientRuntimeKeys.js +48 -0
  517. package/dist/translations/clientRuntimeKeys.js.map +1 -0
  518. package/dist/translations/de.d.ts +12 -0
  519. package/dist/translations/de.js +380 -0
  520. package/dist/translations/de.js.map +1 -0
  521. package/dist/translations/en.js +250 -28
  522. package/dist/translations/en.js.map +1 -1
  523. package/dist/translations/index.d.ts +14 -5
  524. package/dist/translations/index.js +14 -3
  525. package/dist/translations/index.js.map +1 -1
  526. package/dist/translations/keys.d.ts +245 -23
  527. package/dist/translations/keys.js +246 -24
  528. package/dist/translations/keys.js.map +1 -1
  529. package/dist/translations/makeTranslate.d.ts +7 -3
  530. package/dist/translations/makeTranslate.js +12 -3
  531. package/dist/translations/makeTranslate.js.map +1 -1
  532. package/dist/translations/server.js +8 -1
  533. package/dist/translations/server.js.map +1 -1
  534. package/dist/uploads/captureFileRef.d.ts +10 -3
  535. package/dist/uploads/captureFileRef.js +18 -9
  536. package/dist/uploads/captureFileRef.js.map +1 -1
  537. package/dist/uploads/formatBytes.d.ts +9 -0
  538. package/dist/uploads/formatBytes.js +25 -0
  539. package/dist/uploads/formatBytes.js.map +1 -0
  540. package/dist/uploads/resolveFileRef.js +3 -2
  541. package/dist/uploads/resolveFileRef.js.map +1 -1
  542. package/dist/uploads/types.d.ts +1 -2
  543. package/dist/validation/buildRuleBlocks.js +18 -17
  544. package/dist/validation/buildRuleBlocks.js.map +1 -1
  545. package/dist/validation/builtin/email.js +2 -1
  546. package/dist/validation/builtin/email.js.map +1 -1
  547. package/dist/validation/builtin/index.d.ts +14 -0
  548. package/dist/validation/builtin/index.js +14 -1
  549. package/dist/validation/builtin/index.js.map +1 -1
  550. package/dist/validation/builtin/integer.js +15 -0
  551. package/dist/validation/builtin/integer.js.map +1 -0
  552. package/dist/validation/builtin/matchesField.js +3 -7
  553. package/dist/validation/builtin/matchesField.js.map +1 -1
  554. package/dist/validation/builtin/max.js +1 -0
  555. package/dist/validation/builtin/max.js.map +1 -1
  556. package/dist/validation/builtin/maxDate.js +24 -0
  557. package/dist/validation/builtin/maxDate.js.map +1 -0
  558. package/dist/validation/builtin/maxLength.js +1 -0
  559. package/dist/validation/builtin/maxLength.js.map +1 -1
  560. package/dist/validation/builtin/min.js +1 -0
  561. package/dist/validation/builtin/min.js.map +1 -1
  562. package/dist/validation/builtin/minDate.js +24 -0
  563. package/dist/validation/builtin/minDate.js.map +1 -0
  564. package/dist/validation/builtin/minLength.js +1 -0
  565. package/dist/validation/builtin/minLength.js.map +1 -1
  566. package/dist/validation/builtin/notAlreadySubmitted.js +5 -1
  567. package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
  568. package/dist/validation/builtin/oneOf.js +1 -0
  569. package/dist/validation/builtin/oneOf.js.map +1 -1
  570. package/dist/validation/builtin/pattern.js +11 -2
  571. package/dist/validation/builtin/pattern.js.map +1 -1
  572. package/dist/validation/builtin/url.js +1 -0
  573. package/dist/validation/builtin/url.js.map +1 -1
  574. package/dist/validation/builtin/validateDateBound.js +18 -0
  575. package/dist/validation/builtin/validateDateBound.js.map +1 -0
  576. package/dist/validation/builtin/validateRegexParams.js +44 -0
  577. package/dist/validation/builtin/validateRegexParams.js.map +1 -0
  578. package/dist/validation/emailPattern.js +10 -0
  579. package/dist/validation/emailPattern.js.map +1 -0
  580. package/dist/validation/fieldTargetParam.d.ts +22 -0
  581. package/dist/validation/fieldTargetParam.js +38 -0
  582. package/dist/validation/fieldTargetParam.js.map +1 -0
  583. package/dist/validation/registry.d.ts +2 -1
  584. package/dist/validation/registry.js +2 -9
  585. package/dist/validation/registry.js.map +1 -1
  586. package/dist/validation/runValidation.js +8 -29
  587. package/dist/validation/runValidation.js.map +1 -1
  588. package/dist/validation/types.d.ts +5 -11
  589. package/dist/validation/validateUrl.js +22 -0
  590. package/dist/validation/validateUrl.js.map +1 -0
  591. package/package.json +14 -6
  592. package/styles/form-builder.css +94 -190
  593. package/dist/collections/uploads.d.ts +0 -30
  594. package/dist/collections/uploads.js +0 -55
  595. package/dist/collections/uploads.js.map +0 -1
  596. package/dist/consent/buildConsentSourceConfig.js +0 -49
  597. package/dist/consent/buildConsentSourceConfig.js.map +0 -1
  598. package/dist/consent/builtin/index.d.ts +0 -7
  599. package/dist/consent/builtin/index.js +0 -11
  600. package/dist/consent/builtin/index.js.map +0 -1
  601. package/dist/consent/builtin/pageReference.js +0 -75
  602. package/dist/consent/builtin/pageReference.js.map +0 -1
  603. package/dist/consent/builtin/static.js +0 -44
  604. package/dist/consent/builtin/static.js.map +0 -1
  605. package/dist/consent/defineConsentSource.d.ts +0 -35
  606. package/dist/consent/defineConsentSource.js +0 -6
  607. package/dist/consent/defineConsentSource.js.map +0 -1
  608. package/dist/consent/registry.d.ts +0 -16
  609. package/dist/consent/registry.js +0 -16
  610. package/dist/consent/registry.js.map +0 -1
  611. package/dist/consent/resolveConsentLinks.d.ts +0 -19
  612. package/dist/consent/resolveConsentLinks.js +0 -26
  613. package/dist/consent/resolveConsentLinks.js.map +0 -1
  614. package/dist/presentations/registry.d.ts +0 -15
  615. package/dist/presentations/registry.js +0 -15
  616. package/dist/presentations/registry.js.map +0 -1
  617. package/dist/react/toFormDocument.d.ts +0 -24
  618. package/dist/react/toFormDocument.js +0 -22
  619. package/dist/react/toFormDocument.js.map +0 -1
@@ -1,24 +1,199 @@
1
1
  import { keys } from "../../translations/keys.js";
2
- import { labelFor } from "../../translations/server.js";
2
+ import { asTranslate, labelFor } from "../../translations/server.js";
3
+ import { localizedIf } from "../localizedIf.js";
4
+ import { CALC_FNS, CALC_OPS } from "../../calc/types.js";
5
+ import { formatCalcValue } from "../../calc/formatCalcValue.js";
6
+ import { normalizeCalc } from "../../calc/normalizeCalc.js";
3
7
  import { defineFormField } from "../defineFormField.js";
4
8
  //#region src/fields/builtin/calculation.ts
5
- const calculationField = defineFormField({
6
- type: "calculation",
7
- label: keys.fieldTypeCalculation,
8
- value: "number",
9
- config: [{
10
- name: "expression",
11
- type: "json",
12
- label: labelFor(keys.configExpression)
13
- }, {
14
- name: "calcDisplay",
15
- type: "checkbox",
16
- defaultValue: true,
17
- label: labelFor(keys.configCalcDisplay)
18
- }],
19
- format: ({ value }) => value == null ? "" : String(value)
20
- });
9
+ /**
10
+ * Editor-facing JSON schema for `CalcExpression` (src/calc/types.ts), used by the admin JSON
11
+ * field's Monaco editor for autocomplete and inline diagnostics. Built per boot so registered
12
+ * extension names (custom functions, source keys) autocomplete too. The real validity gate is
13
+ * `buildValidateExpression`/`normalizeCalc`; this schema is a convenience, not the source of truth.
14
+ */
15
+ const buildCalcExpressionSchema = (allowed) => {
16
+ const sourceKeys = [...allowed?.sources ?? []];
17
+ const fnNames = [...CALC_FNS, ...allowed?.functions ?? []];
18
+ return {
19
+ uri: "https://10xmedia.de/schemas/form-builder/calc-expression.json",
20
+ fileMatch: ["https://10xmedia.de/schemas/form-builder/calc-expression.json"],
21
+ schema: {
22
+ $ref: "#/definitions/expr",
23
+ definitions: {
24
+ expr: { oneOf: [
25
+ { $ref: "#/definitions/lit" },
26
+ { $ref: "#/definitions/ref" },
27
+ { $ref: "#/definitions/op" },
28
+ { $ref: "#/definitions/neg" },
29
+ { $ref: "#/definitions/fn" },
30
+ { $ref: "#/definitions/weight" },
31
+ ...sourceKeys.length > 0 ? [{ $ref: "#/definitions/source" }] : []
32
+ ] },
33
+ lit: {
34
+ type: "object",
35
+ properties: {
36
+ type: { enum: ["lit"] },
37
+ value: { type: "number" }
38
+ },
39
+ required: ["type", "value"],
40
+ additionalProperties: false
41
+ },
42
+ ref: {
43
+ type: "object",
44
+ properties: {
45
+ type: { enum: ["ref"] },
46
+ field: { type: "string" }
47
+ },
48
+ required: ["type", "field"],
49
+ additionalProperties: false
50
+ },
51
+ op: {
52
+ type: "object",
53
+ properties: {
54
+ type: { enum: ["op"] },
55
+ op: { enum: [...CALC_OPS] },
56
+ left: { $ref: "#/definitions/expr" },
57
+ right: { $ref: "#/definitions/expr" }
58
+ },
59
+ required: [
60
+ "type",
61
+ "op",
62
+ "left",
63
+ "right"
64
+ ],
65
+ additionalProperties: false
66
+ },
67
+ neg: {
68
+ type: "object",
69
+ properties: {
70
+ type: { enum: ["neg"] },
71
+ operand: { $ref: "#/definitions/expr" }
72
+ },
73
+ required: ["type", "operand"],
74
+ additionalProperties: false
75
+ },
76
+ fn: {
77
+ type: "object",
78
+ properties: {
79
+ type: { enum: ["fn"] },
80
+ fn: { enum: fnNames },
81
+ args: {
82
+ type: "array",
83
+ items: { $ref: "#/definitions/expr" }
84
+ }
85
+ },
86
+ required: [
87
+ "type",
88
+ "fn",
89
+ "args"
90
+ ],
91
+ additionalProperties: false
92
+ },
93
+ ...sourceKeys.length > 0 ? { source: {
94
+ type: "object",
95
+ properties: {
96
+ type: { enum: ["source"] },
97
+ source: { enum: sourceKeys }
98
+ },
99
+ required: ["type", "source"],
100
+ additionalProperties: false
101
+ } } : {},
102
+ weight: {
103
+ type: "object",
104
+ properties: {
105
+ type: { enum: ["weight"] },
106
+ field: { type: "string" },
107
+ weights: {
108
+ type: "object",
109
+ additionalProperties: { type: "number" }
110
+ },
111
+ ...sourceKeys.length > 0 ? { source: { enum: sourceKeys } } : {}
112
+ },
113
+ required: sourceKeys.length > 0 ? ["type", "field"] : [
114
+ "type",
115
+ "field",
116
+ "weights"
117
+ ],
118
+ additionalProperties: false
119
+ }
120
+ }
121
+ }
122
+ };
123
+ };
124
+ /**
125
+ * Validates the calculation field's `expression` against the registered extension names: unset/empty
126
+ * is fine, otherwise it must normalize into a well-formed `CalcExpression` tree.
127
+ */
128
+ const buildValidateExpression = (allowed) => (value, { req }) => {
129
+ if (value == null || value === "") return true;
130
+ return normalizeCalc(value, allowed) !== void 0 ? true : asTranslate(req.t)(keys.validationCalcExpressionInvalid);
131
+ };
132
+ /**
133
+ * A calculation is derived and read-only: it renders disabled with no text affordance (no
134
+ * `placeholder`), and it is never validated (`runSubmission` stores its computed value and skips
135
+ * `runValidation` entirely), so an authored `required` could never fire. Both are omitted rather
136
+ * than offered as settings that do nothing. `allowed` threads the registered calc extension names
137
+ * (plugin option `calc`) into the expression validate and the editor schema; `extras.sources`
138
+ * carries serializable source metadata to the builder component as clientProps (custom function
139
+ * names travel too, so the client-side normalize accepts every expression the server accepts).
140
+ */
141
+ const buildCalculationField = (allowed, extras) => {
142
+ const sources = extras?.sources ?? [];
143
+ const functions = [...allowed?.functions ?? []];
144
+ const builderRef = "@10x-media/form-builder/client#CalcExpressionBuilder";
145
+ return defineFormField({
146
+ type: "calculation",
147
+ label: keys.fieldTypeCalculation,
148
+ value: "number",
149
+ omitShared: ["placeholder", "required"],
150
+ config: [
151
+ {
152
+ name: "expression",
153
+ type: "json",
154
+ label: labelFor(keys.configExpression),
155
+ admin: { components: { Field: sources.length > 0 || functions.length > 0 ? {
156
+ path: builderRef,
157
+ clientProps: {
158
+ sources,
159
+ functions
160
+ }
161
+ } : builderRef } },
162
+ jsonSchema: buildCalcExpressionSchema(allowed),
163
+ typescriptSchema: [() => ({ type: "object" })],
164
+ validate: buildValidateExpression(allowed)
165
+ },
166
+ {
167
+ name: "calcDisplay",
168
+ type: "checkbox",
169
+ defaultValue: true,
170
+ label: labelFor(keys.configCalcDisplay)
171
+ },
172
+ {
173
+ name: "decimals",
174
+ type: "number",
175
+ min: 0,
176
+ max: 6,
177
+ label: labelFor(keys.calcConfigDecimals)
178
+ },
179
+ {
180
+ name: "prefix",
181
+ type: "text",
182
+ label: labelFor(keys.calcConfigPrefix),
183
+ ...localizedIf(extras?.localize === true)
184
+ },
185
+ {
186
+ name: "suffix",
187
+ type: "text",
188
+ label: labelFor(keys.calcConfigSuffix),
189
+ ...localizedIf(extras?.localize === true)
190
+ }
191
+ ],
192
+ format: ({ value, config }) => value == null ? "" : formatCalcValue(value, config)
193
+ });
194
+ };
195
+ buildCalculationField();
21
196
  //#endregion
22
- export { calculationField };
197
+ export { buildCalculationField };
23
198
 
24
199
  //# sourceMappingURL=calculation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculation.js","names":[],"sources":["../../../src/fields/builtin/calculation.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { labelFor } from '../../translations/server'\nimport { defineFormField } from '../defineFormField'\n\nexport const calculationField = defineFormField<'number'>({\n\ttype: 'calculation',\n\tlabel: keys.fieldTypeCalculation,\n\tvalue: 'number',\n\tconfig: [\n\t\t{ name: 'expression', type: 'json', label: labelFor(keys.configExpression) },\n\t\t{\n\t\t\tname: 'calcDisplay',\n\t\t\ttype: 'checkbox',\n\t\t\tdefaultValue: true,\n\t\t\tlabel: labelFor(keys.configCalcDisplay),\n\t\t},\n\t],\n\tformat: ({ value }) => (value == null ? '' : String(value)),\n})\n"],"mappings":";;;;AAIA,MAAa,mBAAmB,gBAA0B;CACzD,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,QAAQ,CACP;EAAE,MAAM;EAAc,MAAM;EAAQ,OAAO,SAAS,KAAK,gBAAgB;CAAE,GAC3E;EACC,MAAM;EACN,MAAM;EACN,cAAc;EACd,OAAO,SAAS,KAAK,iBAAiB;CACvC,CACD;CACA,SAAS,EAAE,YAAa,SAAS,OAAO,KAAK,OAAO,KAAK;AAC1D,CAAC"}
1
+ {"version":3,"file":"calculation.js","names":[],"sources":["../../../src/fields/builtin/calculation.ts"],"sourcesContent":["import type { JSONField, PayloadRequest } from 'payload'\nimport { formatCalcValue } from '../../calc/formatCalcValue'\nimport { type CalcAllowed, normalizeCalc } from '../../calc/normalizeCalc'\nimport { CALC_FNS, CALC_OPS } from '../../calc/types'\nimport { keys } from '../../translations/keys'\nimport { asTranslate, labelFor } from '../../translations/server'\nimport { defineFormField } from '../defineFormField'\nimport { localizedIf } from '../localizedIf'\n\n/**\n * Serializable calc-source metadata for the admin builder (threaded as clientProps): key, display\n * label, and which modes the source implements (`scalar` = has `resolve`, `weights` = has\n * `resolveWeights`). Derived where the registry is resolved; resolver functions never serialize.\n */\nexport type CalcSourceClientMeta = {\n\tkey: string\n\tlabel: string | Record<string, string>\n\tscalar: boolean\n\tweights: boolean\n}\n\ntype BuildCalculationFieldExtras = {\n\t/** Whether content-bearing display config (`prefix`, `suffix`) is localized. */\n\tlocalize?: boolean\n\t/** Registered calc-source metadata for the builder UI. */\n\tsources?: CalcSourceClientMeta[]\n}\n\n/** The calculation field's own config values (display settings; `expression` is handled separately). */\ntype CalculationConfig = {\n\tdecimals?: number\n\tprefix?: string\n\tsuffix?: string\n}\n\ntype CalcExpressionSchema = NonNullable<JSONField['jsonSchema']>\n\n/**\n * Editor-facing JSON schema for `CalcExpression` (src/calc/types.ts), used by the admin JSON\n * field's Monaco editor for autocomplete and inline diagnostics. Built per boot so registered\n * extension names (custom functions, source keys) autocomplete too. The real validity gate is\n * `buildValidateExpression`/`normalizeCalc`; this schema is a convenience, not the source of truth.\n */\nconst buildCalcExpressionSchema = (allowed?: CalcAllowed): CalcExpressionSchema => {\n\tconst sourceKeys = [...(allowed?.sources ?? [])]\n\tconst fnNames = [...CALC_FNS, ...(allowed?.functions ?? [])]\n\treturn {\n\t\turi: 'https://10xmedia.de/schemas/form-builder/calc-expression.json',\n\t\tfileMatch: ['https://10xmedia.de/schemas/form-builder/calc-expression.json'],\n\t\tschema: {\n\t\t\t$ref: '#/definitions/expr',\n\t\t\tdefinitions: {\n\t\t\t\texpr: {\n\t\t\t\t\toneOf: [\n\t\t\t\t\t\t{ $ref: '#/definitions/lit' },\n\t\t\t\t\t\t{ $ref: '#/definitions/ref' },\n\t\t\t\t\t\t{ $ref: '#/definitions/op' },\n\t\t\t\t\t\t{ $ref: '#/definitions/neg' },\n\t\t\t\t\t\t{ $ref: '#/definitions/fn' },\n\t\t\t\t\t\t{ $ref: '#/definitions/weight' },\n\t\t\t\t\t\t...(sourceKeys.length > 0 ? [{ $ref: '#/definitions/source' }] : []),\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlit: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: { type: { enum: ['lit'] }, value: { type: 'number' } },\n\t\t\t\t\trequired: ['type', 'value'],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\tref: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: { type: { enum: ['ref'] }, field: { type: 'string' } },\n\t\t\t\t\trequired: ['type', 'field'],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\top: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { enum: ['op'] },\n\t\t\t\t\t\top: { enum: [...CALC_OPS] },\n\t\t\t\t\t\tleft: { $ref: '#/definitions/expr' },\n\t\t\t\t\t\tright: { $ref: '#/definitions/expr' },\n\t\t\t\t\t},\n\t\t\t\t\trequired: ['type', 'op', 'left', 'right'],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\tneg: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: { type: { enum: ['neg'] }, operand: { $ref: '#/definitions/expr' } },\n\t\t\t\t\trequired: ['type', 'operand'],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\tfn: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { enum: ['fn'] },\n\t\t\t\t\t\tfn: { enum: fnNames },\n\t\t\t\t\t\targs: { type: 'array', items: { $ref: '#/definitions/expr' } },\n\t\t\t\t\t},\n\t\t\t\t\trequired: ['type', 'fn', 'args'],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\t...(sourceKeys.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\ttype: 'object',\n\t\t\t\t\t\t\t\tproperties: { type: { enum: ['source'] }, source: { enum: sourceKeys } },\n\t\t\t\t\t\t\t\trequired: ['type', 'source'],\n\t\t\t\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\tweight: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { enum: ['weight'] },\n\t\t\t\t\t\tfield: { type: 'string' },\n\t\t\t\t\t\tweights: { type: 'object', additionalProperties: { type: 'number' } },\n\t\t\t\t\t\t...(sourceKeys.length > 0 ? { source: { enum: sourceKeys } } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t// With sources registered a weight may carry `source` instead of inline weights; the\n\t\t\t\t\t// either-or itself is enforced by normalizeCalc, not this convenience schema.\n\t\t\t\t\trequired: sourceKeys.length > 0 ? ['type', 'field'] : ['type', 'field', 'weights'],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n}\n\n/**\n * Validates the calculation field's `expression` against the registered extension names: unset/empty\n * is fine, otherwise it must normalize into a well-formed `CalcExpression` tree.\n */\nexport const buildValidateExpression =\n\t(allowed?: CalcAllowed) =>\n\t(value: unknown, { req }: { data?: unknown; req: PayloadRequest }): string | true => {\n\t\tif (value == null || value === '') {\n\t\t\treturn true\n\t\t}\n\t\treturn normalizeCalc(value, allowed) !== undefined\n\t\t\t? true\n\t\t\t: asTranslate(req.t)(keys.validationCalcExpressionInvalid)\n\t}\n\n/** The no-extensions validate (built-in grammar only). Exported for unit testing and spread consumers. */\nexport const validateExpression = buildValidateExpression()\n\n/**\n * A calculation is derived and read-only: it renders disabled with no text affordance (no\n * `placeholder`), and it is never validated (`runSubmission` stores its computed value and skips\n * `runValidation` entirely), so an authored `required` could never fire. Both are omitted rather\n * than offered as settings that do nothing. `allowed` threads the registered calc extension names\n * (plugin option `calc`) into the expression validate and the editor schema; `extras.sources`\n * carries serializable source metadata to the builder component as clientProps (custom function\n * names travel too, so the client-side normalize accepts every expression the server accepts).\n */\nexport const buildCalculationField = (\n\tallowed?: CalcAllowed,\n\textras?: BuildCalculationFieldExtras\n) => {\n\tconst sources = extras?.sources ?? []\n\tconst functions = [...(allowed?.functions ?? [])]\n\tconst builderRef = '@10x-media/form-builder/client#CalcExpressionBuilder'\n\treturn defineFormField<'number', CalculationConfig>({\n\t\ttype: 'calculation',\n\t\tlabel: keys.fieldTypeCalculation,\n\t\tvalue: 'number',\n\t\tomitShared: ['placeholder', 'required'],\n\t\tconfig: [\n\t\t\t{\n\t\t\t\tname: 'expression',\n\t\t\t\ttype: 'json',\n\t\t\t\tlabel: labelFor(keys.configExpression),\n\t\t\t\tadmin: {\n\t\t\t\t\tcomponents: {\n\t\t\t\t\t\tField:\n\t\t\t\t\t\t\tsources.length > 0 || functions.length > 0\n\t\t\t\t\t\t\t\t? { path: builderRef, clientProps: { sources, functions } }\n\t\t\t\t\t\t\t\t: builderRef,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tjsonSchema: buildCalcExpressionSchema(allowed),\n\t\t\t\t// generate:types embeds jsonSchema.schema into the config-level schema, where its\n\t\t\t\t// document-root-relative $refs cannot resolve; hand type generation a flat shape instead.\n\t\t\t\ttypescriptSchema: [() => ({ type: 'object' })],\n\t\t\t\tvalidate: buildValidateExpression(allowed),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'calcDisplay',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tdefaultValue: true,\n\t\t\t\tlabel: labelFor(keys.configCalcDisplay),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'decimals',\n\t\t\t\ttype: 'number',\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 6,\n\t\t\t\tlabel: labelFor(keys.calcConfigDecimals),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'prefix',\n\t\t\t\ttype: 'text',\n\t\t\t\tlabel: labelFor(keys.calcConfigPrefix),\n\t\t\t\t...localizedIf(extras?.localize === true),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'suffix',\n\t\t\t\ttype: 'text',\n\t\t\t\tlabel: labelFor(keys.calcConfigSuffix),\n\t\t\t\t...localizedIf(extras?.localize === true),\n\t\t\t},\n\t\t],\n\t\tformat: ({ value, config }) => (value == null ? '' : formatCalcValue(value, config)),\n\t})\n}\n\n/** The no-extensions definition, for definition-spread consumers (the `buildSelectField`/`selectField` precedent). */\nexport const calculationField = buildCalculationField()\n"],"mappings":";;;;;;;;;;;;;;AA2CA,MAAM,6BAA6B,YAAgD;CAClF,MAAM,aAAa,CAAC,GAAI,SAAS,WAAW,CAAC,CAAE;CAC/C,MAAM,UAAU,CAAC,GAAG,UAAU,GAAI,SAAS,aAAa,CAAC,CAAE;CAC3D,OAAO;EACN,KAAK;EACL,WAAW,CAAC,+DAA+D;EAC3E,QAAQ;GACP,MAAM;GACN,aAAa;IACZ,MAAM,EACL,OAAO;KACN,EAAE,MAAM,oBAAoB;KAC5B,EAAE,MAAM,oBAAoB;KAC5B,EAAE,MAAM,mBAAmB;KAC3B,EAAE,MAAM,oBAAoB;KAC5B,EAAE,MAAM,mBAAmB;KAC3B,EAAE,MAAM,uBAAuB;KAC/B,GAAI,WAAW,SAAS,IAAI,CAAC,EAAE,MAAM,uBAAuB,CAAC,IAAI,CAAC;IACnE,EACD;IACA,KAAK;KACJ,MAAM;KACN,YAAY;MAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE;MAAG,OAAO,EAAE,MAAM,SAAS;KAAE;KACjE,UAAU,CAAC,QAAQ,OAAO;KAC1B,sBAAsB;IACvB;IACA,KAAK;KACJ,MAAM;KACN,YAAY;MAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE;MAAG,OAAO,EAAE,MAAM,SAAS;KAAE;KACjE,UAAU,CAAC,QAAQ,OAAO;KAC1B,sBAAsB;IACvB;IACA,IAAI;KACH,MAAM;KACN,YAAY;MACX,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;MACrB,IAAI,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAE;MAC1B,MAAM,EAAE,MAAM,qBAAqB;MACnC,OAAO,EAAE,MAAM,qBAAqB;KACrC;KACA,UAAU;MAAC;MAAQ;MAAM;MAAQ;KAAO;KACxC,sBAAsB;IACvB;IACA,KAAK;KACJ,MAAM;KACN,YAAY;MAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE;MAAG,SAAS,EAAE,MAAM,qBAAqB;KAAE;KAC/E,UAAU,CAAC,QAAQ,SAAS;KAC5B,sBAAsB;IACvB;IACA,IAAI;KACH,MAAM;KACN,YAAY;MACX,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;MACrB,IAAI,EAAE,MAAM,QAAQ;MACpB,MAAM;OAAE,MAAM;OAAS,OAAO,EAAE,MAAM,qBAAqB;MAAE;KAC9D;KACA,UAAU;MAAC;MAAQ;MAAM;KAAM;KAC/B,sBAAsB;IACvB;IACA,GAAI,WAAW,SAAS,IACrB,EACA,QAAQ;KACP,MAAM;KACN,YAAY;MAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;MAAG,QAAQ,EAAE,MAAM,WAAW;KAAE;KACvE,UAAU,CAAC,QAAQ,QAAQ;KAC3B,sBAAsB;IACvB,EACD,IACC,CAAC;IACJ,QAAQ;KACP,MAAM;KACN,YAAY;MACX,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;MACzB,OAAO,EAAE,MAAM,SAAS;MACxB,SAAS;OAAE,MAAM;OAAU,sBAAsB,EAAE,MAAM,SAAS;MAAE;MACpE,GAAI,WAAW,SAAS,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,EAAE,IAAI,CAAC;KACjE;KAGA,UAAU,WAAW,SAAS,IAAI,CAAC,QAAQ,OAAO,IAAI;MAAC;MAAQ;MAAS;KAAS;KACjF,sBAAsB;IACvB;GACD;EACD;CACD;AACD;;;;;AAMA,MAAa,2BACX,aACA,OAAgB,EAAE,UAAkE;CACpF,IAAI,SAAS,QAAQ,UAAU,IAC9B,OAAO;CAER,OAAO,cAAc,OAAO,OAAO,MAAM,KAAA,IACtC,OACA,YAAY,IAAI,CAAC,EAAE,KAAK,+BAA+B;AAC3D;;;;;;;;;;AAcD,MAAa,yBACZ,SACA,WACI;CACJ,MAAM,UAAU,QAAQ,WAAW,CAAC;CACpC,MAAM,YAAY,CAAC,GAAI,SAAS,aAAa,CAAC,CAAE;CAChD,MAAM,aAAa;CACnB,OAAO,gBAA6C;EACnD,MAAM;EACN,OAAO,KAAK;EACZ,OAAO;EACP,YAAY,CAAC,eAAe,UAAU;EACtC,QAAQ;GACP;IACC,MAAM;IACN,MAAM;IACN,OAAO,SAAS,KAAK,gBAAgB;IACrC,OAAO,EACN,YAAY,EACX,OACC,QAAQ,SAAS,KAAK,UAAU,SAAS,IACtC;KAAE,MAAM;KAAY,aAAa;MAAE;MAAS;KAAU;IAAE,IACxD,WACL,EACD;IACA,YAAY,0BAA0B,OAAO;IAG7C,kBAAkB,QAAQ,EAAE,MAAM,SAAS,EAAE;IAC7C,UAAU,wBAAwB,OAAO;GAC1C;GACA;IACC,MAAM;IACN,MAAM;IACN,cAAc;IACd,OAAO,SAAS,KAAK,iBAAiB;GACvC;GACA;IACC,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,OAAO,SAAS,KAAK,kBAAkB;GACxC;GACA;IACC,MAAM;IACN,MAAM;IACN,OAAO,SAAS,KAAK,gBAAgB;IACrC,GAAG,YAAY,QAAQ,aAAa,IAAI;GACzC;GACA;IACC,MAAM;IACN,MAAM;IACN,OAAO,SAAS,KAAK,gBAAgB;IACrC,GAAG,YAAY,QAAQ,aAAa,IAAI;GACzC;EACD;EACA,SAAS,EAAE,OAAO,aAAc,SAAS,OAAO,KAAK,gBAAgB,OAAO,MAAM;CACnF,CAAC;AACF;AAGgC,sBAAsB"}
@@ -1,10 +1,33 @@
1
1
  import { keys } from "../../translations/keys.js";
2
+ import { labelFor } from "../../translations/server.js";
2
3
  import { defineFormField } from "../defineFormField.js";
3
4
  //#region src/fields/builtin/checkbox.ts
5
+ /**
6
+ * A checkbox renders as a lone box with no free-text affordance, so `placeholder` is never read.
7
+ * The intrinsic validator owns `required`: the engine's shared required guard only fires on an
8
+ * empty value, and `false` (checked, then unchecked) is a present one, so without this a required
9
+ * checkbox would accept an explicit refusal.
10
+ */
4
11
  const checkboxField = defineFormField({
5
12
  type: "checkbox",
6
13
  label: keys.fieldTypeCheckbox,
7
14
  value: "boolean",
15
+ omitShared: ["placeholder"],
16
+ config: [{
17
+ name: "display",
18
+ type: "select",
19
+ defaultValue: "checkbox",
20
+ label: labelFor(keys.configCheckboxDisplay),
21
+ admin: { isClearable: false },
22
+ options: [{
23
+ label: labelFor(keys.checkboxDisplayCheckbox),
24
+ value: "checkbox"
25
+ }, {
26
+ label: labelFor(keys.checkboxDisplaySwitch),
27
+ value: "switch"
28
+ }]
29
+ }],
30
+ validate: ({ value, config, t }) => config.required === true && value !== true ? t(keys.validationRequired) : true,
8
31
  format: ({ value, t }) => value ? t(keys.formatYes) : t(keys.formatNo)
9
32
  });
10
33
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","names":[],"sources":["../../../src/fields/builtin/checkbox.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineFormField } from '../defineFormField'\n\nexport const checkboxField = defineFormField<'boolean'>({\n\ttype: 'checkbox',\n\tlabel: keys.fieldTypeCheckbox,\n\tvalue: 'boolean',\n\tformat: ({ value, t }) => (value ? t(keys.formatYes) : t(keys.formatNo)),\n})\n"],"mappings":";;;AAGA,MAAa,gBAAgB,gBAA2B;CACvD,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,SAAS,EAAE,OAAO,QAAS,QAAQ,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,QAAQ;AACvE,CAAC"}
1
+ {"version":3,"file":"checkbox.js","names":[],"sources":["../../../src/fields/builtin/checkbox.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { labelFor } from '../../translations/server'\nimport { defineFormField } from '../defineFormField'\n\ntype CheckboxConfig = { required?: boolean; display?: 'checkbox' | 'switch' }\n\n/**\n * A checkbox renders as a lone box with no free-text affordance, so `placeholder` is never read.\n * The intrinsic validator owns `required`: the engine's shared required guard only fires on an\n * empty value, and `false` (checked, then unchecked) is a present one, so without this a required\n * checkbox would accept an explicit refusal.\n */\nexport const checkboxField = defineFormField<'boolean', CheckboxConfig>({\n\ttype: 'checkbox',\n\tlabel: keys.fieldTypeCheckbox,\n\tvalue: 'boolean',\n\tomitShared: ['placeholder'],\n\tconfig: [\n\t\t{\n\t\t\tname: 'display',\n\t\t\ttype: 'select',\n\t\t\tdefaultValue: 'checkbox',\n\t\t\tlabel: labelFor(keys.configCheckboxDisplay),\n\t\t\tadmin: { isClearable: false },\n\t\t\toptions: [\n\t\t\t\t{ label: labelFor(keys.checkboxDisplayCheckbox), value: 'checkbox' },\n\t\t\t\t{ label: labelFor(keys.checkboxDisplaySwitch), value: 'switch' },\n\t\t\t],\n\t\t},\n\t],\n\tvalidate: ({ value, config, t }) =>\n\t\tconfig.required === true && value !== true ? t(keys.validationRequired) : true,\n\tformat: ({ value, t }) => (value ? t(keys.formatYes) : t(keys.formatNo)),\n})\n"],"mappings":";;;;;;;;;;AAYA,MAAa,gBAAgB,gBAA2C;CACvE,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,YAAY,CAAC,aAAa;CAC1B,QAAQ,CACP;EACC,MAAM;EACN,MAAM;EACN,cAAc;EACd,OAAO,SAAS,KAAK,qBAAqB;EAC1C,OAAO,EAAE,aAAa,MAAM;EAC5B,SAAS,CACR;GAAE,OAAO,SAAS,KAAK,uBAAuB;GAAG,OAAO;EAAW,GACnE;GAAE,OAAO,SAAS,KAAK,qBAAqB;GAAG,OAAO;EAAS,CAChE;CACD,CACD;CACA,WAAW,EAAE,OAAO,QAAQ,QAC3B,OAAO,aAAa,QAAQ,UAAU,OAAO,EAAE,KAAK,kBAAkB,IAAI;CAC3E,SAAS,EAAE,OAAO,QAAS,QAAQ,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,QAAQ;AACvE,CAAC"}
@@ -1,29 +1,64 @@
1
1
  import { keys } from "../../translations/keys.js";
2
- import { labelFor } from "../../translations/server.js";
2
+ import { labelForKey } from "../../translations/server.js";
3
3
  import { defineFormField } from "../defineFormField.js";
4
- //#region src/fields/builtin/consent.ts
5
4
  /**
6
- * Base consent field definition. `source` select and `sourceConfig` group are injected
7
- * by `buildFieldBlocks` from the live `consentRegistry`, so only the selected source's
8
- * fields are visible in the admin UI via `admin.condition`.
5
+ * Consent is a reference, so the field is a reference: the author picks a source and nothing else.
6
+ * The statement, the policy page, and its version all live with the source (see
7
+ * `consentSourcesField`), so there is no wording to copy per form, no URL to paste, and no version
8
+ * to type; correcting a statement corrects every form pointing at it. `label` and `placeholder` are
9
+ * dropped for the same reason: the statement is the visible text and the checkbox's accessible name.
10
+ *
11
+ * Registered only when the plugin's `consent.sources` resolver is set, since a consent field with
12
+ * no source to reference has nothing to say and nothing to prove.
13
+ *
14
+ * The intrinsic validator owns `required`: the engine's shared required guard only fires on an
15
+ * empty value, and `false` (the coerced state of both an unchecked box and an absent answer) is a
16
+ * present one, so without this a required consent would accept an explicit refusal.
17
+ *
18
+ * `display: 'notice'` renders the statement as prose with no control: the submit itself is the
19
+ * consent, so there is no value for `required` to gate and validation always passes; the server
20
+ * records `agreed: true` on the proof regardless of what the client sent.
9
21
  */
10
22
  const consentField = defineFormField({
11
23
  type: "consent",
12
24
  label: keys.fieldTypeConsent,
13
25
  value: "boolean",
26
+ omitShared: [
27
+ "label",
28
+ "placeholder",
29
+ "description"
30
+ ],
31
+ blockLabel: "@10x-media/form-builder/client#ConsentBlockLabel",
14
32
  config: [{
15
- name: "statement",
33
+ name: "source",
16
34
  type: "text",
17
- label: labelFor(keys.consentConfigStatement)
35
+ label: labelForKey(keys.consentConfigSource),
36
+ admin: { components: { Field: {
37
+ path: "@10x-media/form-builder/client#EndpointOptionsSelect",
38
+ clientProps: {
39
+ endpoint: "consent-sources",
40
+ descriptionKey: keys.consentConfigSourceDescription,
41
+ isClearable: false
42
+ }
43
+ } } }
18
44
  }, {
19
- name: "optional",
20
- type: "checkbox",
21
- label: labelFor(keys.consentConfigOptional)
45
+ name: "display",
46
+ type: "select",
47
+ defaultValue: "checkbox",
48
+ label: labelForKey(keys.consentConfigDisplay),
49
+ admin: {
50
+ isClearable: false,
51
+ description: labelForKey(keys.consentConfigDisplayDescription)
52
+ },
53
+ options: [{
54
+ label: labelForKey(keys.consentDisplayCheckbox),
55
+ value: "checkbox"
56
+ }, {
57
+ label: labelForKey(keys.consentDisplayNotice),
58
+ value: "notice"
59
+ }]
22
60
  }],
23
- validate: ({ value, config, t }) => {
24
- if (!(config.optional === true) && value !== true) return t(keys.validationRequired);
25
- return true;
26
- },
61
+ validate: ({ value, config, t }) => config.display !== "notice" && config.required === true && value !== true ? t(keys.validationRequired) : true,
27
62
  format: ({ value, t }) => t(value === true ? keys.formatYes : keys.formatNo)
28
63
  });
29
64
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"consent.js","names":[],"sources":["../../../src/fields/builtin/consent.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { labelFor } from '../../translations/server'\nimport { defineFormField } from '../defineFormField'\n\ntype ConsentConfig = {\n\tstatement?: string\n\tsource?: string\n\tsourceConfig?: Record<string, unknown>\n\toptional?: boolean\n}\n\n/**\n * Base consent field definition. `source` select and `sourceConfig` group are injected\n * by `buildFieldBlocks` from the live `consentRegistry`, so only the selected source's\n * fields are visible in the admin UI via `admin.condition`.\n */\nexport const consentField = defineFormField<'boolean', ConsentConfig>({\n\ttype: 'consent',\n\tlabel: keys.fieldTypeConsent,\n\tvalue: 'boolean',\n\tconfig: [\n\t\t{ name: 'statement', type: 'text', label: labelFor(keys.consentConfigStatement) },\n\t\t// source select and sourceConfig group are injected by buildFieldBlocks at plugin boot\n\t\t// so the options reflect the live consentRegistry rather than this static list.\n\t\t{ name: 'optional', type: 'checkbox', label: labelFor(keys.consentConfigOptional) },\n\t],\n\tvalidate: ({ value, config, t }) => {\n\t\tconst optional = (config as ConsentConfig).optional === true\n\t\tif (!optional && value !== true) {\n\t\t\treturn t(keys.validationRequired)\n\t\t}\n\t\treturn true\n\t},\n\tformat: ({ value, t }) => t(value === true ? keys.formatYes : keys.formatNo),\n})\n"],"mappings":";;;;;;;;;AAgBA,MAAa,eAAe,gBAA0C;CACrE,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,QAAQ,CACP;EAAE,MAAM;EAAa,MAAM;EAAQ,OAAO,SAAS,KAAK,sBAAsB;CAAE,GAGhF;EAAE,MAAM;EAAY,MAAM;EAAY,OAAO,SAAS,KAAK,qBAAqB;CAAE,CACnF;CACA,WAAW,EAAE,OAAO,QAAQ,QAAQ;EAEnC,IAAI,EADc,OAAyB,aAAa,SACvC,UAAU,MAC1B,OAAO,EAAE,KAAK,kBAAkB;EAEjC,OAAO;CACR;CACA,SAAS,EAAE,OAAO,QAAQ,EAAE,UAAU,OAAO,KAAK,YAAY,KAAK,QAAQ;AAC5E,CAAC"}
1
+ {"version":3,"file":"consent.js","names":[],"sources":["../../../src/fields/builtin/consent.ts"],"sourcesContent":["import type { ConsentDisplay } from '../../consent/effectiveStatement'\nimport { keys } from '../../translations/keys'\nimport { labelForKey } from '../../translations/server'\nimport { defineFormField } from '../defineFormField'\n\ntype ConsentConfig = { source?: string; required?: boolean; display?: ConsentDisplay }\n\nconst SOURCE_FIELD_REF = '@10x-media/form-builder/client#EndpointOptionsSelect'\n\n/**\n * Consent is a reference, so the field is a reference: the author picks a source and nothing else.\n * The statement, the policy page, and its version all live with the source (see\n * `consentSourcesField`), so there is no wording to copy per form, no URL to paste, and no version\n * to type; correcting a statement corrects every form pointing at it. `label` and `placeholder` are\n * dropped for the same reason: the statement is the visible text and the checkbox's accessible name.\n *\n * Registered only when the plugin's `consent.sources` resolver is set, since a consent field with\n * no source to reference has nothing to say and nothing to prove.\n *\n * The intrinsic validator owns `required`: the engine's shared required guard only fires on an\n * empty value, and `false` (the coerced state of both an unchecked box and an absent answer) is a\n * present one, so without this a required consent would accept an explicit refusal.\n *\n * `display: 'notice'` renders the statement as prose with no control: the submit itself is the\n * consent, so there is no value for `required` to gate and validation always passes; the server\n * records `agreed: true` on the proof regardless of what the client sent.\n */\nexport const consentField = defineFormField<'boolean', ConsentConfig>({\n\ttype: 'consent',\n\tlabel: keys.fieldTypeConsent,\n\tvalue: 'boolean',\n\tomitShared: ['label', 'placeholder', 'description'],\n\tblockLabel: '@10x-media/form-builder/client#ConsentBlockLabel',\n\tconfig: [\n\t\t{\n\t\t\tname: 'source',\n\t\t\ttype: 'text',\n\t\t\tlabel: labelForKey(keys.consentConfigSource),\n\t\t\tadmin: {\n\t\t\t\tcomponents: {\n\t\t\t\t\tField: {\n\t\t\t\t\t\tpath: SOURCE_FIELD_REF,\n\t\t\t\t\t\tclientProps: {\n\t\t\t\t\t\t\tendpoint: 'consent-sources',\n\t\t\t\t\t\t\tdescriptionKey: keys.consentConfigSourceDescription,\n\t\t\t\t\t\t\tisClearable: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'display',\n\t\t\ttype: 'select',\n\t\t\tdefaultValue: 'checkbox',\n\t\t\tlabel: labelForKey(keys.consentConfigDisplay),\n\t\t\tadmin: { isClearable: false, description: labelForKey(keys.consentConfigDisplayDescription) },\n\t\t\toptions: [\n\t\t\t\t{ label: labelForKey(keys.consentDisplayCheckbox), value: 'checkbox' },\n\t\t\t\t{ label: labelForKey(keys.consentDisplayNotice), value: 'notice' },\n\t\t\t],\n\t\t},\n\t],\n\tvalidate: ({ value, config, t }) =>\n\t\tconfig.display !== 'notice' && config.required === true && value !== true\n\t\t\t? t(keys.validationRequired)\n\t\t\t: true,\n\tformat: ({ value, t }) => t(value === true ? keys.formatYes : keys.formatNo),\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,eAAe,gBAA0C;CACrE,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,YAAY;EAAC;EAAS;EAAe;CAAa;CAClD,YAAY;CACZ,QAAQ,CACP;EACC,MAAM;EACN,MAAM;EACN,OAAO,YAAY,KAAK,mBAAmB;EAC3C,OAAO,EACN,YAAY,EACX,OAAO;GACN,MAAM;GACN,aAAa;IACZ,UAAU;IACV,gBAAgB,KAAK;IACrB,aAAa;GACd;EACD,EACD,EACD;CACD,GACA;EACC,MAAM;EACN,MAAM;EACN,cAAc;EACd,OAAO,YAAY,KAAK,oBAAoB;EAC5C,OAAO;GAAE,aAAa;GAAO,aAAa,YAAY,KAAK,+BAA+B;EAAE;EAC5F,SAAS,CACR;GAAE,OAAO,YAAY,KAAK,sBAAsB;GAAG,OAAO;EAAW,GACrE;GAAE,OAAO,YAAY,KAAK,oBAAoB;GAAG,OAAO;EAAS,CAClE;CACD,CACD;CACA,WAAW,EAAE,OAAO,QAAQ,QAC3B,OAAO,YAAY,YAAY,OAAO,aAAa,QAAQ,UAAU,OAClE,EAAE,KAAK,kBAAkB,IACzB;CACJ,SAAS,EAAE,OAAO,QAAQ,EAAE,UAAU,OAAO,KAAK,YAAY,KAAK,QAAQ;AAC5E,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { FormFieldConfigValues, FormFieldDefinition } from "../types.js";
2
+
3
+ //#region src/fields/builtin/country.d.ts
4
+ /**
5
+ * A country picker fronted by the fixed ISO 3166-1 alpha-2 set (see {@link COUNTRIES}). Unlike
6
+ * `select` the author does not author options, so there is no `config`; the stored value is the
7
+ * two-letter code and `format` resolves it to the English name. `resolveOptions` exposes the same
8
+ * set as poll choices so a country field can back a poll despite carrying no authored options.
9
+ */
10
+ declare const countryField: FormFieldDefinition<"text", FormFieldConfigValues>;
11
+ //#endregion
12
+ export { countryField };
13
+ //# sourceMappingURL=country.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { keys } from "../../translations/keys.js";
2
+ import { defineFormField } from "../defineFormField.js";
3
+ import { COUNTRIES, countryLabel, isCountryCode } from "../data/regions.js";
4
+ //#region src/fields/builtin/country.ts
5
+ /**
6
+ * A country picker fronted by the fixed ISO 3166-1 alpha-2 set (see {@link COUNTRIES}). Unlike
7
+ * `select` the author does not author options, so there is no `config`; the stored value is the
8
+ * two-letter code and `format` resolves it to the English name. `resolveOptions` exposes the same
9
+ * set as poll choices so a country field can back a poll despite carrying no authored options.
10
+ */
11
+ const countryField = defineFormField({
12
+ type: "country",
13
+ label: keys.fieldTypeCountry,
14
+ value: "text",
15
+ conditionType: "select",
16
+ pollEligible: true,
17
+ resolveOptions: () => COUNTRIES,
18
+ validate: ({ value, t }) => {
19
+ if (value == null || value === "") return true;
20
+ return isCountryCode(value) ? true : t(keys.validationCountry);
21
+ },
22
+ format: ({ value }) => {
23
+ if (value == null || value === "") return "";
24
+ return countryLabel(value) ?? String(value);
25
+ }
26
+ });
27
+ //#endregion
28
+ export { countryField };
29
+
30
+ //# sourceMappingURL=country.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country.js","names":[],"sources":["../../../src/fields/builtin/country.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { COUNTRIES, countryLabel, isCountryCode } from '../data/regions'\nimport { defineFormField } from '../defineFormField'\n\n/**\n * A country picker fronted by the fixed ISO 3166-1 alpha-2 set (see {@link COUNTRIES}). Unlike\n * `select` the author does not author options, so there is no `config`; the stored value is the\n * two-letter code and `format` resolves it to the English name. `resolveOptions` exposes the same\n * set as poll choices so a country field can back a poll despite carrying no authored options.\n */\nexport const countryField = defineFormField<'text'>({\n\ttype: 'country',\n\tlabel: keys.fieldTypeCountry,\n\tvalue: 'text',\n\tconditionType: 'select',\n\tpollEligible: true,\n\tresolveOptions: () => COUNTRIES,\n\tvalidate: ({ value, t }) => {\n\t\tif (value == null || value === '') {\n\t\t\treturn true\n\t\t}\n\t\treturn isCountryCode(value) ? true : t(keys.validationCountry)\n\t},\n\tformat: ({ value }) => {\n\t\tif (value == null || value === '') {\n\t\t\treturn ''\n\t\t}\n\t\treturn countryLabel(value) ?? String(value)\n\t},\n})\n"],"mappings":";;;;;;;;;;AAUA,MAAa,eAAe,gBAAwB;CACnD,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,eAAe;CACf,cAAc;CACd,sBAAsB;CACtB,WAAW,EAAE,OAAO,QAAQ;EAC3B,IAAI,SAAS,QAAQ,UAAU,IAC9B,OAAO;EAER,OAAO,cAAc,KAAK,IAAI,OAAO,EAAE,KAAK,iBAAiB;CAC9D;CACA,SAAS,EAAE,YAAY;EACtB,IAAI,SAAS,QAAQ,UAAU,IAC9B,OAAO;EAER,OAAO,aAAa,KAAK,KAAK,OAAO,KAAK;CAC3C;AACD,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { keys } from "../../translations/keys.js";
2
+ import { defineFormField } from "../defineFormField.js";
3
+ //#region src/fields/builtin/date.ts
4
+ const DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
5
+ /** True calendar-date check for `YYYY-MM-DD` strings (rejects e.g. `2024-02-30`). */
6
+ const isValidCalendarDate = (value) => {
7
+ const match = DATE_PATTERN.exec(value);
8
+ if (!match) return false;
9
+ const [, yearStr, monthStr, dayStr] = match;
10
+ const year = Number(yearStr);
11
+ const month = Number(monthStr);
12
+ const day = Number(dayStr);
13
+ const date = new Date(Date.UTC(year, month - 1, day));
14
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
15
+ };
16
+ /** `placeholder` is omitted: browsers ignore it on `<input type="date">`, which renders its own picker. */
17
+ const dateField = defineFormField({
18
+ type: "date",
19
+ label: keys.fieldTypeDate,
20
+ value: "date",
21
+ omitShared: ["placeholder"],
22
+ validate: ({ value, t }) => {
23
+ if (value == null || value === "") return true;
24
+ return isValidCalendarDate(value) ? true : t(keys.validationDate);
25
+ },
26
+ format: ({ value }) => value == null ? "" : String(value)
27
+ });
28
+ //#endregion
29
+ export { dateField, isValidCalendarDate };
30
+
31
+ //# sourceMappingURL=date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.js","names":[],"sources":["../../../src/fields/builtin/date.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineFormField } from '../defineFormField'\n\nconst DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n\n/** True calendar-date check for `YYYY-MM-DD` strings (rejects e.g. `2024-02-30`). */\nexport const isValidCalendarDate = (value: string): boolean => {\n\tconst match = DATE_PATTERN.exec(value)\n\tif (!match) {\n\t\treturn false\n\t}\n\tconst [, yearStr, monthStr, dayStr] = match\n\tconst year = Number(yearStr)\n\tconst month = Number(monthStr)\n\tconst day = Number(dayStr)\n\tconst date = new Date(Date.UTC(year, month - 1, day))\n\treturn (\n\t\tdate.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n\t)\n}\n\n/** `placeholder` is omitted: browsers ignore it on `<input type=\"date\">`, which renders its own picker. */\nexport const dateField = defineFormField<'date'>({\n\ttype: 'date',\n\tlabel: keys.fieldTypeDate,\n\tvalue: 'date',\n\tomitShared: ['placeholder'],\n\tvalidate: ({ value, t }) => {\n\t\tif (value == null || value === '') {\n\t\t\treturn true\n\t\t}\n\t\treturn isValidCalendarDate(value) ? true : t(keys.validationDate)\n\t},\n\tformat: ({ value }) => (value == null ? '' : String(value)),\n})\n"],"mappings":";;;AAGA,MAAM,eAAe;;AAGrB,MAAa,uBAAuB,UAA2B;CAC9D,MAAM,QAAQ,aAAa,KAAK,KAAK;CACrC,IAAI,CAAC,OACJ,OAAO;CAER,MAAM,GAAG,SAAS,UAAU,UAAU;CACtC,MAAM,OAAO,OAAO,OAAO;CAC3B,MAAM,QAAQ,OAAO,QAAQ;CAC7B,MAAM,MAAM,OAAO,MAAM;CACzB,MAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;CACpD,OACC,KAAK,eAAe,MAAM,QAAQ,KAAK,YAAY,MAAM,QAAQ,KAAK,KAAK,WAAW,MAAM;AAE9F;;AAGA,MAAa,YAAY,gBAAwB;CAChD,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,YAAY,CAAC,aAAa;CAC1B,WAAW,EAAE,OAAO,QAAQ;EAC3B,IAAI,SAAS,QAAQ,UAAU,IAC9B,OAAO;EAER,OAAO,oBAAoB,KAAK,IAAI,OAAO,EAAE,KAAK,cAAc;CACjE;CACA,SAAS,EAAE,YAAa,SAAS,OAAO,KAAK,OAAO,KAAK;AAC1D,CAAC"}
@@ -1,11 +1,18 @@
1
1
  import { keys } from "../../translations/keys.js";
2
+ import { labelFor } from "../../translations/server.js";
2
3
  import { defineFormField } from "../defineFormField.js";
4
+ import { EMAIL_PATTERN } from "../../validation/emailPattern.js";
3
5
  //#region src/fields/builtin/email.ts
4
- const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
5
6
  const emailField = defineFormField({
6
7
  type: "email",
7
8
  label: keys.fieldTypeEmail,
8
9
  value: "text",
10
+ advancedConfig: [{
11
+ name: "autocomplete",
12
+ type: "text",
13
+ label: labelFor(keys.configAutocomplete),
14
+ admin: { description: labelFor(keys.configAutocompleteDescription) }
15
+ }],
9
16
  validate: ({ value, t }) => {
10
17
  if (value == null || value === "") return true;
11
18
  return EMAIL_PATTERN.test(value) ? true : t(keys.validationEmail);
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","names":[],"sources":["../../../src/fields/builtin/email.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { defineFormField } from '../defineFormField'\n\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport const emailField = defineFormField<'text'>({\n\ttype: 'email',\n\tlabel: keys.fieldTypeEmail,\n\tvalue: 'text',\n\tvalidate: ({ value, t }) => {\n\t\tif (value == null || value === '') {\n\t\t\treturn true\n\t\t}\n\t\treturn EMAIL_PATTERN.test(value) ? true : t(keys.validationEmail)\n\t},\n\tformat: ({ value }) => (value == null ? '' : String(value)),\n})\n"],"mappings":";;;AAGA,MAAM,gBAAgB;AAEtB,MAAa,aAAa,gBAAwB;CACjD,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,WAAW,EAAE,OAAO,QAAQ;EAC3B,IAAI,SAAS,QAAQ,UAAU,IAC9B,OAAO;EAER,OAAO,cAAc,KAAK,KAAK,IAAI,OAAO,EAAE,KAAK,eAAe;CACjE;CACA,SAAS,EAAE,YAAa,SAAS,OAAO,KAAK,OAAO,KAAK;AAC1D,CAAC"}
1
+ {"version":3,"file":"email.js","names":[],"sources":["../../../src/fields/builtin/email.ts"],"sourcesContent":["import { keys } from '../../translations/keys'\nimport { labelFor } from '../../translations/server'\nimport { EMAIL_PATTERN } from '../../validation/emailPattern'\nimport { defineFormField } from '../defineFormField'\n\nexport const emailField = defineFormField<'text'>({\n\ttype: 'email',\n\tlabel: keys.fieldTypeEmail,\n\tvalue: 'text',\n\tadvancedConfig: [\n\t\t{\n\t\t\tname: 'autocomplete',\n\t\t\ttype: 'text',\n\t\t\tlabel: labelFor(keys.configAutocomplete),\n\t\t\tadmin: { description: labelFor(keys.configAutocompleteDescription) },\n\t\t},\n\t],\n\tvalidate: ({ value, t }) => {\n\t\tif (value == null || value === '') {\n\t\t\treturn true\n\t\t}\n\t\treturn EMAIL_PATTERN.test(value) ? true : t(keys.validationEmail)\n\t},\n\tformat: ({ value }) => (value == null ? '' : String(value)),\n})\n"],"mappings":";;;;;AAKA,MAAa,aAAa,gBAAwB;CACjD,MAAM;CACN,OAAO,KAAK;CACZ,OAAO;CACP,gBAAgB,CACf;EACC,MAAM;EACN,MAAM;EACN,OAAO,SAAS,KAAK,kBAAkB;EACvC,OAAO,EAAE,aAAa,SAAS,KAAK,6BAA6B,EAAE;CACpE,CACD;CACA,WAAW,EAAE,OAAO,QAAQ;EAC3B,IAAI,SAAS,QAAQ,UAAU,IAC9B,OAAO;EAER,OAAO,cAAc,KAAK,KAAK,IAAI,OAAO,EAAE,KAAK,eAAe;CACjE;CACA,SAAS,EAAE,YAAa,SAAS,OAAO,KAAK,OAAO,KAAK;AAC1D,CAAC"}
@@ -0,0 +1,15 @@
1
+ //#region src/fields/builtin/file.d.ts
2
+ /**
3
+ * Curated MIME type choices for the file field's `mimeTypes` select. Values are raw MIME strings or
4
+ * trailing-`*` prefix wildcards, exactly the patterns `resolveFileRef` matches server-side; `type/*`
5
+ * values double as the file input's `accept` attribute (browsers ignore other prefix patterns, which
6
+ * is fine since the server stays authoritative). Every value must be 63 bytes or less: Payload's
7
+ * db-postgres adapter stores select options as a pg enum, and pg enum labels cap at 63 bytes.
8
+ */
9
+ declare const fileMimeTypeOptions: {
10
+ label: string;
11
+ value: string;
12
+ }[];
13
+ //#endregion
14
+ export { fileMimeTypeOptions };
15
+ //# sourceMappingURL=file.d.ts.map