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

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 (644) hide show
  1. package/CHANGELOG.md +345 -0
  2. package/README.md +45 -1402
  3. package/dist/actions/body/converters.d.ts +20 -0
  4. package/dist/actions/body/converters.js +57 -0
  5. package/dist/actions/body/converters.js.map +1 -0
  6. package/dist/actions/body/escapeHtml.d.ts +6 -0
  7. package/dist/actions/body/escapeHtml.js +14 -0
  8. package/dist/actions/body/escapeHtml.js.map +1 -0
  9. package/dist/actions/body/serializeBody.d.ts +55 -0
  10. package/dist/actions/body/serializeBody.js +78 -0
  11. package/dist/actions/body/serializeBody.js.map +1 -0
  12. package/dist/actions/body/serializeSlate.js +31 -0
  13. package/dist/actions/body/serializeSlate.js.map +1 -0
  14. package/dist/actions/body/textOfBody.d.ts +13 -0
  15. package/dist/actions/body/textOfBody.js +35 -0
  16. package/dist/actions/body/textOfBody.js.map +1 -0
  17. package/dist/actions/body/wildcards.d.ts +10 -0
  18. package/dist/actions/body/wildcards.js +33 -0
  19. package/dist/actions/body/wildcards.js.map +1 -0
  20. package/dist/actions/buildActionBlocks.js +22 -0
  21. package/dist/actions/buildActionBlocks.js.map +1 -0
  22. package/dist/actions/builtin/confirmation.js +52 -0
  23. package/dist/actions/builtin/confirmation.js.map +1 -0
  24. package/dist/actions/builtin/emailAction.d.ts +17 -0
  25. package/dist/actions/builtin/emailAction.js +83 -0
  26. package/dist/actions/builtin/emailAction.js.map +1 -0
  27. package/dist/actions/builtin/emailTeam.js +22 -0
  28. package/dist/actions/builtin/emailTeam.js.map +1 -0
  29. package/dist/actions/builtin/index.d.ts +22 -0
  30. package/dist/actions/builtin/index.js +27 -0
  31. package/dist/actions/builtin/index.js.map +1 -0
  32. package/dist/actions/builtin/signedWebhook.js +53 -0
  33. package/dist/actions/builtin/signedWebhook.js.map +1 -0
  34. package/dist/actions/defineAction.d.ts +37 -0
  35. package/dist/actions/defineAction.js +6 -0
  36. package/dist/actions/defineAction.js.map +1 -0
  37. package/dist/actions/dispatch.js +49 -0
  38. package/dist/actions/dispatch.js.map +1 -0
  39. package/dist/actions/emailRecipients.d.ts +12 -0
  40. package/dist/actions/emailRecipients.js +116 -0
  41. package/dist/actions/emailRecipients.js.map +1 -0
  42. package/dist/actions/fromAddresses.d.ts +21 -0
  43. package/dist/actions/fromAddresses.js +74 -0
  44. package/dist/actions/fromAddresses.js.map +1 -0
  45. package/dist/actions/registry.d.ts +17 -0
  46. package/dist/actions/registry.js +12 -0
  47. package/dist/actions/registry.js.map +1 -0
  48. package/dist/actions/runActions.d.ts +9 -0
  49. package/dist/actions/runActions.js +43 -0
  50. package/dist/actions/runActions.js.map +1 -0
  51. package/dist/actions/sign.d.ts +7 -0
  52. package/dist/actions/sign.js +9 -0
  53. package/dist/actions/sign.js.map +1 -0
  54. package/dist/actions/task.js +87 -0
  55. package/dist/actions/task.js.map +1 -0
  56. package/dist/aggregation/aggregateResponses.d.ts +40 -0
  57. package/dist/aggregation/aggregateResponses.js +80 -0
  58. package/dist/aggregation/aggregateResponses.js.map +1 -0
  59. package/dist/aggregation/aggregateRows.d.ts +10 -0
  60. package/dist/aggregation/aggregateRows.js +64 -0
  61. package/dist/aggregation/aggregateRows.js.map +1 -0
  62. package/dist/aggregation/resolveResultsRequest.d.ts +61 -0
  63. package/dist/aggregation/resolveResultsRequest.js +113 -0
  64. package/dist/aggregation/resolveResultsRequest.js.map +1 -0
  65. package/dist/aggregation/types.d.ts +39 -0
  66. package/dist/calc/computeCalcFields.d.ts +15 -0
  67. package/dist/calc/computeCalcFields.js +28 -0
  68. package/dist/calc/computeCalcFields.js.map +1 -0
  69. package/dist/calc/evaluate.d.ts +8 -0
  70. package/dist/calc/evaluate.js +58 -0
  71. package/dist/calc/evaluate.js.map +1 -0
  72. package/dist/calc/normalizeCalc.d.ts +8 -0
  73. package/dist/calc/normalizeCalc.js +87 -0
  74. package/dist/calc/normalizeCalc.js.map +1 -0
  75. package/dist/calc/types.d.ts +34 -0
  76. package/dist/calc/types.js +22 -0
  77. package/dist/calc/types.js.map +1 -0
  78. package/dist/client/ByteSizeField.d.ts +29 -0
  79. package/dist/client/ByteSizeField.js +58 -0
  80. package/dist/client/ByteSizeField.js.map +1 -0
  81. package/dist/client/ClosePollButton.d.ts +15 -0
  82. package/dist/client/ClosePollButton.js +80 -0
  83. package/dist/client/ClosePollButton.js.map +1 -0
  84. package/dist/client/CondensedArray.d.ts +15 -0
  85. package/dist/client/CondensedArray.js +97 -0
  86. package/dist/client/CondensedArray.js.map +1 -0
  87. package/dist/client/ConditionBuilder.js +122 -0
  88. package/dist/client/ConditionBuilder.js.map +1 -0
  89. package/dist/client/ConditionRow.js +150 -0
  90. package/dist/client/ConditionRow.js.map +1 -0
  91. package/dist/client/ConsentBlockLabel.d.ts +15 -0
  92. package/dist/client/ConsentBlockLabel.js +71 -0
  93. package/dist/client/ConsentBlockLabel.js.map +1 -0
  94. package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
  95. package/dist/client/ConsentSourceRowLabel.js +21 -0
  96. package/dist/client/ConsentSourceRowLabel.js.map +1 -0
  97. package/dist/client/EndpointOptionsSelect.d.ts +46 -0
  98. package/dist/client/EndpointOptionsSelect.js +106 -0
  99. package/dist/client/EndpointOptionsSelect.js.map +1 -0
  100. package/dist/client/FieldBlockLabel.d.ts +18 -0
  101. package/dist/client/FieldBlockLabel.js +34 -0
  102. package/dist/client/FieldBlockLabel.js.map +1 -0
  103. package/dist/client/FieldNameSelect.d.ts +37 -0
  104. package/dist/client/FieldNameSelect.js +72 -0
  105. package/dist/client/FieldNameSelect.js.map +1 -0
  106. package/dist/client/FlowBuilder.d.ts +15 -0
  107. package/dist/client/FlowBuilder.js +457 -0
  108. package/dist/client/FlowBuilder.js.map +1 -0
  109. package/dist/client/FormConditionField.d.ts +21 -0
  110. package/dist/client/FormConditionField.js +30 -0
  111. package/dist/client/FormConditionField.js.map +1 -0
  112. package/dist/client/RecipientsSelect.d.ts +31 -0
  113. package/dist/client/RecipientsSelect.js +174 -0
  114. package/dist/client/RecipientsSelect.js.map +1 -0
  115. package/dist/client/RuleDescription.d.ts +21 -0
  116. package/dist/client/RuleDescription.js +19 -0
  117. package/dist/client/RuleDescription.js.map +1 -0
  118. package/dist/client/admin.css +275 -0
  119. package/dist/client/endpointOptions.js +29 -0
  120. package/dist/client/endpointOptions.js.map +1 -0
  121. package/dist/client/flowAuthoring.js +142 -0
  122. package/dist/client/flowAuthoring.js.map +1 -0
  123. package/dist/client/synthesizeClientField.js +57 -0
  124. package/dist/client/synthesizeClientField.js.map +1 -0
  125. package/dist/client/toStaticLabel.js +13 -0
  126. package/dist/client/toStaticLabel.js.map +1 -0
  127. package/dist/collections/buttonFields.d.ts +34 -0
  128. package/dist/collections/buttonFields.js +35 -0
  129. package/dist/collections/buttonFields.js.map +1 -0
  130. package/dist/collections/cells/FieldCountCell.d.ts +15 -0
  131. package/dist/collections/cells/FieldCountCell.js +18 -0
  132. package/dist/collections/cells/FieldCountCell.js.map +1 -0
  133. package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
  134. package/dist/collections/cells/FlowStepsCell.js +17 -0
  135. package/dist/collections/cells/FlowStepsCell.js.map +1 -0
  136. package/dist/collections/formSubmissions.js +204 -0
  137. package/dist/collections/formSubmissions.js.map +1 -0
  138. package/dist/collections/forms.js +482 -0
  139. package/dist/collections/forms.js.map +1 -0
  140. package/dist/collections/formsEndpoints.js +101 -0
  141. package/dist/collections/formsEndpoints.js.map +1 -0
  142. package/dist/collections/redirectFields.d.ts +29 -0
  143. package/dist/conditions/conditionType.js +21 -0
  144. package/dist/conditions/conditionType.js.map +1 -0
  145. package/dist/conditions/evaluate.d.ts +17 -0
  146. package/dist/conditions/evaluate.js +94 -0
  147. package/dist/conditions/evaluate.js.map +1 -0
  148. package/dist/conditions/fieldTypes.d.ts +11 -0
  149. package/dist/{fieldTypes-CzhhJXjg.js → conditions/fieldTypes.js} +6 -3
  150. package/dist/conditions/fieldTypes.js.map +1 -0
  151. package/dist/conditions/normalizeConditions.js +61 -0
  152. package/dist/conditions/normalizeConditions.js.map +1 -0
  153. package/dist/conditions/types.d.ts +8 -0
  154. package/dist/consent/applyConsentStatements.d.ts +14 -0
  155. package/dist/consent/applyConsentStatements.js +17 -0
  156. package/dist/consent/applyConsentStatements.js.map +1 -0
  157. package/dist/consent/captureConsent.d.ts +55 -0
  158. package/dist/consent/captureConsent.js +73 -0
  159. package/dist/consent/captureConsent.js.map +1 -0
  160. package/dist/consent/consentSourcesField.d.ts +66 -0
  161. package/dist/consent/consentSourcesField.js +90 -0
  162. package/dist/consent/consentSourcesField.js.map +1 -0
  163. package/dist/consent/resolveConsentEntries.d.ts +24 -0
  164. package/dist/consent/resolveConsentEntries.js +40 -0
  165. package/dist/consent/resolveConsentEntries.js.map +1 -0
  166. package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
  167. package/dist/consent/resolveConsentSourcesRequest.js +54 -0
  168. package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
  169. package/dist/consent/resolveConsentStatements.d.ts +45 -0
  170. package/dist/consent/resolveConsentStatements.js +44 -0
  171. package/dist/consent/resolveConsentStatements.js.map +1 -0
  172. package/dist/consent/resolvePublishedVersionRef.d.ts +23 -0
  173. package/dist/consent/resolvePublishedVersionRef.js +30 -0
  174. package/dist/consent/resolvePublishedVersionRef.js.map +1 -0
  175. package/dist/consent/types.d.ts +61 -0
  176. package/dist/email/departments.d.ts +59 -0
  177. package/dist/email/departments.js +87 -0
  178. package/dist/email/departments.js.map +1 -0
  179. package/dist/email/departmentsField.d.ts +53 -0
  180. package/dist/email/departmentsField.js +73 -0
  181. package/dist/email/departmentsField.js.map +1 -0
  182. package/dist/events/noopSink.js +6 -0
  183. package/dist/events/noopSink.js.map +1 -0
  184. package/dist/events/resolveEventSink.js +8 -0
  185. package/dist/events/resolveEventSink.js.map +1 -0
  186. package/dist/events/types.d.ts +31 -0
  187. package/dist/exports/client.d.ts +15 -21
  188. package/dist/exports/client.js +15 -319
  189. package/dist/exports/i18n.d.ts +6 -138
  190. package/dist/exports/i18n.js +6 -3
  191. package/dist/exports/react.d.ts +63 -550
  192. package/dist/exports/react.js +55 -1563
  193. package/dist/exports/rsc.d.ts +9 -16
  194. package/dist/exports/rsc.js +9 -55
  195. package/dist/exports/types.d.ts +36 -5
  196. package/dist/fields/buildFieldBlocks.js +80 -0
  197. package/dist/fields/buildFieldBlocks.js.map +1 -0
  198. package/dist/fields/builtin/calculation.js +144 -0
  199. package/dist/fields/builtin/calculation.js.map +1 -0
  200. package/dist/fields/builtin/checkbox.js +21 -0
  201. package/dist/fields/builtin/checkbox.js.map +1 -0
  202. package/dist/fields/builtin/consent.js +47 -0
  203. package/dist/fields/builtin/consent.js.map +1 -0
  204. package/dist/fields/builtin/country.d.ts +13 -0
  205. package/dist/fields/builtin/country.js +30 -0
  206. package/dist/fields/builtin/country.js.map +1 -0
  207. package/dist/fields/builtin/date.js +31 -0
  208. package/dist/fields/builtin/date.js.map +1 -0
  209. package/dist/fields/builtin/email.js +18 -0
  210. package/dist/fields/builtin/email.js.map +1 -0
  211. package/dist/fields/builtin/file.d.ts +15 -0
  212. package/dist/fields/builtin/file.js +127 -0
  213. package/dist/fields/builtin/file.js.map +1 -0
  214. package/dist/fields/builtin/index.d.ts +26 -0
  215. package/dist/fields/builtin/index.js +49 -0
  216. package/dist/fields/builtin/index.js.map +1 -0
  217. package/dist/fields/builtin/message.js +30 -0
  218. package/dist/fields/builtin/message.js.map +1 -0
  219. package/dist/fields/builtin/number.js +17 -0
  220. package/dist/fields/builtin/number.js.map +1 -0
  221. package/dist/fields/builtin/repeater.js +49 -0
  222. package/dist/fields/builtin/repeater.js.map +1 -0
  223. package/dist/fields/builtin/select.js +49 -0
  224. package/dist/fields/builtin/select.js.map +1 -0
  225. package/dist/fields/builtin/state.d.ts +13 -0
  226. package/dist/fields/builtin/state.js +30 -0
  227. package/dist/fields/builtin/state.js.map +1 -0
  228. package/dist/fields/builtin/text.js +13 -0
  229. package/dist/fields/builtin/text.js.map +1 -0
  230. package/dist/fields/builtin/textarea.js +13 -0
  231. package/dist/fields/builtin/textarea.js.map +1 -0
  232. package/dist/fields/data/regions.d.ts +21 -0
  233. package/dist/fields/data/regions.js +1238 -0
  234. package/dist/fields/data/regions.js.map +1 -0
  235. package/dist/fields/defineFormField.d.ts +13 -0
  236. package/dist/fields/defineFormField.js +12 -0
  237. package/dist/fields/defineFormField.js.map +1 -0
  238. package/dist/fields/fieldKey.d.ts +15 -0
  239. package/dist/fields/fieldKey.js +16 -0
  240. package/dist/fields/fieldKey.js.map +1 -0
  241. package/dist/fields/fieldNamesOfType.js +30 -0
  242. package/dist/fields/fieldNamesOfType.js.map +1 -0
  243. package/dist/fields/instanceOptions.js +20 -0
  244. package/dist/fields/instanceOptions.js.map +1 -0
  245. package/dist/fields/localizedIf.d.ts +13 -0
  246. package/dist/fields/localizedIf.js +12 -0
  247. package/dist/fields/localizedIf.js.map +1 -0
  248. package/dist/fields/registry.d.ts +12 -0
  249. package/dist/fields/registry.js +39 -0
  250. package/dist/fields/registry.js.map +1 -0
  251. package/dist/fields/sharedConfig.js +151 -0
  252. package/dist/fields/sharedConfig.js.map +1 -0
  253. package/dist/fields/types.d.ts +152 -0
  254. package/dist/flow/engine.d.ts +19 -0
  255. package/dist/flow/engine.js +29 -0
  256. package/dist/flow/engine.js.map +1 -0
  257. package/dist/flow/normalizeFlow.js +54 -0
  258. package/dist/flow/normalizeFlow.js.map +1 -0
  259. package/dist/flow/stepLabel.js +15 -0
  260. package/dist/flow/stepLabel.js.map +1 -0
  261. package/dist/flow/types.d.ts +32 -0
  262. package/dist/flow/types.js +11 -0
  263. package/dist/flow/types.js.map +1 -0
  264. package/dist/form/pollState.d.ts +22 -0
  265. package/dist/form/pollState.js +17 -0
  266. package/dist/form/pollState.js.map +1 -0
  267. package/dist/form/toFormDocument.d.ts +102 -0
  268. package/dist/form/toFormDocument.js +87 -0
  269. package/dist/form/toFormDocument.js.map +1 -0
  270. package/dist/form/types.d.ts +65 -0
  271. package/dist/index.d.ts +88 -4
  272. package/dist/index.js +111 -1898
  273. package/dist/index.js.map +1 -1
  274. package/dist/options.d.ts +229 -0
  275. package/dist/plugin/access.js +12 -0
  276. package/dist/plugin/access.js.map +1 -0
  277. package/dist/plugin/applyRegistryConfig.d.ts +11 -0
  278. package/dist/plugin/applyRegistryConfig.js +20 -0
  279. package/dist/plugin/applyRegistryConfig.js.map +1 -0
  280. package/dist/plugin/collectionOverrides.d.ts +22 -0
  281. package/dist/plugin/customState.js +26 -0
  282. package/dist/plugin/customState.js.map +1 -0
  283. package/dist/plugin/registerCollections.js +60 -0
  284. package/dist/plugin/registerCollections.js.map +1 -0
  285. package/dist/plugin/registerTranslations.js +19 -0
  286. package/dist/plugin/registerTranslations.js.map +1 -0
  287. package/dist/plugin/uploadsCollection.d.ts +16 -0
  288. package/dist/plugin/uploadsCollection.js +53 -0
  289. package/dist/plugin/uploadsCollection.js.map +1 -0
  290. package/dist/poll/applyPollOptions.js +18 -0
  291. package/dist/poll/applyPollOptions.js.map +1 -0
  292. package/dist/poll/buildPollOptionSourceFields.js +50 -0
  293. package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
  294. package/dist/poll/closeJob.d.ts +52 -0
  295. package/dist/poll/closeJob.js +119 -0
  296. package/dist/poll/closeJob.js.map +1 -0
  297. package/dist/poll/definePollOptionSource.d.ts +44 -0
  298. package/dist/poll/definePollOptionSource.js +6 -0
  299. package/dist/poll/definePollOptionSource.js.map +1 -0
  300. package/dist/poll/definePollType.d.ts +34 -0
  301. package/dist/poll/definePollType.js +6 -0
  302. package/dist/poll/definePollType.js.map +1 -0
  303. package/dist/poll/effectivePollOptions.d.ts +38 -0
  304. package/dist/poll/effectivePollOptions.js +64 -0
  305. package/dist/poll/effectivePollOptions.js.map +1 -0
  306. package/dist/poll/mostVoted.d.ts +21 -0
  307. package/dist/poll/mostVoted.js +32 -0
  308. package/dist/poll/mostVoted.js.map +1 -0
  309. package/dist/poll/outcomeBeforeChange.js +91 -0
  310. package/dist/poll/outcomeBeforeChange.js.map +1 -0
  311. package/dist/poll/outcomeFields.d.ts +38 -0
  312. package/dist/poll/outcomeFields.js +52 -0
  313. package/dist/poll/outcomeFields.js.map +1 -0
  314. package/dist/poll/pollTypeRegistry.d.ts +34 -0
  315. package/dist/poll/pollTypeRegistry.js +69 -0
  316. package/dist/poll/pollTypeRegistry.js.map +1 -0
  317. package/dist/poll/registry.d.ts +17 -0
  318. package/dist/poll/registry.js +12 -0
  319. package/dist/poll/registry.js.map +1 -0
  320. package/dist/poll/resolvePollCloseRequest.js +105 -0
  321. package/dist/poll/resolvePollCloseRequest.js.map +1 -0
  322. package/dist/poll/resolvePollOptions.d.ts +29 -0
  323. package/dist/poll/resolvePollOptions.js +52 -0
  324. package/dist/poll/resolvePollOptions.js.map +1 -0
  325. package/dist/poll/resolvePollOptionsRequest.js +50 -0
  326. package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
  327. package/dist/poll/resolvePollOutcome.d.ts +34 -0
  328. package/dist/poll/resolvePollOutcome.js +76 -0
  329. package/dist/poll/resolvePollOutcome.js.map +1 -0
  330. package/dist/poll/resultsField.js +21 -0
  331. package/dist/poll/resultsField.js.map +1 -0
  332. package/dist/prefill/valuesFromSearchParams.d.ts +18 -0
  333. package/dist/prefill/valuesFromSearchParams.js +41 -0
  334. package/dist/prefill/valuesFromSearchParams.js.map +1 -0
  335. package/dist/presentations/defaults.d.ts +33 -0
  336. package/dist/presentations/defaults.js +35 -0
  337. package/dist/presentations/defaults.js.map +1 -0
  338. package/dist/presentations/types.d.ts +19 -0
  339. package/dist/react/Form.d.ts +128 -0
  340. package/dist/react/Form.js +619 -0
  341. package/dist/react/Form.js.map +1 -0
  342. package/dist/react/FormContext.d.ts +59 -0
  343. package/dist/react/FormContext.js +14 -0
  344. package/dist/react/FormContext.js.map +1 -0
  345. package/dist/react/FormControls.d.ts +55 -0
  346. package/dist/react/FormControls.js +56 -0
  347. package/dist/react/FormControls.js.map +1 -0
  348. package/dist/react/FormFields.d.ts +18 -0
  349. package/dist/react/FormFields.js +114 -0
  350. package/dist/react/FormFields.js.map +1 -0
  351. package/dist/react/FormLayout.d.ts +22 -0
  352. package/dist/react/FormLayout.js +15 -0
  353. package/dist/react/FormLayout.js.map +1 -0
  354. package/dist/react/FormResults.d.ts +28 -0
  355. package/dist/react/FormResults.js +93 -0
  356. package/dist/react/FormResults.js.map +1 -0
  357. package/dist/react/FormSteps.d.ts +17 -0
  358. package/dist/react/FormSteps.js +35 -0
  359. package/dist/react/FormSteps.js.map +1 -0
  360. package/dist/react/Honeypot.d.ts +22 -0
  361. package/dist/react/Honeypot.js +38 -0
  362. package/dist/react/Honeypot.js.map +1 -0
  363. package/dist/react/Poll.d.ts +43 -0
  364. package/dist/react/Poll.js +135 -0
  365. package/dist/react/Poll.js.map +1 -0
  366. package/dist/react/captcha/HcaptchaCaptcha.d.ts +28 -0
  367. package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
  368. package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
  369. package/dist/react/captcha/RecaptchaCaptcha.d.ts +41 -0
  370. package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
  371. package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
  372. package/dist/react/captcha/TurnstileCaptcha.d.ts +28 -0
  373. package/dist/react/captcha/TurnstileCaptcha.js +53 -0
  374. package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
  375. package/dist/react/captcha/types.d.ts +8 -0
  376. package/dist/react/captcha/useCaptchaScript.js +45 -0
  377. package/dist/react/captcha/useCaptchaScript.js.map +1 -0
  378. package/dist/react/captcha/vendors.js +8 -0
  379. package/dist/react/captcha/vendors.js.map +1 -0
  380. package/dist/react/cn.d.ts +6 -0
  381. package/dist/react/cn.js +8 -0
  382. package/dist/react/cn.js.map +1 -0
  383. package/dist/react/contract.d.ts +31 -0
  384. package/dist/react/contract.js +7 -0
  385. package/dist/react/contract.js.map +1 -0
  386. package/dist/react/events.js +14 -0
  387. package/dist/react/events.js.map +1 -0
  388. package/dist/react/fetchResults.d.ts +25 -0
  389. package/dist/react/fetchResults.js +31 -0
  390. package/dist/react/fetchResults.js.map +1 -0
  391. package/dist/react/presentation/Backdrop.d.ts +18 -0
  392. package/dist/react/presentation/Backdrop.js +14 -0
  393. package/dist/react/presentation/Backdrop.js.map +1 -0
  394. package/dist/react/presentation/DialogSurface.d.ts +35 -0
  395. package/dist/react/presentation/DialogSurface.js +53 -0
  396. package/dist/react/presentation/DialogSurface.js.map +1 -0
  397. package/dist/react/presentation/presentations.d.ts +7 -0
  398. package/dist/react/presentation/presentations.js +32 -0
  399. package/dist/react/presentation/presentations.js.map +1 -0
  400. package/dist/react/presentation/registry.d.ts +11 -0
  401. package/dist/react/presentation/registry.js +12 -0
  402. package/dist/react/presentation/registry.js.map +1 -0
  403. package/dist/react/presentation/types.d.ts +19 -0
  404. package/dist/react/presentation/useDismiss.d.ts +19 -0
  405. package/dist/react/presentation/useDismiss.js +33 -0
  406. package/dist/react/presentation/useDismiss.js.map +1 -0
  407. package/dist/react/presentation/useFocusTrap.d.ts +8 -0
  408. package/dist/react/presentation/useFocusTrap.js +35 -0
  409. package/dist/react/presentation/useFocusTrap.js.map +1 -0
  410. package/dist/react/presentation/useScrollLock.d.ts +6 -0
  411. package/dist/react/presentation/useScrollLock.js +18 -0
  412. package/dist/react/presentation/useScrollLock.js.map +1 -0
  413. package/dist/react/primitives/Checkbox.d.ts +28 -0
  414. package/dist/react/primitives/Checkbox.js +21 -0
  415. package/dist/react/primitives/Checkbox.js.map +1 -0
  416. package/dist/react/primitives/FieldShell.d.ts +29 -0
  417. package/dist/react/primitives/FieldShell.js +44 -0
  418. package/dist/react/primitives/FieldShell.js.map +1 -0
  419. package/dist/react/primitives/Input.d.ts +30 -0
  420. package/dist/react/primitives/Input.js +21 -0
  421. package/dist/react/primitives/Input.js.map +1 -0
  422. package/dist/react/primitives/Select.d.ts +34 -0
  423. package/dist/react/primitives/Select.js +26 -0
  424. package/dist/react/primitives/Select.js.map +1 -0
  425. package/dist/react/primitives/Textarea.d.ts +28 -0
  426. package/dist/react/primitives/Textarea.js +20 -0
  427. package/dist/react/primitives/Textarea.js.map +1 -0
  428. package/dist/react/recall.js +20 -0
  429. package/dist/react/recall.js.map +1 -0
  430. package/dist/react/registry.d.ts +16 -0
  431. package/dist/react/registry.js +16 -0
  432. package/dist/react/registry.js.map +1 -0
  433. package/dist/react/renderers/calculation.js +27 -0
  434. package/dist/react/renderers/calculation.js.map +1 -0
  435. package/dist/react/renderers/checkbox.js +32 -0
  436. package/dist/react/renderers/checkbox.js.map +1 -0
  437. package/dist/react/renderers/consent.js +97 -0
  438. package/dist/react/renderers/consent.js.map +1 -0
  439. package/dist/react/renderers/date.js +33 -0
  440. package/dist/react/renderers/date.js.map +1 -0
  441. package/dist/react/renderers/email.js +34 -0
  442. package/dist/react/renderers/email.js.map +1 -0
  443. package/dist/react/renderers/file.js +107 -0
  444. package/dist/react/renderers/file.js.map +1 -0
  445. package/dist/react/renderers/index.d.ts +8 -0
  446. package/dist/react/renderers/index.js +35 -0
  447. package/dist/react/renderers/index.js.map +1 -0
  448. package/dist/react/renderers/message.js +41 -0
  449. package/dist/react/renderers/message.js.map +1 -0
  450. package/dist/react/renderers/number.js +37 -0
  451. package/dist/react/renderers/number.js.map +1 -0
  452. package/dist/react/renderers/region.js +43 -0
  453. package/dist/react/renderers/region.js.map +1 -0
  454. package/dist/react/renderers/repeater.js +131 -0
  455. package/dist/react/renderers/repeater.js.map +1 -0
  456. package/dist/react/renderers/select.js +35 -0
  457. package/dist/react/renderers/select.js.map +1 -0
  458. package/dist/react/renderers/text.js +34 -0
  459. package/dist/react/renderers/text.js.map +1 -0
  460. package/dist/react/renderers/textarea.js +33 -0
  461. package/dist/react/renderers/textarea.js.map +1 -0
  462. package/dist/react/resolveForm.js +16 -0
  463. package/dist/react/resolveForm.js.map +1 -0
  464. package/dist/react/state.d.ts +52 -0
  465. package/dist/react/state.js +125 -0
  466. package/dist/react/state.js.map +1 -0
  467. package/dist/react/submitForm.d.ts +31 -0
  468. package/dist/react/submitForm.js +58 -0
  469. package/dist/react/submitForm.js.map +1 -0
  470. package/dist/react/uploadFile.d.ts +23 -0
  471. package/dist/react/uploadFile.js +39 -0
  472. package/dist/react/uploadFile.js.map +1 -0
  473. package/dist/react/useField.d.ts +13 -0
  474. package/dist/react/useField.js +49 -0
  475. package/dist/react/useField.js.map +1 -0
  476. package/dist/react/useFormState.d.ts +8 -0
  477. package/dist/react/useFormState.js +9 -0
  478. package/dist/react/useFormState.js.map +1 -0
  479. package/dist/react/useFormStep.d.ts +8 -0
  480. package/dist/react/useFormStep.js +9 -0
  481. package/dist/react/useFormStep.js.map +1 -0
  482. package/dist/react/validateField.js +27 -0
  483. package/dist/react/validateField.js.map +1 -0
  484. package/dist/recall/interpolate.d.ts +11 -0
  485. package/dist/recall/interpolate.js +17 -0
  486. package/dist/recall/interpolate.js.map +1 -0
  487. package/dist/recall/resolver.d.ts +22 -0
  488. package/dist/recall/resolver.js +48 -0
  489. package/dist/recall/resolver.js.map +1 -0
  490. package/dist/spam/captcha.d.ts +13 -0
  491. package/dist/spam/captcha.js +12 -0
  492. package/dist/spam/captcha.js.map +1 -0
  493. package/dist/spam/clientIp.js +9 -0
  494. package/dist/spam/clientIp.js.map +1 -0
  495. package/dist/spam/constants.d.ts +12 -0
  496. package/dist/spam/constants.js +21 -0
  497. package/dist/spam/constants.js.map +1 -0
  498. package/dist/spam/identify.d.ts +12 -0
  499. package/dist/spam/identify.js +17 -0
  500. package/dist/spam/identify.js.map +1 -0
  501. package/dist/spam/providers/hcaptcha.d.ts +17 -0
  502. package/dist/spam/providers/hcaptcha.js +18 -0
  503. package/dist/spam/providers/hcaptcha.js.map +1 -0
  504. package/dist/spam/providers/recaptcha.d.ts +23 -0
  505. package/dist/spam/providers/recaptcha.js +23 -0
  506. package/dist/spam/providers/recaptcha.js.map +1 -0
  507. package/dist/spam/providers/siteverify.js +34 -0
  508. package/dist/spam/providers/siteverify.js.map +1 -0
  509. package/dist/spam/providers/turnstile.d.ts +17 -0
  510. package/dist/spam/providers/turnstile.js +18 -0
  511. package/dist/spam/providers/turnstile.js.map +1 -0
  512. package/dist/spam/rateLimiter.d.ts +18 -0
  513. package/dist/spam/rateLimiter.js +41 -0
  514. package/dist/spam/rateLimiter.js.map +1 -0
  515. package/dist/spam/reserved.js +30 -0
  516. package/dist/spam/reserved.js.map +1 -0
  517. package/dist/spam/resolveSpam.d.ts +12 -0
  518. package/dist/spam/resolveSpam.js +43 -0
  519. package/dist/spam/resolveSpam.js.map +1 -0
  520. package/dist/spam/spamGuard.js +81 -0
  521. package/dist/spam/spamGuard.js.map +1 -0
  522. package/dist/spam/types.d.ts +88 -0
  523. package/dist/spam/uploadHooks.js +33 -0
  524. package/dist/spam/uploadHooks.js.map +1 -0
  525. package/dist/submissions/SubmissionAnswers.d.ts +14 -0
  526. package/dist/submissions/SubmissionAnswers.js +137 -0
  527. package/dist/submissions/SubmissionAnswers.js.map +1 -0
  528. package/dist/submissions/SubmissionAnswersClient.js +178 -0
  529. package/dist/submissions/SubmissionAnswersClient.js.map +1 -0
  530. package/dist/submissions/coerceBoolean.js +14 -0
  531. package/dist/submissions/coerceBoolean.js.map +1 -0
  532. package/dist/submissions/createSubmission.d.ts +36 -0
  533. package/dist/submissions/createSubmission.js +26 -0
  534. package/dist/submissions/createSubmission.js.map +1 -0
  535. package/dist/submissions/runSubmission.d.ts +10 -0
  536. package/dist/submissions/runSubmission.js +306 -0
  537. package/dist/submissions/runSubmission.js.map +1 -0
  538. package/dist/submissions/types.d.ts +41 -0
  539. package/dist/submissions/validateSubmission.js +110 -0
  540. package/dist/submissions/validateSubmission.js.map +1 -0
  541. package/dist/submissions/votedCookie.d.ts +13 -0
  542. package/dist/submissions/votedCookie.js +27 -0
  543. package/dist/submissions/votedCookie.js.map +1 -0
  544. package/dist/translations/clientRuntimeKeys.d.ts +17 -0
  545. package/dist/translations/clientRuntimeKeys.js +46 -0
  546. package/dist/translations/clientRuntimeKeys.js.map +1 -0
  547. package/dist/translations/de.d.ts +12 -0
  548. package/dist/translations/de.js +309 -0
  549. package/dist/translations/de.js.map +1 -0
  550. package/dist/translations/en.d.ts +12 -0
  551. package/dist/translations/en.js +309 -0
  552. package/dist/translations/en.js.map +1 -0
  553. package/dist/translations/index.d.ts +23 -0
  554. package/dist/translations/index.js +37 -0
  555. package/dist/translations/index.js.map +1 -0
  556. package/dist/translations/keys.d.ts +308 -0
  557. package/dist/translations/keys.js +308 -0
  558. package/dist/translations/keys.js.map +1 -0
  559. package/dist/translations/makeTranslate.d.ts +15 -0
  560. package/dist/translations/makeTranslate.js +20 -0
  561. package/dist/translations/makeTranslate.js.map +1 -0
  562. package/dist/translations/server.js +32 -0
  563. package/dist/translations/server.js.map +1 -0
  564. package/dist/translations/useTranslation.js +12 -0
  565. package/dist/translations/useTranslation.js.map +1 -0
  566. package/dist/uploads/captureFileRef.d.ts +34 -0
  567. package/dist/uploads/captureFileRef.js +43 -0
  568. package/dist/uploads/captureFileRef.js.map +1 -0
  569. package/dist/uploads/formatBytes.d.ts +9 -0
  570. package/dist/uploads/formatBytes.js +25 -0
  571. package/dist/uploads/formatBytes.js.map +1 -0
  572. package/dist/uploads/resolveFileRef.d.ts +26 -0
  573. package/dist/uploads/resolveFileRef.js +45 -0
  574. package/dist/uploads/resolveFileRef.js.map +1 -0
  575. package/dist/uploads/types.d.ts +19 -0
  576. package/dist/validation/buildRuleBlocks.js +47 -0
  577. package/dist/validation/buildRuleBlocks.js.map +1 -0
  578. package/dist/validation/builtin/email.js +20 -0
  579. package/dist/validation/builtin/email.js.map +1 -0
  580. package/dist/validation/builtin/index.d.ts +14 -0
  581. package/dist/validation/builtin/index.js +38 -0
  582. package/dist/validation/builtin/index.js.map +1 -0
  583. package/dist/validation/builtin/matchesField.js +16 -0
  584. package/dist/validation/builtin/matchesField.js.map +1 -0
  585. package/dist/validation/builtin/max.js +22 -0
  586. package/dist/validation/builtin/max.js.map +1 -0
  587. package/dist/validation/builtin/maxDate.js +24 -0
  588. package/dist/validation/builtin/maxDate.js.map +1 -0
  589. package/dist/validation/builtin/maxLength.js +27 -0
  590. package/dist/validation/builtin/maxLength.js.map +1 -0
  591. package/dist/validation/builtin/min.js +22 -0
  592. package/dist/validation/builtin/min.js.map +1 -0
  593. package/dist/validation/builtin/minDate.js +24 -0
  594. package/dist/validation/builtin/minDate.js.map +1 -0
  595. package/dist/validation/builtin/minLength.js +27 -0
  596. package/dist/validation/builtin/minLength.js.map +1 -0
  597. package/dist/validation/builtin/notAlreadySubmitted.js +34 -0
  598. package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -0
  599. package/dist/validation/builtin/oneOf.js +35 -0
  600. package/dist/validation/builtin/oneOf.js.map +1 -0
  601. package/dist/validation/builtin/pattern.js +50 -0
  602. package/dist/validation/builtin/pattern.js.map +1 -0
  603. package/dist/validation/builtin/url.js +23 -0
  604. package/dist/validation/builtin/url.js.map +1 -0
  605. package/dist/validation/builtin/validateDateBound.js +18 -0
  606. package/dist/validation/builtin/validateDateBound.js.map +1 -0
  607. package/dist/validation/builtin/validateRegexParams.js +44 -0
  608. package/dist/validation/builtin/validateRegexParams.js.map +1 -0
  609. package/dist/validation/defineValidationRule.d.ts +12 -0
  610. package/dist/validation/defineValidationRule.js +11 -0
  611. package/dist/validation/defineValidationRule.js.map +1 -0
  612. package/dist/validation/emailPattern.js +10 -0
  613. package/dist/validation/emailPattern.js.map +1 -0
  614. package/dist/validation/fieldTargetParam.d.ts +22 -0
  615. package/dist/validation/fieldTargetParam.js +38 -0
  616. package/dist/validation/fieldTargetParam.js.map +1 -0
  617. package/dist/validation/message.js +14 -0
  618. package/dist/validation/message.js.map +1 -0
  619. package/dist/validation/registry.d.ts +11 -0
  620. package/dist/validation/registry.js +13 -0
  621. package/dist/validation/registry.js.map +1 -0
  622. package/dist/validation/runValidation.js +90 -0
  623. package/dist/validation/runValidation.js.map +1 -0
  624. package/dist/validation/types.d.ts +70 -0
  625. package/dist/validation/validateUrl.js +22 -0
  626. package/dist/validation/validateUrl.js.map +1 -0
  627. package/package.json +12 -7
  628. package/styles/form-builder.css +21 -11
  629. package/dist/constants-B-BUfetP.d.ts +0 -288
  630. package/dist/exports/client.js.map +0 -1
  631. package/dist/exports/react.js.map +0 -1
  632. package/dist/exports/rsc.js.map +0 -1
  633. package/dist/fieldTypes-B8jkNRob.d.ts +0 -188
  634. package/dist/fieldTypes-CzhhJXjg.js.map +0 -1
  635. package/dist/index-DfFYGbVF.d.ts +0 -481
  636. package/dist/keys-N5xGiUsh.js +0 -132
  637. package/dist/keys-N5xGiUsh.js.map +0 -1
  638. package/dist/registry-CoCyhtvB.js +0 -282
  639. package/dist/registry-CoCyhtvB.js.map +0 -1
  640. package/dist/resolver-OeQyVH2N.js +0 -665
  641. package/dist/resolver-OeQyVH2N.js.map +0 -1
  642. package/dist/translations-edMqq_2e.js +0 -152
  643. package/dist/translations-edMqq_2e.js.map +0 -1
  644. package/dist/types-DsJ_6kGJ.d.ts +0 -23
@@ -0,0 +1,97 @@
1
+ "use client";
2
+ import { keys } from "../translations/keys.js";
3
+ import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
4
+ import { Button, FieldDescription, FieldLabel, RenderCustomComponent, RenderFields, useField, useForm } from "@payloadcms/ui";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import "./admin.css";
7
+ //#region src/client/CondensedArray.tsx
8
+ const baseClass = "fb-condensed-array";
9
+ /**
10
+ * A custom `Field` for a real Payload `array` that renders its rows flat: each row is `[label, email]`
11
+ * laid out at 50% width with a remove control, added by a footer button, and never wrapped in the
12
+ * per-row `Collapsible` that Payload's native array applies unconditionally. Row ids and per-locale
13
+ * storage stay Payload's: rows come from `useField({ hasRows: true })`, mutations go through
14
+ * `useForm`'s `addFieldRow`/`removeFieldRow`, and each row's subfields render through `RenderFields`
15
+ * at `{path}.{index}` exactly as the native array does, so localization, validation, and descriptions
16
+ * work natively. Placed by {@link departmentsField}.
17
+ */
18
+ const CondensedArray = (props) => {
19
+ const { field: { name, admin: { description } = {}, fields, label, localized }, forceRender = false, path: pathFromProps, permissions, readOnly, schemaPath: schemaPathFromProps } = props;
20
+ const schemaPath = schemaPathFromProps ?? name;
21
+ const { t } = useTranslation$1();
22
+ const { addFieldRow, removeFieldRow } = useForm();
23
+ const { customComponents: { Description, Label } = {}, path, rows = [] } = useField({
24
+ hasRows: true,
25
+ potentiallyStalePath: pathFromProps
26
+ });
27
+ return /* @__PURE__ */ jsxs("div", {
28
+ className: `field-type ${baseClass}`,
29
+ id: `field-${path.replace(/\./g, "__")}`,
30
+ children: [
31
+ /* @__PURE__ */ jsx(RenderCustomComponent, {
32
+ CustomComponent: Label,
33
+ Fallback: /* @__PURE__ */ jsx(FieldLabel, {
34
+ label,
35
+ localized,
36
+ path
37
+ })
38
+ }),
39
+ /* @__PURE__ */ jsx(RenderCustomComponent, {
40
+ CustomComponent: Description,
41
+ Fallback: /* @__PURE__ */ jsx(FieldDescription, {
42
+ description,
43
+ path
44
+ })
45
+ }),
46
+ rows.length > 0 ? /* @__PURE__ */ jsx("div", {
47
+ className: `${baseClass}__rows`,
48
+ children: rows.map((row, index) => /* @__PURE__ */ jsxs("div", {
49
+ className: `${baseClass}__row`,
50
+ children: [/* @__PURE__ */ jsx(RenderFields, {
51
+ className: `${baseClass}__fields`,
52
+ fields,
53
+ forceRender,
54
+ margins: false,
55
+ parentIndexPath: "",
56
+ parentPath: `${path}.${index}`,
57
+ parentSchemaPath: schemaPath,
58
+ permissions: permissions === true ? permissions : permissions?.fields ?? {},
59
+ readOnly
60
+ }), !readOnly ? /* @__PURE__ */ jsx("div", {
61
+ className: `${baseClass}__remove`,
62
+ children: /* @__PURE__ */ jsx(Button, {
63
+ buttonStyle: "icon-label",
64
+ icon: "x",
65
+ onClick: () => removeFieldRow({
66
+ path,
67
+ rowIndex: index
68
+ }),
69
+ "aria-label": t(keys.departmentRemoveRow),
70
+ margin: false
71
+ })
72
+ }) : null]
73
+ }, row.id))
74
+ }) : null,
75
+ !readOnly ? /* @__PURE__ */ jsx("div", {
76
+ className: `${baseClass}__actions`,
77
+ children: /* @__PURE__ */ jsx(Button, {
78
+ buttonStyle: "icon-label",
79
+ icon: "plus",
80
+ iconStyle: "with-border",
81
+ iconPosition: "left",
82
+ onClick: () => addFieldRow({
83
+ path,
84
+ rowIndex: rows.length,
85
+ schemaPath
86
+ }),
87
+ margin: false,
88
+ children: t(keys.departmentAddRow)
89
+ })
90
+ }) : null
91
+ ]
92
+ });
93
+ };
94
+ //#endregion
95
+ export { CondensedArray };
96
+
97
+ //# sourceMappingURL=CondensedArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CondensedArray.js","names":["useTranslation"],"sources":["../../src/client/CondensedArray.tsx"],"sourcesContent":["'use client'\n\nimport {\n\tButton,\n\tFieldDescription,\n\tFieldLabel,\n\tRenderCustomComponent,\n\tRenderFields,\n\tuseField,\n\tuseForm,\n} from '@payloadcms/ui'\nimport type { ArrayFieldClientComponent } from 'payload'\nimport { keys } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport './admin.css'\n\nconst baseClass = 'fb-condensed-array'\n\n/**\n * A custom `Field` for a real Payload `array` that renders its rows flat: each row is `[label, email]`\n * laid out at 50% width with a remove control, added by a footer button, and never wrapped in the\n * per-row `Collapsible` that Payload's native array applies unconditionally. Row ids and per-locale\n * storage stay Payload's: rows come from `useField({ hasRows: true })`, mutations go through\n * `useForm`'s `addFieldRow`/`removeFieldRow`, and each row's subfields render through `RenderFields`\n * at `{path}.{index}` exactly as the native array does, so localization, validation, and descriptions\n * work natively. Placed by {@link departmentsField}.\n */\nexport const CondensedArray: ArrayFieldClientComponent = (props) => {\n\tconst {\n\t\tfield: { name, admin: { description } = {}, fields, label, localized },\n\t\tforceRender = false,\n\t\tpath: pathFromProps,\n\t\tpermissions,\n\t\treadOnly,\n\t\tschemaPath: schemaPathFromProps,\n\t} = props\n\tconst schemaPath = schemaPathFromProps ?? name\n\n\tconst { t } = useTranslation()\n\tconst { addFieldRow, removeFieldRow } = useForm()\n\tconst {\n\t\tcustomComponents: { Description, Label } = {},\n\t\tpath,\n\t\trows = [],\n\t} = useField<number>({ hasRows: true, potentiallyStalePath: pathFromProps })\n\n\treturn (\n\t\t<div className={`field-type ${baseClass}`} id={`field-${path.replace(/\\./g, '__')}`}>\n\t\t\t<RenderCustomComponent\n\t\t\t\tCustomComponent={Label}\n\t\t\t\tFallback={<FieldLabel label={label} localized={localized} path={path} />}\n\t\t\t/>\n\t\t\t<RenderCustomComponent\n\t\t\t\tCustomComponent={Description}\n\t\t\t\tFallback={<FieldDescription description={description} path={path} />}\n\t\t\t/>\n\t\t\t{rows.length > 0 ? (\n\t\t\t\t<div className={`${baseClass}__rows`}>\n\t\t\t\t\t{rows.map((row, index) => (\n\t\t\t\t\t\t<div key={row.id} className={`${baseClass}__row`}>\n\t\t\t\t\t\t\t<RenderFields\n\t\t\t\t\t\t\t\tclassName={`${baseClass}__fields`}\n\t\t\t\t\t\t\t\tfields={fields}\n\t\t\t\t\t\t\t\tforceRender={forceRender}\n\t\t\t\t\t\t\t\tmargins={false}\n\t\t\t\t\t\t\t\tparentIndexPath=\"\"\n\t\t\t\t\t\t\t\tparentPath={`${path}.${index}`}\n\t\t\t\t\t\t\t\tparentSchemaPath={schemaPath}\n\t\t\t\t\t\t\t\tpermissions={permissions === true ? permissions : (permissions?.fields ?? {})}\n\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{!readOnly ? (\n\t\t\t\t\t\t\t\t<div className={`${baseClass}__remove`}>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"icon-label\"\n\t\t\t\t\t\t\t\t\t\ticon=\"x\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => removeFieldRow({ path, rowIndex: index })}\n\t\t\t\t\t\t\t\t\t\taria-label={t(keys.departmentRemoveRow)}\n\t\t\t\t\t\t\t\t\t\tmargin={false}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{!readOnly ? (\n\t\t\t\t<div className={`${baseClass}__actions`}>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tbuttonStyle=\"icon-label\"\n\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\ticonStyle=\"with-border\"\n\t\t\t\t\t\ticonPosition=\"left\"\n\t\t\t\t\t\tonClick={() => addFieldRow({ path, rowIndex: rows.length, schemaPath })}\n\t\t\t\t\t\tmargin={false}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(keys.departmentAddRow)}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n"],"mappings":";;;;;;;AAgBA,MAAM,YAAY;;;;;;;;;;AAWlB,MAAa,kBAA6C,UAAU;CACnE,MAAM,EACL,OAAO,EAAE,MAAM,OAAO,EAAE,gBAAgB,CAAC,GAAG,QAAQ,OAAO,aAC3D,cAAc,OACd,MAAM,eACN,aACA,UACA,YAAY,wBACT;CACJ,MAAM,aAAa,uBAAuB;CAE1C,MAAM,EAAE,MAAMA,iBAAe;CAC7B,MAAM,EAAE,aAAa,mBAAmB,QAAQ;CAChD,MAAM,EACL,kBAAkB,EAAE,aAAa,UAAU,CAAC,GAC5C,MACA,OAAO,CAAC,MACL,SAAiB;EAAE,SAAS;EAAM,sBAAsB;CAAc,CAAC;CAE3E,OACC,qBAAC,OAAD;EAAK,WAAW,cAAc;EAAa,IAAI,SAAS,KAAK,QAAQ,OAAO,IAAI;YAAhF;GACC,oBAAC,uBAAD;IACC,iBAAiB;IACjB,UAAU,oBAAC,YAAD;KAAmB;KAAkB;KAAiB;IAAO,CAAA;GACvE,CAAA;GACD,oBAAC,uBAAD;IACC,iBAAiB;IACjB,UAAU,oBAAC,kBAAD;KAA+B;KAAmB;IAAO,CAAA;GACnE,CAAA;GACA,KAAK,SAAS,IACd,oBAAC,OAAD;IAAK,WAAW,GAAG,UAAU;cAC3B,KAAK,KAAK,KAAK,UACf,qBAAC,OAAD;KAAkB,WAAW,GAAG,UAAU;eAA1C,CACC,oBAAC,cAAD;MACC,WAAW,GAAG,UAAU;MAChB;MACK;MACb,SAAS;MACT,iBAAgB;MAChB,YAAY,GAAG,KAAK,GAAG;MACvB,kBAAkB;MAClB,aAAa,gBAAgB,OAAO,cAAe,aAAa,UAAU,CAAC;MACjE;KACV,CAAA,GACA,CAAC,WACD,oBAAC,OAAD;MAAK,WAAW,GAAG,UAAU;gBAC5B,oBAAC,QAAD;OACC,aAAY;OACZ,MAAK;OACL,eAAe,eAAe;QAAE;QAAM,UAAU;OAAM,CAAC;OACvD,cAAY,EAAE,KAAK,mBAAmB;OACtC,QAAQ;MACR,CAAA;KACG,CAAA,IACF,IACA;OAvBK,IAAI,EAuBT,CACL;GACG,CAAA,IACF;GACH,CAAC,WACD,oBAAC,OAAD;IAAK,WAAW,GAAG,UAAU;cAC5B,oBAAC,QAAD;KACC,aAAY;KACZ,MAAK;KACL,WAAU;KACV,cAAa;KACb,eAAe,YAAY;MAAE;MAAM,UAAU,KAAK;MAAQ;KAAW,CAAC;KACtE,QAAQ;eAEP,EAAE,KAAK,gBAAgB;IACjB,CAAA;GACJ,CAAA,IACF;EACA;;AAEP"}
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { keys } from "../translations/keys.js";
3
+ import { firstOperatorFor } from "../conditions/fieldTypes.js";
4
+ import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
5
+ import { operandFromRow } from "./synthesizeClientField.js";
6
+ import { ConditionRow } from "./ConditionRow.js";
7
+ import { reduceFieldsToValues, transformWhereQuery } from "payload/shared";
8
+ import { Button, useFormFields } from "@payloadcms/ui";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { useMemo } from "react";
11
+ import "./admin.css";
12
+ //#region src/client/ConditionBuilder.tsx
13
+ const toRow = (constraint) => {
14
+ const field = Object.keys(constraint)[0];
15
+ if (!field) return null;
16
+ const ops = constraint[field];
17
+ const operator = Object.keys(ops)[0];
18
+ if (!operator) return null;
19
+ return {
20
+ field,
21
+ operator,
22
+ value: ops[operator]
23
+ };
24
+ };
25
+ const fromRow = (row) => ({ [row.field]: { [row.operator]: row.value } });
26
+ const readGroups = (value) => {
27
+ if (!value || Object.keys(value).length === 0) return [];
28
+ const canonical = transformWhereQuery(value);
29
+ return (Array.isArray(canonical.or) ? canonical.or : []).map((group) => {
30
+ return (Array.isArray(group.and) ? group.and : []).map((constraint) => toRow(constraint)).filter((row) => row !== null);
31
+ });
32
+ };
33
+ const writeGroups = (groups) => ({ or: groups.filter((group) => group.length > 0).map((group) => ({ and: group.map(fromRow) })) });
34
+ const operandsFromData = (data, conditionTypes, selfName) => {
35
+ return (Array.isArray(data.fields) ? data.fields : []).map((row) => operandFromRow(row, conditionTypes)).filter((operand) => operand !== null && operand.name !== selfName);
36
+ };
37
+ const ConditionBuilder = ({ value, onChange, conditionTypes, selfName }) => {
38
+ const { t } = useTranslation$1();
39
+ const operandsJson = useFormFields(([fields]) => JSON.stringify(operandsFromData(reduceFieldsToValues(fields, true), conditionTypes, selfName)));
40
+ const operands = useMemo(() => JSON.parse(operandsJson), [operandsJson]);
41
+ const groups = readGroups(value);
42
+ const emit = (next) => onChange(writeGroups(next));
43
+ const addCondition = (groupIndex) => {
44
+ const first = operands[0];
45
+ if (!first) return;
46
+ const row = {
47
+ field: first.name,
48
+ operator: firstOperatorFor(first.conditionType),
49
+ value: void 0
50
+ };
51
+ emit(groups.length === 0 ? [[row]] : groups.map((group, index) => index === groupIndex ? [...group, row] : group));
52
+ };
53
+ const addOrGroup = () => {
54
+ const first = operands[0];
55
+ if (!first) return;
56
+ emit([...groups, [{
57
+ field: first.name,
58
+ operator: firstOperatorFor(first.conditionType),
59
+ value: void 0
60
+ }]]);
61
+ };
62
+ const updateRow = (groupIndex, rowIndex, row) => emit(groups.map((group, index) => index === groupIndex ? group.map((existing, position) => position === rowIndex ? row : existing) : group));
63
+ const removeRow = (groupIndex, rowIndex) => emit(groups.map((group, index) => index === groupIndex ? group.filter((_, position) => position !== rowIndex) : group).filter((group) => group.length > 0));
64
+ if (operands.length === 0) return /* @__PURE__ */ jsx("p", {
65
+ className: "fb-condition-builder__hint",
66
+ children: t(keys.conditionNoFields)
67
+ });
68
+ return /* @__PURE__ */ jsxs("div", {
69
+ className: "fb-condition-builder",
70
+ children: [groups.length === 0 ? /* @__PURE__ */ jsx("p", {
71
+ className: "fb-condition-builder__hint",
72
+ children: t(keys.conditionEmpty)
73
+ }) : groups.map((group, groupIndex) => /* @__PURE__ */ jsxs("div", {
74
+ className: "fb-condition-builder__group",
75
+ children: [
76
+ groupIndex > 0 ? /* @__PURE__ */ jsx("div", {
77
+ className: "fb-condition-builder__or-label",
78
+ children: t(keys.conditionOr)
79
+ }) : null,
80
+ group.map((row, rowIndex) => /* @__PURE__ */ jsxs("div", {
81
+ className: "fb-condition-builder__and-row",
82
+ children: [rowIndex > 0 ? /* @__PURE__ */ jsx("span", {
83
+ className: "fb-condition-builder__and-label",
84
+ children: t(keys.conditionAnd)
85
+ }) : null, /* @__PURE__ */ jsx(ConditionRow, {
86
+ condition: row,
87
+ operands,
88
+ onChange: (next) => updateRow(groupIndex, rowIndex, next),
89
+ onRemove: () => removeRow(groupIndex, rowIndex)
90
+ })]
91
+ }, rowIndex)),
92
+ /* @__PURE__ */ jsx("div", {
93
+ className: "fb-condition-builder__add-condition",
94
+ children: /* @__PURE__ */ jsx(Button, {
95
+ buttonStyle: "icon-label",
96
+ icon: "plus",
97
+ iconStyle: "with-border",
98
+ iconPosition: "left",
99
+ onClick: () => addCondition(groupIndex),
100
+ margin: false,
101
+ children: t(keys.conditionAddCondition)
102
+ })
103
+ })
104
+ ]
105
+ }, groupIndex)), /* @__PURE__ */ jsx("div", {
106
+ className: "fb-condition-builder__actions",
107
+ children: /* @__PURE__ */ jsx(Button, {
108
+ buttonStyle: "icon-label",
109
+ icon: "plus",
110
+ iconStyle: "with-border",
111
+ iconPosition: "left",
112
+ onClick: () => groups.length === 0 ? addCondition(0) : addOrGroup(),
113
+ margin: false,
114
+ children: groups.length === 0 ? t(keys.conditionAddCondition) : t(keys.conditionAddOr)
115
+ })
116
+ })]
117
+ });
118
+ };
119
+ //#endregion
120
+ export { ConditionBuilder };
121
+
122
+ //# sourceMappingURL=ConditionBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionBuilder.js","names":["useTranslation"],"sources":["../../src/client/ConditionBuilder.tsx"],"sourcesContent":["'use client'\n\nimport { Button, useFormFields } from '@payloadcms/ui'\nimport type { Operator, Where } from 'payload'\nimport { reduceFieldsToValues, transformWhereQuery } from 'payload/shared'\nimport { useMemo } from 'react'\nimport { type ConditionFieldType, firstOperatorFor } from '../conditions/fieldTypes'\nimport { keys } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport { ConditionRow, type RowCondition } from './ConditionRow'\nimport { type ConditionOperand, type FieldRow, operandFromRow } from './synthesizeClientField'\nimport './admin.css'\n\nexport type ConditionBuilderProps = {\n\tvalue?: Where\n\tonChange: (next: Where) => void\n\tconditionTypes: Record<string, ConditionFieldType>\n\t/** This field's own machine name, excluded from the operand list (a field cannot condition on itself). */\n\tselfName?: string\n}\n\nconst toRow = (constraint: Record<string, unknown>): RowCondition | null => {\n\tconst field = Object.keys(constraint)[0]\n\tif (!field) {\n\t\treturn null\n\t}\n\tconst ops = constraint[field] as Record<string, unknown>\n\tconst operator = Object.keys(ops)[0] as Operator | undefined\n\tif (!operator) {\n\t\treturn null\n\t}\n\treturn { field, operator, value: ops[operator] }\n}\n\nconst fromRow = (row: RowCondition): Where => ({ [row.field]: { [row.operator]: row.value } })\n\nconst readGroups = (value: Where | undefined): RowCondition[][] => {\n\tif (!value || Object.keys(value).length === 0) {\n\t\treturn []\n\t}\n\tconst canonical = transformWhereQuery(value)\n\tconst or = Array.isArray(canonical.or) ? canonical.or : []\n\treturn or.map((group) => {\n\t\tconst and = Array.isArray((group as Where).and) ? ((group as Where).and as Where[]) : []\n\t\treturn and\n\t\t\t.map((constraint) => toRow(constraint as Record<string, unknown>))\n\t\t\t.filter((row): row is RowCondition => row !== null)\n\t})\n}\n\nconst writeGroups = (groups: RowCondition[][]): Where => ({\n\tor: groups.filter((group) => group.length > 0).map((group) => ({ and: group.map(fromRow) })),\n})\n\nconst operandsFromData = (\n\tdata: Record<string, unknown>,\n\tconditionTypes: Record<string, ConditionFieldType>,\n\tselfName: string | undefined\n): ConditionOperand[] => {\n\tconst rows = Array.isArray(data.fields) ? (data.fields as FieldRow[]) : []\n\treturn rows\n\t\t.map((row) => operandFromRow(row, conditionTypes))\n\t\t.filter((operand): operand is ConditionOperand => operand !== null && operand.name !== selfName)\n}\n\nexport const ConditionBuilder = ({\n\tvalue,\n\tonChange,\n\tconditionTypes,\n\tselfName,\n}: ConditionBuilderProps) => {\n\tconst { t } = useTranslation()\n\t// Serialize the operand list so the builder re-renders only when operands actually change (a field\n\t// added, renamed, retyped, or its options edited), not on every unrelated form-state update.\n\tconst operandsJson = useFormFields(([fields]) =>\n\t\tJSON.stringify(operandsFromData(reduceFieldsToValues(fields, true), conditionTypes, selfName))\n\t)\n\tconst operands = useMemo(() => JSON.parse(operandsJson) as ConditionOperand[], [operandsJson])\n\n\tconst groups = readGroups(value)\n\tconst emit = (next: RowCondition[][]) => onChange(writeGroups(next))\n\n\tconst addCondition = (groupIndex: number) => {\n\t\tconst first = operands[0]\n\t\tif (!first) {\n\t\t\treturn\n\t\t}\n\t\tconst row: RowCondition = {\n\t\t\tfield: first.name,\n\t\t\toperator: firstOperatorFor(first.conditionType),\n\t\t\tvalue: undefined,\n\t\t}\n\t\temit(\n\t\t\tgroups.length === 0\n\t\t\t\t? [[row]]\n\t\t\t\t: groups.map((group, index) => (index === groupIndex ? [...group, row] : group))\n\t\t)\n\t}\n\n\tconst addOrGroup = () => {\n\t\tconst first = operands[0]\n\t\tif (!first) {\n\t\t\treturn\n\t\t}\n\t\temit([\n\t\t\t...groups,\n\t\t\t[{ field: first.name, operator: firstOperatorFor(first.conditionType), value: undefined }],\n\t\t])\n\t}\n\n\tconst updateRow = (groupIndex: number, rowIndex: number, row: RowCondition) =>\n\t\temit(\n\t\t\tgroups.map((group, index) =>\n\t\t\t\tindex === groupIndex\n\t\t\t\t\t? group.map((existing, position) => (position === rowIndex ? row : existing))\n\t\t\t\t\t: group\n\t\t\t)\n\t\t)\n\n\tconst removeRow = (groupIndex: number, rowIndex: number) =>\n\t\temit(\n\t\t\tgroups\n\t\t\t\t.map((group, index) =>\n\t\t\t\t\tindex === groupIndex ? group.filter((_, position) => position !== rowIndex) : group\n\t\t\t\t)\n\t\t\t\t.filter((group) => group.length > 0)\n\t\t)\n\n\tif (operands.length === 0) {\n\t\treturn <p className=\"fb-condition-builder__hint\">{t(keys.conditionNoFields)}</p>\n\t}\n\n\treturn (\n\t\t<div className=\"fb-condition-builder\">\n\t\t\t{groups.length === 0 ? (\n\t\t\t\t<p className=\"fb-condition-builder__hint\">{t(keys.conditionEmpty)}</p>\n\t\t\t) : (\n\t\t\t\tgroups.map((group, groupIndex) => (\n\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: groups are positional and never reordered\n\t\t\t\t\t<div key={groupIndex} className=\"fb-condition-builder__group\">\n\t\t\t\t\t\t{groupIndex > 0 ? (\n\t\t\t\t\t\t\t<div className=\"fb-condition-builder__or-label\">{t(keys.conditionOr)}</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{group.map((row, rowIndex) => (\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and never reordered\n\t\t\t\t\t\t\t<div key={rowIndex} className=\"fb-condition-builder__and-row\">\n\t\t\t\t\t\t\t\t{rowIndex > 0 ? (\n\t\t\t\t\t\t\t\t\t<span className=\"fb-condition-builder__and-label\">{t(keys.conditionAnd)}</span>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<ConditionRow\n\t\t\t\t\t\t\t\t\tcondition={row}\n\t\t\t\t\t\t\t\t\toperands={operands}\n\t\t\t\t\t\t\t\t\tonChange={(next) => updateRow(groupIndex, rowIndex, next)}\n\t\t\t\t\t\t\t\t\tonRemove={() => removeRow(groupIndex, rowIndex)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<div className=\"fb-condition-builder__add-condition\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tbuttonStyle=\"icon-label\"\n\t\t\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\t\t\ticonStyle=\"with-border\"\n\t\t\t\t\t\t\t\ticonPosition=\"left\"\n\t\t\t\t\t\t\t\tonClick={() => addCondition(groupIndex)}\n\t\t\t\t\t\t\t\tmargin={false}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t(keys.conditionAddCondition)}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))\n\t\t\t)}\n\t\t\t<div className=\"fb-condition-builder__actions\">\n\t\t\t\t<Button\n\t\t\t\t\tbuttonStyle=\"icon-label\"\n\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\ticonStyle=\"with-border\"\n\t\t\t\t\ticonPosition=\"left\"\n\t\t\t\t\tonClick={() => (groups.length === 0 ? addCondition(0) : addOrGroup())}\n\t\t\t\t\tmargin={false}\n\t\t\t\t>\n\t\t\t\t\t{groups.length === 0 ? t(keys.conditionAddCondition) : t(keys.conditionAddOr)}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,MAAM,SAAS,eAA6D;CAC3E,MAAM,QAAQ,OAAO,KAAK,UAAU,EAAE;CACtC,IAAI,CAAC,OACJ,OAAO;CAER,MAAM,MAAM,WAAW;CACvB,MAAM,WAAW,OAAO,KAAK,GAAG,EAAE;CAClC,IAAI,CAAC,UACJ,OAAO;CAER,OAAO;EAAE;EAAO;EAAU,OAAO,IAAI;CAAU;AAChD;AAEA,MAAM,WAAW,SAA8B,GAAG,IAAI,QAAQ,GAAG,IAAI,WAAW,IAAI,MAAM,EAAE;AAE5F,MAAM,cAAc,UAA+C;CAClE,IAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAC3C,OAAO,CAAC;CAET,MAAM,YAAY,oBAAoB,KAAK;CAE3C,QADW,MAAM,QAAQ,UAAU,EAAE,IAAI,UAAU,KAAK,CAAC,GAC/C,KAAK,UAAU;EAExB,QADY,MAAM,QAAS,MAAgB,GAAG,IAAM,MAAgB,MAAkB,CAAC,GAErF,KAAK,eAAe,MAAM,UAAqC,CAAC,EAChE,QAAQ,QAA6B,QAAQ,IAAI;CACpD,CAAC;AACF;AAEA,MAAM,eAAe,YAAqC,EACzD,IAAI,OAAO,QAAQ,UAAU,MAAM,SAAS,CAAC,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,IAAI,OAAO,EAAE,EAAE,EAC5F;AAEA,MAAM,oBACL,MACA,gBACA,aACwB;CAExB,QADa,MAAM,QAAQ,KAAK,MAAM,IAAK,KAAK,SAAwB,CAAC,GAEvE,KAAK,QAAQ,eAAe,KAAK,cAAc,CAAC,EAChD,QAAQ,YAAyC,YAAY,QAAQ,QAAQ,SAAS,QAAQ;AACjG;AAEA,MAAa,oBAAoB,EAChC,OACA,UACA,gBACA,eAC4B;CAC5B,MAAM,EAAE,MAAMA,iBAAe;CAG7B,MAAM,eAAe,eAAe,CAAC,YACpC,KAAK,UAAU,iBAAiB,qBAAqB,QAAQ,IAAI,GAAG,gBAAgB,QAAQ,CAAC,CAC9F;CACA,MAAM,WAAW,cAAc,KAAK,MAAM,YAAY,GAAyB,CAAC,YAAY,CAAC;CAE7F,MAAM,SAAS,WAAW,KAAK;CAC/B,MAAM,QAAQ,SAA2B,SAAS,YAAY,IAAI,CAAC;CAEnE,MAAM,gBAAgB,eAAuB;EAC5C,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,OACJ;EAED,MAAM,MAAoB;GACzB,OAAO,MAAM;GACb,UAAU,iBAAiB,MAAM,aAAa;GAC9C,OAAO,KAAA;EACR;EACA,KACC,OAAO,WAAW,IACf,CAAC,CAAC,GAAG,CAAC,IACN,OAAO,KAAK,OAAO,UAAW,UAAU,aAAa,CAAC,GAAG,OAAO,GAAG,IAAI,KAAM,CACjF;CACD;CAEA,MAAM,mBAAmB;EACxB,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,OACJ;EAED,KAAK,CACJ,GAAG,QACH,CAAC;GAAE,OAAO,MAAM;GAAM,UAAU,iBAAiB,MAAM,aAAa;GAAG,OAAO,KAAA;EAAU,CAAC,CAC1F,CAAC;CACF;CAEA,MAAM,aAAa,YAAoB,UAAkB,QACxD,KACC,OAAO,KAAK,OAAO,UAClB,UAAU,aACP,MAAM,KAAK,UAAU,aAAc,aAAa,WAAW,MAAM,QAAS,IAC1E,KACJ,CACD;CAED,MAAM,aAAa,YAAoB,aACtC,KACC,OACE,KAAK,OAAO,UACZ,UAAU,aAAa,MAAM,QAAQ,GAAG,aAAa,aAAa,QAAQ,IAAI,KAC/E,EACC,QAAQ,UAAU,MAAM,SAAS,CAAC,CACrC;CAED,IAAI,SAAS,WAAW,GACvB,OAAO,oBAAC,KAAD;EAAG,WAAU;YAA8B,EAAE,KAAK,iBAAiB;CAAK,CAAA;CAGhF,OACC,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,OAAO,WAAW,IAClB,oBAAC,KAAD;GAAG,WAAU;aAA8B,EAAE,KAAK,cAAc;EAAK,CAAA,IAErE,OAAO,KAAK,OAAO,eAElB,qBAAC,OAAD;GAAsB,WAAU;aAAhC;IACE,aAAa,IACb,oBAAC,OAAD;KAAK,WAAU;eAAkC,EAAE,KAAK,WAAW;IAAO,CAAA,IACvE;IACH,MAAM,KAAK,KAAK,aAEhB,qBAAC,OAAD;KAAoB,WAAU;eAA9B,CACE,WAAW,IACX,oBAAC,QAAD;MAAM,WAAU;gBAAmC,EAAE,KAAK,YAAY;KAAQ,CAAA,IAC3E,MACJ,oBAAC,cAAD;MACC,WAAW;MACD;MACV,WAAW,SAAS,UAAU,YAAY,UAAU,IAAI;MACxD,gBAAgB,UAAU,YAAY,QAAQ;KAC9C,CAAA,CACG;OAVK,QAUL,CACL;IACD,oBAAC,OAAD;KAAK,WAAU;eACd,oBAAC,QAAD;MACC,aAAY;MACZ,MAAK;MACL,WAAU;MACV,cAAa;MACb,eAAe,aAAa,UAAU;MACtC,QAAQ;gBAEP,EAAE,KAAK,qBAAqB;KACtB,CAAA;IACJ,CAAA;GACD;KA9BK,UA8BL,CACL,GAEF,oBAAC,OAAD;GAAK,WAAU;aACd,oBAAC,QAAD;IACC,aAAY;IACZ,MAAK;IACL,WAAU;IACV,cAAa;IACb,eAAgB,OAAO,WAAW,IAAI,aAAa,CAAC,IAAI,WAAW;IACnE,QAAQ;cAEP,OAAO,WAAW,IAAI,EAAE,KAAK,qBAAqB,IAAI,EAAE,KAAK,cAAc;GACrE,CAAA;EACJ,CAAA,CACD;;AAEP"}
@@ -0,0 +1,150 @@
1
+ "use client";
2
+ import { keys } from "../translations/keys.js";
3
+ import { conditionOperators, firstOperatorFor, operatorLabelKey, operatorValueShape } from "../conditions/fieldTypes.js";
4
+ import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
5
+ import { dateClientField, numberClientField, selectClientField, textClientField } from "./synthesizeClientField.js";
6
+ import { Button, DateCondition, NumberCondition, ReactSelect, SelectCondition, TextCondition } from "@payloadcms/ui";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/client/ConditionRow.tsx
9
+ /** ReactSelect's `onChange` hands back `Option | Option[]`; narrow it to the single chosen option. */
10
+ const singleOption = (selected) => Array.isArray(selected) ? selected[0] : selected;
11
+ const ConditionRow = ({ condition, operands, onChange, onRemove }) => {
12
+ const { t, i18n } = useTranslation$1();
13
+ const operand = operands.find((entry) => entry.name === condition.field);
14
+ const conditionType = operand?.conditionType ?? "text";
15
+ const operators = conditionOperators[conditionType];
16
+ const fieldOptions = operands.map((entry) => ({
17
+ label: entry.label,
18
+ value: entry.name
19
+ }));
20
+ const operatorOptions = operators.map((operator) => ({
21
+ label: i18n.t(operatorLabelKey(operator)),
22
+ value: operator
23
+ }));
24
+ const handleFieldChange = (selected) => {
25
+ const chosen = singleOption(selected);
26
+ const next = operands.find((entry) => entry.name === chosen?.value);
27
+ if (!next) return;
28
+ onChange({
29
+ field: next.name,
30
+ operator: firstOperatorFor(next.conditionType),
31
+ value: void 0
32
+ });
33
+ };
34
+ const handleOperatorChange = (selected) => {
35
+ const chosen = singleOption(selected);
36
+ if (!chosen) return;
37
+ const operator = chosen.value;
38
+ const keepValue = operatorValueShape(condition.operator) === operatorValueShape(operator);
39
+ onChange({
40
+ ...condition,
41
+ operator,
42
+ value: keepValue ? condition.value : void 0
43
+ });
44
+ };
45
+ return /* @__PURE__ */ jsxs("div", {
46
+ className: "fb-condition-row",
47
+ children: [
48
+ /* @__PURE__ */ jsx("div", {
49
+ className: "fb-condition-row__field",
50
+ children: /* @__PURE__ */ jsx(ReactSelect, {
51
+ options: fieldOptions,
52
+ value: fieldOptions.find((option) => option.value === condition.field),
53
+ placeholder: t(keys.conditionSelectField),
54
+ isClearable: false,
55
+ onChange: handleFieldChange
56
+ })
57
+ }),
58
+ /* @__PURE__ */ jsx("div", {
59
+ className: "fb-condition-row__operator",
60
+ children: /* @__PURE__ */ jsx(ReactSelect, {
61
+ options: operatorOptions,
62
+ value: operatorOptions.find((option) => option.value === condition.operator),
63
+ disabled: !operand,
64
+ isClearable: false,
65
+ onChange: handleOperatorChange
66
+ })
67
+ }),
68
+ /* @__PURE__ */ jsx("div", {
69
+ className: "fb-condition-row__value",
70
+ children: /* @__PURE__ */ jsx(ConditionValue, {
71
+ conditionType,
72
+ operand,
73
+ operator: condition.operator,
74
+ value: condition.value,
75
+ onChange: (value) => onChange({
76
+ ...condition,
77
+ value
78
+ })
79
+ })
80
+ }),
81
+ /* @__PURE__ */ jsx("div", {
82
+ className: "fb-condition-row__remove",
83
+ children: /* @__PURE__ */ jsx(Button, {
84
+ buttonStyle: "icon-label",
85
+ icon: "x",
86
+ onClick: onRemove,
87
+ "aria-label": t(keys.conditionRemove),
88
+ margin: false
89
+ })
90
+ })
91
+ ]
92
+ });
93
+ };
94
+ const ConditionValue = ({ conditionType, operand, operator, value, onChange }) => {
95
+ const { t } = useTranslation$1();
96
+ if (conditionType === "checkbox" || operatorValueShape(operator) === "boolean") {
97
+ const options = [{
98
+ label: t(keys.conditionTrue),
99
+ value: "true"
100
+ }, {
101
+ label: t(keys.conditionFalse),
102
+ value: "false"
103
+ }];
104
+ const handleBooleanChange = (selected) => {
105
+ onChange(singleOption(selected)?.value === "true");
106
+ };
107
+ return /* @__PURE__ */ jsx(ReactSelect, {
108
+ options,
109
+ value: options.find((option) => String(option.value) === String(value)) ?? options[0],
110
+ isClearable: false,
111
+ onChange: handleBooleanChange
112
+ });
113
+ }
114
+ if (!operand) return null;
115
+ switch (conditionType) {
116
+ case "number": return /* @__PURE__ */ jsx(NumberCondition, {
117
+ disabled: false,
118
+ field: numberClientField(operand),
119
+ operator,
120
+ value,
121
+ onChange: (next) => onChange(next)
122
+ });
123
+ case "date": return /* @__PURE__ */ jsx(DateCondition, {
124
+ disabled: false,
125
+ field: dateClientField(operand),
126
+ operator,
127
+ value,
128
+ onChange: (next) => onChange(next)
129
+ });
130
+ case "select": return /* @__PURE__ */ jsx(SelectCondition, {
131
+ disabled: false,
132
+ field: selectClientField(operand),
133
+ operator,
134
+ options: operand.options ?? [],
135
+ value,
136
+ onChange: (next) => onChange(next)
137
+ });
138
+ default: return /* @__PURE__ */ jsx(TextCondition, {
139
+ disabled: false,
140
+ field: textClientField(operand),
141
+ operator,
142
+ value,
143
+ onChange: (next) => onChange(next)
144
+ });
145
+ }
146
+ };
147
+ //#endregion
148
+ export { ConditionRow };
149
+
150
+ //# sourceMappingURL=ConditionRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionRow.js","names":["useTranslation"],"sources":["../../src/client/ConditionRow.tsx"],"sourcesContent":["'use client'\n\nimport {\n\tButton,\n\tDateCondition,\n\tNumberCondition,\n\tReactSelect,\n\ttype ReactSelectOption,\n\tSelectCondition,\n\tTextCondition,\n} from '@payloadcms/ui'\nimport type { Operator } from 'payload'\nimport {\n\tconditionOperators,\n\tfirstOperatorFor,\n\toperatorLabelKey,\n\toperatorValueShape,\n} from '../conditions/fieldTypes'\nimport { keys } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport {\n\ttype ConditionOperand,\n\tdateClientField,\n\tnumberClientField,\n\tselectClientField,\n\ttextClientField,\n} from './synthesizeClientField'\n\nexport type RowCondition = { field: string; operator: Operator; value: unknown }\n\nexport type ConditionRowProps = {\n\tcondition: RowCondition\n\toperands: ConditionOperand[]\n\tonChange: (next: RowCondition) => void\n\tonRemove: () => void\n}\n\n/** ReactSelect's `onChange` hands back `Option | Option[]`; narrow it to the single chosen option. */\nconst singleOption = (\n\tselected: ReactSelectOption | ReactSelectOption[]\n): ReactSelectOption | undefined => (Array.isArray(selected) ? selected[0] : selected)\n\nexport const ConditionRow = ({ condition, operands, onChange, onRemove }: ConditionRowProps) => {\n\tconst { t, i18n } = useTranslation()\n\tconst operand = operands.find((entry) => entry.name === condition.field)\n\tconst conditionType = operand?.conditionType ?? 'text'\n\tconst operators = conditionOperators[conditionType]\n\n\tconst fieldOptions: ReactSelectOption[] = operands.map((entry) => ({\n\t\tlabel: entry.label,\n\t\tvalue: entry.name,\n\t}))\n\tconst operatorOptions: ReactSelectOption[] = operators.map((operator) => ({\n\t\tlabel: i18n.t(operatorLabelKey(operator)),\n\t\tvalue: operator,\n\t}))\n\n\tconst handleFieldChange = (selected: ReactSelectOption | ReactSelectOption[]) => {\n\t\tconst chosen = singleOption(selected)\n\t\tconst next = operands.find((entry) => entry.name === chosen?.value)\n\t\tif (!next) {\n\t\t\treturn\n\t\t}\n\t\tonChange({\n\t\t\tfield: next.name,\n\t\t\toperator: firstOperatorFor(next.conditionType),\n\t\t\tvalue: undefined,\n\t\t})\n\t}\n\n\tconst handleOperatorChange = (selected: ReactSelectOption | ReactSelectOption[]) => {\n\t\tconst chosen = singleOption(selected)\n\t\tif (!chosen) {\n\t\t\treturn\n\t\t}\n\t\tconst operator = chosen.value as Operator\n\t\tconst keepValue = operatorValueShape(condition.operator) === operatorValueShape(operator)\n\t\tonChange({ ...condition, operator, value: keepValue ? condition.value : undefined })\n\t}\n\n\treturn (\n\t\t<div className=\"fb-condition-row\">\n\t\t\t<div className=\"fb-condition-row__field\">\n\t\t\t\t<ReactSelect\n\t\t\t\t\toptions={fieldOptions}\n\t\t\t\t\tvalue={fieldOptions.find((option) => option.value === condition.field)}\n\t\t\t\t\tplaceholder={t(keys.conditionSelectField)}\n\t\t\t\t\tisClearable={false}\n\t\t\t\t\tonChange={handleFieldChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"fb-condition-row__operator\">\n\t\t\t\t<ReactSelect\n\t\t\t\t\toptions={operatorOptions}\n\t\t\t\t\tvalue={operatorOptions.find((option) => option.value === condition.operator)}\n\t\t\t\t\tdisabled={!operand}\n\t\t\t\t\tisClearable={false}\n\t\t\t\t\tonChange={handleOperatorChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"fb-condition-row__value\">\n\t\t\t\t<ConditionValue\n\t\t\t\t\tconditionType={conditionType}\n\t\t\t\t\toperand={operand}\n\t\t\t\t\toperator={condition.operator}\n\t\t\t\t\tvalue={condition.value}\n\t\t\t\t\tonChange={(value) => onChange({ ...condition, value })}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"fb-condition-row__remove\">\n\t\t\t\t<Button\n\t\t\t\t\tbuttonStyle=\"icon-label\"\n\t\t\t\t\ticon=\"x\"\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\taria-label={t(keys.conditionRemove)}\n\t\t\t\t\tmargin={false}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\ntype ConditionValueProps = {\n\tconditionType: ConditionOperand['conditionType']\n\toperand?: ConditionOperand\n\toperator: Operator\n\tvalue: unknown\n\tonChange: (value: unknown) => void\n}\n\nconst ConditionValue = ({\n\tconditionType,\n\toperand,\n\toperator,\n\tvalue,\n\tonChange,\n}: ConditionValueProps) => {\n\tconst { t } = useTranslation()\n\tif (conditionType === 'checkbox' || operatorValueShape(operator) === 'boolean') {\n\t\tconst options: ReactSelectOption[] = [\n\t\t\t{ label: t(keys.conditionTrue), value: 'true' },\n\t\t\t{ label: t(keys.conditionFalse), value: 'false' },\n\t\t]\n\t\tconst handleBooleanChange = (selected: ReactSelectOption | ReactSelectOption[]) => {\n\t\t\tconst chosen = singleOption(selected)\n\t\t\tonChange(chosen?.value === 'true')\n\t\t}\n\t\treturn (\n\t\t\t<ReactSelect\n\t\t\t\toptions={options}\n\t\t\t\tvalue={options.find((option) => String(option.value) === String(value)) ?? options[0]}\n\t\t\t\tisClearable={false}\n\t\t\t\tonChange={handleBooleanChange}\n\t\t\t/>\n\t\t)\n\t}\n\tif (!operand) {\n\t\treturn null\n\t}\n\tswitch (conditionType) {\n\t\tcase 'number':\n\t\t\treturn (\n\t\t\t\t<NumberCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={numberClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\tvalue={value as number | number[]}\n\t\t\t\t\tonChange={(next: string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase 'date':\n\t\t\treturn (\n\t\t\t\t<DateCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={dateClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\tvalue={value as Date | string}\n\t\t\t\t\tonChange={(next: Date | string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase 'select':\n\t\t\treturn (\n\t\t\t\t<SelectCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={selectClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\toptions={operand.options ?? []}\n\t\t\t\t\tvalue={value as string}\n\t\t\t\t\tonChange={(next: string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<TextCondition\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tfield={textClientField(operand)}\n\t\t\t\t\toperator={operator}\n\t\t\t\t\tvalue={value as string | string[]}\n\t\t\t\t\tonChange={(next: string) => onChange(next)}\n\t\t\t\t/>\n\t\t\t)\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ //#region src/client/ConsentBlockLabel.d.ts
2
+ /**
3
+ * Block row header for a consent field. The consent field stores only the source id, so this resolves
4
+ * it to the source's name via the same `consent-sources` endpoint the Source select uses, rendering
5
+ * "NN Consent {name}". Falls back to "NN Consent" while loading, when unset, or on an unsaved form
6
+ * (no document id yet, so the endpoint cannot resolve options).
7
+ */
8
+ declare const ConsentBlockLabel: ({
9
+ typeLabelKey
10
+ }: {
11
+ typeLabelKey?: string;
12
+ }) => import("react/jsx-runtime").JSX.Element;
13
+ //#endregion
14
+ export { ConsentBlockLabel };
15
+ //# sourceMappingURL=ConsentBlockLabel.d.ts.map
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
3
+ import { buildEndpointOptionsUrl, parseEndpointOptions } from "./endpointOptions.js";
4
+ import { useConfig, useDocumentInfo, useRowLabel } from "@payloadcms/ui";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { useEffect, useState } from "react";
7
+ //#region src/client/ConsentBlockLabel.tsx
8
+ /** Endpoint url -> `{ sourceId: name }`, shared across every consent block label and re-render. */
9
+ const nameCache = /* @__PURE__ */ new Map();
10
+ /**
11
+ * Block row header for a consent field. The consent field stores only the source id, so this resolves
12
+ * it to the source's name via the same `consent-sources` endpoint the Source select uses, rendering
13
+ * "NN Consent {name}". Falls back to "NN Consent" while loading, when unset, or on an unsaved form
14
+ * (no document id yet, so the endpoint cannot resolve options).
15
+ */
16
+ const ConsentBlockLabel = ({ typeLabelKey }) => {
17
+ const { data, rowNumber } = useRowLabel();
18
+ const { t } = useTranslation$1();
19
+ const { id, collectionSlug } = useDocumentInfo();
20
+ const { config } = useConfig();
21
+ const source = typeof data?.source === "string" ? data.source : "";
22
+ const [names, setNames] = useState({});
23
+ useEffect(() => {
24
+ if (id == null || !collectionSlug) return;
25
+ const url = buildEndpointOptionsUrl({
26
+ apiRoute: config.routes.api,
27
+ collectionSlug,
28
+ id,
29
+ endpoint: "consent-sources"
30
+ });
31
+ const cached = nameCache.get(url);
32
+ if (cached) {
33
+ setNames(cached);
34
+ return;
35
+ }
36
+ const controller = new AbortController();
37
+ fetch(url, {
38
+ credentials: "include",
39
+ headers: { Accept: "application/json" },
40
+ signal: controller.signal
41
+ }).then(async (response) => {
42
+ if (!response.ok) throw new Error(`Options request failed with ${response.status}`);
43
+ const map = Object.fromEntries(parseEndpointOptions(await response.json()).map((o) => [o.value, o.label]));
44
+ nameCache.set(url, map);
45
+ setNames(map);
46
+ }).catch(() => {});
47
+ return () => controller.abort();
48
+ }, [
49
+ config.routes.api,
50
+ collectionSlug,
51
+ id
52
+ ]);
53
+ const typeLabel = typeLabelKey ? t(typeLabelKey) : "";
54
+ const number = String((rowNumber ?? 0) + 1).padStart(2, "0");
55
+ const name = source ? names[source] ?? "" : "";
56
+ return /* @__PURE__ */ jsxs("span", {
57
+ style: {
58
+ alignItems: "center",
59
+ display: "inline-flex",
60
+ gap: "0.5rem"
61
+ },
62
+ children: [/* @__PURE__ */ jsx("span", {
63
+ style: { color: "var(--theme-elevation-500)" },
64
+ children: typeLabel ? `${number} ${typeLabel}` : number
65
+ }), name ? /* @__PURE__ */ jsx("span", { children: name }) : null]
66
+ });
67
+ };
68
+ //#endregion
69
+ export { ConsentBlockLabel };
70
+
71
+ //# sourceMappingURL=ConsentBlockLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsentBlockLabel.js","names":["useTranslation"],"sources":["../../src/client/ConsentBlockLabel.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig, useDocumentInfo, useRowLabel } from '@payloadcms/ui'\nimport { useEffect, useState } from 'react'\nimport type { TranslationKey } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport { buildEndpointOptionsUrl, parseEndpointOptions } from './endpointOptions'\n\ntype RowData = { source?: unknown }\n\n/** Endpoint url -> `{ sourceId: name }`, shared across every consent block label and re-render. */\nconst nameCache = new Map<string, Record<string, string>>()\n\n/**\n * Block row header for a consent field. The consent field stores only the source id, so this resolves\n * it to the source's name via the same `consent-sources` endpoint the Source select uses, rendering\n * \"NN Consent {name}\". Falls back to \"NN Consent\" while loading, when unset, or on an unsaved form\n * (no document id yet, so the endpoint cannot resolve options).\n */\nexport const ConsentBlockLabel = ({ typeLabelKey }: { typeLabelKey?: string }) => {\n\tconst { data, rowNumber } = useRowLabel<RowData>()\n\tconst { t } = useTranslation()\n\tconst { id, collectionSlug } = useDocumentInfo()\n\tconst { config } = useConfig()\n\tconst source = typeof data?.source === 'string' ? data.source : ''\n\tconst [names, setNames] = useState<Record<string, string>>({})\n\n\tuseEffect(() => {\n\t\tif (id == null || !collectionSlug) {\n\t\t\treturn\n\t\t}\n\t\tconst url = buildEndpointOptionsUrl({\n\t\t\tapiRoute: config.routes.api,\n\t\t\tcollectionSlug,\n\t\t\tid,\n\t\t\tendpoint: 'consent-sources',\n\t\t})\n\t\tconst cached = nameCache.get(url)\n\t\tif (cached) {\n\t\t\tsetNames(cached)\n\t\t\treturn\n\t\t}\n\t\tconst controller = new AbortController()\n\t\tfetch(url, {\n\t\t\tcredentials: 'include',\n\t\t\theaders: { Accept: 'application/json' },\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then(async (response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Options request failed with ${response.status}`)\n\t\t\t\t}\n\t\t\t\tconst map = Object.fromEntries(\n\t\t\t\t\tparseEndpointOptions(await response.json()).map((o) => [o.value, o.label])\n\t\t\t\t)\n\t\t\t\tnameCache.set(url, map)\n\t\t\t\tsetNames(map)\n\t\t\t})\n\t\t\t.catch(() => {})\n\t\treturn () => controller.abort()\n\t}, [config.routes.api, collectionSlug, id])\n\n\tconst typeLabel = typeLabelKey ? t(typeLabelKey as TranslationKey) : ''\n\tconst number = String((rowNumber ?? 0) + 1).padStart(2, '0')\n\tconst name = source ? (names[source] ?? '') : ''\n\treturn (\n\t\t<span style={{ alignItems: 'center', display: 'inline-flex', gap: '0.5rem' }}>\n\t\t\t<span style={{ color: 'var(--theme-elevation-500)' }}>\n\t\t\t\t{typeLabel ? `${number} ${typeLabel}` : number}\n\t\t\t</span>\n\t\t\t{name ? <span>{name}</span> : null}\n\t\t</span>\n\t)\n}\n"],"mappings":";;;;;;;;AAWA,MAAM,4BAAY,IAAI,IAAoC;;;;;;;AAQ1D,MAAa,qBAAqB,EAAE,mBAA8C;CACjF,MAAM,EAAE,MAAM,cAAc,YAAqB;CACjD,MAAM,EAAE,MAAMA,iBAAe;CAC7B,MAAM,EAAE,IAAI,mBAAmB,gBAAgB;CAC/C,MAAM,EAAE,WAAW,UAAU;CAC7B,MAAM,SAAS,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS;CAChE,MAAM,CAAC,OAAO,YAAY,SAAiC,CAAC,CAAC;CAE7D,gBAAgB;EACf,IAAI,MAAM,QAAQ,CAAC,gBAClB;EAED,MAAM,MAAM,wBAAwB;GACnC,UAAU,OAAO,OAAO;GACxB;GACA;GACA,UAAU;EACX,CAAC;EACD,MAAM,SAAS,UAAU,IAAI,GAAG;EAChC,IAAI,QAAQ;GACX,SAAS,MAAM;GACf;EACD;EACA,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,KAAK;GACV,aAAa;GACb,SAAS,EAAE,QAAQ,mBAAmB;GACtC,QAAQ,WAAW;EACpB,CAAC,EACC,KAAK,OAAO,aAAa;GACzB,IAAI,CAAC,SAAS,IACb,MAAM,IAAI,MAAM,+BAA+B,SAAS,QAAQ;GAEjE,MAAM,MAAM,OAAO,YAClB,qBAAqB,MAAM,SAAS,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAC1E;GACA,UAAU,IAAI,KAAK,GAAG;GACtB,SAAS,GAAG;EACb,CAAC,EACA,YAAY,CAAC,CAAC;EAChB,aAAa,WAAW,MAAM;CAC/B,GAAG;EAAC,OAAO,OAAO;EAAK;EAAgB;CAAE,CAAC;CAE1C,MAAM,YAAY,eAAe,EAAE,YAA8B,IAAI;CACrE,MAAM,SAAS,QAAQ,aAAa,KAAK,CAAC,EAAE,SAAS,GAAG,GAAG;CAC3D,MAAM,OAAO,SAAU,MAAM,WAAW,KAAM;CAC9C,OACC,qBAAC,QAAD;EAAM,OAAO;GAAE,YAAY;GAAU,SAAS;GAAe,KAAK;EAAS;YAA3E,CACC,oBAAC,QAAD;GAAM,OAAO,EAAE,OAAO,6BAA6B;aACjD,YAAY,GAAG,OAAO,GAAG,cAAc;EACnC,CAAA,GACL,OAAO,oBAAC,QAAD,EAAA,UAAO,KAAW,CAAA,IAAI,IACzB;;AAER"}
@@ -0,0 +1,9 @@
1
+ //#region src/client/ConsentSourceRowLabel.d.ts
2
+ /**
3
+ * Row header for a consent source array row: shows the source `name` (e.g. "Privacy Policy") instead
4
+ * of Payload's default "Consent source NN". Falls back to the singular label + number while unnamed.
5
+ */
6
+ declare const ConsentSourceRowLabel: () => import("react/jsx-runtime").JSX.Element;
7
+ //#endregion
8
+ export { ConsentSourceRowLabel };
9
+ //# sourceMappingURL=ConsentSourceRowLabel.d.ts.map
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { keys } from "../translations/keys.js";
3
+ import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
4
+ import { useRowLabel } from "@payloadcms/ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/client/ConsentSourceRowLabel.tsx
7
+ /**
8
+ * Row header for a consent source array row: shows the source `name` (e.g. "Privacy Policy") instead
9
+ * of Payload's default "Consent source NN". Falls back to the singular label + number while unnamed.
10
+ */
11
+ const ConsentSourceRowLabel = () => {
12
+ const { data, rowNumber } = useRowLabel();
13
+ const { t } = useTranslation$1();
14
+ const name = typeof data?.name === "string" && data.name.trim().length > 0 ? data.name.trim() : "";
15
+ const number = String((rowNumber ?? 0) + 1).padStart(2, "0");
16
+ return /* @__PURE__ */ jsx("span", { children: name || `${t(keys.consentSourceSingular)} ${number}` });
17
+ };
18
+ //#endregion
19
+ export { ConsentSourceRowLabel };
20
+
21
+ //# sourceMappingURL=ConsentSourceRowLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsentSourceRowLabel.js","names":["useTranslation"],"sources":["../../src/client/ConsentSourceRowLabel.tsx"],"sourcesContent":["'use client'\n\nimport { useRowLabel } from '@payloadcms/ui'\nimport { keys } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\n\ntype RowData = { name?: unknown }\n\n/**\n * Row header for a consent source array row: shows the source `name` (e.g. \"Privacy Policy\") instead\n * of Payload's default \"Consent source NN\". Falls back to the singular label + number while unnamed.\n */\nexport const ConsentSourceRowLabel = () => {\n\tconst { data, rowNumber } = useRowLabel<RowData>()\n\tconst { t } = useTranslation()\n\tconst name = typeof data?.name === 'string' && data.name.trim().length > 0 ? data.name.trim() : ''\n\tconst number = String((rowNumber ?? 0) + 1).padStart(2, '0')\n\treturn <span>{name || `${t(keys.consentSourceSingular)} ${number}`}</span>\n}\n"],"mappings":";;;;;;;;;;AAYA,MAAa,8BAA8B;CAC1C,MAAM,EAAE,MAAM,cAAc,YAAqB;CACjD,MAAM,EAAE,MAAMA,iBAAe;CAC7B,MAAM,OAAO,OAAO,MAAM,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,IAAI,KAAK,KAAK,KAAK,IAAI;CAChG,MAAM,SAAS,QAAQ,aAAa,KAAK,CAAC,EAAE,SAAS,GAAG,GAAG;CAC3D,OAAO,oBAAC,QAAD,EAAA,UAAO,QAAQ,GAAG,EAAE,KAAK,qBAAqB,EAAE,GAAG,SAAe,CAAA;AAC1E"}
@@ -0,0 +1,46 @@
1
+ import { TranslationKey } from "../translations/keys.js";
2
+
3
+ //#region src/client/EndpointOptionsSelect.d.ts
4
+ /** Standard text-field client props plus this component's `clientProps`. */
5
+ type EndpointOptionsSelectProps = {
6
+ /** The field path within the document (Payload-injected, not the endpoint path). */path?: string;
7
+ field?: {
8
+ label?: unknown;
9
+ admin?: {
10
+ description?: unknown;
11
+ width?: string;
12
+ };
13
+ };
14
+ label?: unknown;
15
+ /**
16
+ * Endpoint subpath under the current document's collection API route; `'poll-options'` fetches
17
+ * `GET {routes.api}/{collectionSlug}/{id}/poll-options`. The endpoint must return
18
+ * `{ options: { label, value }[] }`.
19
+ */
20
+ endpoint: string;
21
+ /**
22
+ * Field description as a translation key, resolved client-side. Payload drops `admin.description`
23
+ * functions from client fields, so a translated description must travel as a key; a static
24
+ * `admin.description` string still renders when this is unset.
25
+ */
26
+ descriptionKey?: TranslationKey; /** Mirrors ReactSelect's `isClearable`; defaults to true. */
27
+ isClearable?: boolean;
28
+ /**
29
+ * Render a multi-value select bound to a `string[]`, for a `hasMany` field (e.g. a poll outcome
30
+ * with tied winners). Default false: a single-value select bound to a `string`.
31
+ */
32
+ isMulti?: boolean;
33
+ };
34
+ /**
35
+ * A select whose options load from a document-scoped plugin endpoint, for stored values whose
36
+ * valid choices only the server knows (e.g. a poll's source-resolved options). The pattern: pass
37
+ * `endpoint` via `clientProps`, the component reads the document id from `useDocumentInfo` and the
38
+ * API route from `useConfig`, fetches once per document with the admin cookie, and renders
39
+ * translated loading/error states. The stored value stays selectable even when it is missing from
40
+ * the fetched options (or the fetch failed), so opening an old document never silently drops data;
41
+ * unsaved documents skip the fetch since the server cannot resolve options for them yet.
42
+ */
43
+ declare const EndpointOptionsSelect: (props: EndpointOptionsSelectProps) => import("react/jsx-runtime").JSX.Element;
44
+ //#endregion
45
+ export { EndpointOptionsSelect };
46
+ //# sourceMappingURL=EndpointOptionsSelect.d.ts.map