@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.
- package/CHANGELOG.md +345 -0
- package/README.md +45 -1402
- package/dist/actions/body/converters.d.ts +20 -0
- package/dist/actions/body/converters.js +57 -0
- package/dist/actions/body/converters.js.map +1 -0
- package/dist/actions/body/escapeHtml.d.ts +6 -0
- package/dist/actions/body/escapeHtml.js +14 -0
- package/dist/actions/body/escapeHtml.js.map +1 -0
- package/dist/actions/body/serializeBody.d.ts +55 -0
- package/dist/actions/body/serializeBody.js +78 -0
- package/dist/actions/body/serializeBody.js.map +1 -0
- package/dist/actions/body/serializeSlate.js +31 -0
- package/dist/actions/body/serializeSlate.js.map +1 -0
- package/dist/actions/body/textOfBody.d.ts +13 -0
- package/dist/actions/body/textOfBody.js +35 -0
- package/dist/actions/body/textOfBody.js.map +1 -0
- package/dist/actions/body/wildcards.d.ts +10 -0
- package/dist/actions/body/wildcards.js +33 -0
- package/dist/actions/body/wildcards.js.map +1 -0
- package/dist/actions/buildActionBlocks.js +22 -0
- package/dist/actions/buildActionBlocks.js.map +1 -0
- package/dist/actions/builtin/confirmation.js +52 -0
- package/dist/actions/builtin/confirmation.js.map +1 -0
- package/dist/actions/builtin/emailAction.d.ts +17 -0
- package/dist/actions/builtin/emailAction.js +83 -0
- package/dist/actions/builtin/emailAction.js.map +1 -0
- package/dist/actions/builtin/emailTeam.js +22 -0
- package/dist/actions/builtin/emailTeam.js.map +1 -0
- package/dist/actions/builtin/index.d.ts +22 -0
- package/dist/actions/builtin/index.js +27 -0
- package/dist/actions/builtin/index.js.map +1 -0
- package/dist/actions/builtin/signedWebhook.js +53 -0
- package/dist/actions/builtin/signedWebhook.js.map +1 -0
- package/dist/actions/defineAction.d.ts +37 -0
- package/dist/actions/defineAction.js +6 -0
- package/dist/actions/defineAction.js.map +1 -0
- package/dist/actions/dispatch.js +49 -0
- package/dist/actions/dispatch.js.map +1 -0
- package/dist/actions/emailRecipients.d.ts +12 -0
- package/dist/actions/emailRecipients.js +116 -0
- package/dist/actions/emailRecipients.js.map +1 -0
- package/dist/actions/fromAddresses.d.ts +21 -0
- package/dist/actions/fromAddresses.js +74 -0
- package/dist/actions/fromAddresses.js.map +1 -0
- package/dist/actions/registry.d.ts +17 -0
- package/dist/actions/registry.js +12 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/actions/runActions.d.ts +9 -0
- package/dist/actions/runActions.js +43 -0
- package/dist/actions/runActions.js.map +1 -0
- package/dist/actions/sign.d.ts +7 -0
- package/dist/actions/sign.js +9 -0
- package/dist/actions/sign.js.map +1 -0
- package/dist/actions/task.js +87 -0
- package/dist/actions/task.js.map +1 -0
- package/dist/aggregation/aggregateResponses.d.ts +40 -0
- package/dist/aggregation/aggregateResponses.js +80 -0
- package/dist/aggregation/aggregateResponses.js.map +1 -0
- package/dist/aggregation/aggregateRows.d.ts +10 -0
- package/dist/aggregation/aggregateRows.js +64 -0
- package/dist/aggregation/aggregateRows.js.map +1 -0
- package/dist/aggregation/resolveResultsRequest.d.ts +61 -0
- package/dist/aggregation/resolveResultsRequest.js +113 -0
- package/dist/aggregation/resolveResultsRequest.js.map +1 -0
- package/dist/aggregation/types.d.ts +39 -0
- package/dist/calc/computeCalcFields.d.ts +15 -0
- package/dist/calc/computeCalcFields.js +28 -0
- package/dist/calc/computeCalcFields.js.map +1 -0
- package/dist/calc/evaluate.d.ts +8 -0
- package/dist/calc/evaluate.js +58 -0
- package/dist/calc/evaluate.js.map +1 -0
- package/dist/calc/normalizeCalc.d.ts +8 -0
- package/dist/calc/normalizeCalc.js +87 -0
- package/dist/calc/normalizeCalc.js.map +1 -0
- package/dist/calc/types.d.ts +34 -0
- package/dist/calc/types.js +22 -0
- package/dist/calc/types.js.map +1 -0
- package/dist/client/ByteSizeField.d.ts +29 -0
- package/dist/client/ByteSizeField.js +58 -0
- package/dist/client/ByteSizeField.js.map +1 -0
- package/dist/client/ClosePollButton.d.ts +15 -0
- package/dist/client/ClosePollButton.js +80 -0
- package/dist/client/ClosePollButton.js.map +1 -0
- package/dist/client/CondensedArray.d.ts +15 -0
- package/dist/client/CondensedArray.js +97 -0
- package/dist/client/CondensedArray.js.map +1 -0
- package/dist/client/ConditionBuilder.js +122 -0
- package/dist/client/ConditionBuilder.js.map +1 -0
- package/dist/client/ConditionRow.js +150 -0
- package/dist/client/ConditionRow.js.map +1 -0
- package/dist/client/ConsentBlockLabel.d.ts +15 -0
- package/dist/client/ConsentBlockLabel.js +71 -0
- package/dist/client/ConsentBlockLabel.js.map +1 -0
- package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
- package/dist/client/ConsentSourceRowLabel.js +21 -0
- package/dist/client/ConsentSourceRowLabel.js.map +1 -0
- package/dist/client/EndpointOptionsSelect.d.ts +46 -0
- package/dist/client/EndpointOptionsSelect.js +106 -0
- package/dist/client/EndpointOptionsSelect.js.map +1 -0
- package/dist/client/FieldBlockLabel.d.ts +18 -0
- package/dist/client/FieldBlockLabel.js +34 -0
- package/dist/client/FieldBlockLabel.js.map +1 -0
- package/dist/client/FieldNameSelect.d.ts +37 -0
- package/dist/client/FieldNameSelect.js +72 -0
- package/dist/client/FieldNameSelect.js.map +1 -0
- package/dist/client/FlowBuilder.d.ts +15 -0
- package/dist/client/FlowBuilder.js +457 -0
- package/dist/client/FlowBuilder.js.map +1 -0
- package/dist/client/FormConditionField.d.ts +21 -0
- package/dist/client/FormConditionField.js +30 -0
- package/dist/client/FormConditionField.js.map +1 -0
- package/dist/client/RecipientsSelect.d.ts +31 -0
- package/dist/client/RecipientsSelect.js +174 -0
- package/dist/client/RecipientsSelect.js.map +1 -0
- package/dist/client/RuleDescription.d.ts +21 -0
- package/dist/client/RuleDescription.js +19 -0
- package/dist/client/RuleDescription.js.map +1 -0
- package/dist/client/admin.css +275 -0
- package/dist/client/endpointOptions.js +29 -0
- package/dist/client/endpointOptions.js.map +1 -0
- package/dist/client/flowAuthoring.js +142 -0
- package/dist/client/flowAuthoring.js.map +1 -0
- package/dist/client/synthesizeClientField.js +57 -0
- package/dist/client/synthesizeClientField.js.map +1 -0
- package/dist/client/toStaticLabel.js +13 -0
- package/dist/client/toStaticLabel.js.map +1 -0
- package/dist/collections/buttonFields.d.ts +34 -0
- package/dist/collections/buttonFields.js +35 -0
- package/dist/collections/buttonFields.js.map +1 -0
- package/dist/collections/cells/FieldCountCell.d.ts +15 -0
- package/dist/collections/cells/FieldCountCell.js +18 -0
- package/dist/collections/cells/FieldCountCell.js.map +1 -0
- package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
- package/dist/collections/cells/FlowStepsCell.js +17 -0
- package/dist/collections/cells/FlowStepsCell.js.map +1 -0
- package/dist/collections/formSubmissions.js +204 -0
- package/dist/collections/formSubmissions.js.map +1 -0
- package/dist/collections/forms.js +482 -0
- package/dist/collections/forms.js.map +1 -0
- package/dist/collections/formsEndpoints.js +101 -0
- package/dist/collections/formsEndpoints.js.map +1 -0
- package/dist/collections/redirectFields.d.ts +29 -0
- package/dist/conditions/conditionType.js +21 -0
- package/dist/conditions/conditionType.js.map +1 -0
- package/dist/conditions/evaluate.d.ts +17 -0
- package/dist/conditions/evaluate.js +94 -0
- package/dist/conditions/evaluate.js.map +1 -0
- package/dist/conditions/fieldTypes.d.ts +11 -0
- package/dist/{fieldTypes-CzhhJXjg.js → conditions/fieldTypes.js} +6 -3
- package/dist/conditions/fieldTypes.js.map +1 -0
- package/dist/conditions/normalizeConditions.js +61 -0
- package/dist/conditions/normalizeConditions.js.map +1 -0
- package/dist/conditions/types.d.ts +8 -0
- package/dist/consent/applyConsentStatements.d.ts +14 -0
- package/dist/consent/applyConsentStatements.js +17 -0
- package/dist/consent/applyConsentStatements.js.map +1 -0
- package/dist/consent/captureConsent.d.ts +55 -0
- package/dist/consent/captureConsent.js +73 -0
- package/dist/consent/captureConsent.js.map +1 -0
- package/dist/consent/consentSourcesField.d.ts +66 -0
- package/dist/consent/consentSourcesField.js +90 -0
- package/dist/consent/consentSourcesField.js.map +1 -0
- package/dist/consent/resolveConsentEntries.d.ts +24 -0
- package/dist/consent/resolveConsentEntries.js +40 -0
- package/dist/consent/resolveConsentEntries.js.map +1 -0
- package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
- package/dist/consent/resolveConsentSourcesRequest.js +54 -0
- package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
- package/dist/consent/resolveConsentStatements.d.ts +45 -0
- package/dist/consent/resolveConsentStatements.js +44 -0
- package/dist/consent/resolveConsentStatements.js.map +1 -0
- package/dist/consent/resolvePublishedVersionRef.d.ts +23 -0
- package/dist/consent/resolvePublishedVersionRef.js +30 -0
- package/dist/consent/resolvePublishedVersionRef.js.map +1 -0
- package/dist/consent/types.d.ts +61 -0
- package/dist/email/departments.d.ts +59 -0
- package/dist/email/departments.js +87 -0
- package/dist/email/departments.js.map +1 -0
- package/dist/email/departmentsField.d.ts +53 -0
- package/dist/email/departmentsField.js +73 -0
- package/dist/email/departmentsField.js.map +1 -0
- package/dist/events/noopSink.js +6 -0
- package/dist/events/noopSink.js.map +1 -0
- package/dist/events/resolveEventSink.js +8 -0
- package/dist/events/resolveEventSink.js.map +1 -0
- package/dist/events/types.d.ts +31 -0
- package/dist/exports/client.d.ts +15 -21
- package/dist/exports/client.js +15 -319
- package/dist/exports/i18n.d.ts +6 -138
- package/dist/exports/i18n.js +6 -3
- package/dist/exports/react.d.ts +63 -550
- package/dist/exports/react.js +55 -1563
- package/dist/exports/rsc.d.ts +9 -16
- package/dist/exports/rsc.js +9 -55
- package/dist/exports/types.d.ts +36 -5
- package/dist/fields/buildFieldBlocks.js +80 -0
- package/dist/fields/buildFieldBlocks.js.map +1 -0
- package/dist/fields/builtin/calculation.js +144 -0
- package/dist/fields/builtin/calculation.js.map +1 -0
- package/dist/fields/builtin/checkbox.js +21 -0
- package/dist/fields/builtin/checkbox.js.map +1 -0
- package/dist/fields/builtin/consent.js +47 -0
- package/dist/fields/builtin/consent.js.map +1 -0
- package/dist/fields/builtin/country.d.ts +13 -0
- package/dist/fields/builtin/country.js +30 -0
- package/dist/fields/builtin/country.js.map +1 -0
- package/dist/fields/builtin/date.js +31 -0
- package/dist/fields/builtin/date.js.map +1 -0
- package/dist/fields/builtin/email.js +18 -0
- package/dist/fields/builtin/email.js.map +1 -0
- package/dist/fields/builtin/file.d.ts +15 -0
- package/dist/fields/builtin/file.js +127 -0
- package/dist/fields/builtin/file.js.map +1 -0
- package/dist/fields/builtin/index.d.ts +26 -0
- package/dist/fields/builtin/index.js +49 -0
- package/dist/fields/builtin/index.js.map +1 -0
- package/dist/fields/builtin/message.js +30 -0
- package/dist/fields/builtin/message.js.map +1 -0
- package/dist/fields/builtin/number.js +17 -0
- package/dist/fields/builtin/number.js.map +1 -0
- package/dist/fields/builtin/repeater.js +49 -0
- package/dist/fields/builtin/repeater.js.map +1 -0
- package/dist/fields/builtin/select.js +49 -0
- package/dist/fields/builtin/select.js.map +1 -0
- package/dist/fields/builtin/state.d.ts +13 -0
- package/dist/fields/builtin/state.js +30 -0
- package/dist/fields/builtin/state.js.map +1 -0
- package/dist/fields/builtin/text.js +13 -0
- package/dist/fields/builtin/text.js.map +1 -0
- package/dist/fields/builtin/textarea.js +13 -0
- package/dist/fields/builtin/textarea.js.map +1 -0
- package/dist/fields/data/regions.d.ts +21 -0
- package/dist/fields/data/regions.js +1238 -0
- package/dist/fields/data/regions.js.map +1 -0
- package/dist/fields/defineFormField.d.ts +13 -0
- package/dist/fields/defineFormField.js +12 -0
- package/dist/fields/defineFormField.js.map +1 -0
- package/dist/fields/fieldKey.d.ts +15 -0
- package/dist/fields/fieldKey.js +16 -0
- package/dist/fields/fieldKey.js.map +1 -0
- package/dist/fields/fieldNamesOfType.js +30 -0
- package/dist/fields/fieldNamesOfType.js.map +1 -0
- package/dist/fields/instanceOptions.js +20 -0
- package/dist/fields/instanceOptions.js.map +1 -0
- package/dist/fields/localizedIf.d.ts +13 -0
- package/dist/fields/localizedIf.js +12 -0
- package/dist/fields/localizedIf.js.map +1 -0
- package/dist/fields/registry.d.ts +12 -0
- package/dist/fields/registry.js +39 -0
- package/dist/fields/registry.js.map +1 -0
- package/dist/fields/sharedConfig.js +151 -0
- package/dist/fields/sharedConfig.js.map +1 -0
- package/dist/fields/types.d.ts +152 -0
- package/dist/flow/engine.d.ts +19 -0
- package/dist/flow/engine.js +29 -0
- package/dist/flow/engine.js.map +1 -0
- package/dist/flow/normalizeFlow.js +54 -0
- package/dist/flow/normalizeFlow.js.map +1 -0
- package/dist/flow/stepLabel.js +15 -0
- package/dist/flow/stepLabel.js.map +1 -0
- package/dist/flow/types.d.ts +32 -0
- package/dist/flow/types.js +11 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/form/pollState.d.ts +22 -0
- package/dist/form/pollState.js +17 -0
- package/dist/form/pollState.js.map +1 -0
- package/dist/form/toFormDocument.d.ts +102 -0
- package/dist/form/toFormDocument.js +87 -0
- package/dist/form/toFormDocument.js.map +1 -0
- package/dist/form/types.d.ts +65 -0
- package/dist/index.d.ts +88 -4
- package/dist/index.js +111 -1898
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +229 -0
- package/dist/plugin/access.js +12 -0
- package/dist/plugin/access.js.map +1 -0
- package/dist/plugin/applyRegistryConfig.d.ts +11 -0
- package/dist/plugin/applyRegistryConfig.js +20 -0
- package/dist/plugin/applyRegistryConfig.js.map +1 -0
- package/dist/plugin/collectionOverrides.d.ts +22 -0
- package/dist/plugin/customState.js +26 -0
- package/dist/plugin/customState.js.map +1 -0
- package/dist/plugin/registerCollections.js +60 -0
- package/dist/plugin/registerCollections.js.map +1 -0
- package/dist/plugin/registerTranslations.js +19 -0
- package/dist/plugin/registerTranslations.js.map +1 -0
- package/dist/plugin/uploadsCollection.d.ts +16 -0
- package/dist/plugin/uploadsCollection.js +53 -0
- package/dist/plugin/uploadsCollection.js.map +1 -0
- package/dist/poll/applyPollOptions.js +18 -0
- package/dist/poll/applyPollOptions.js.map +1 -0
- package/dist/poll/buildPollOptionSourceFields.js +50 -0
- package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
- package/dist/poll/closeJob.d.ts +52 -0
- package/dist/poll/closeJob.js +119 -0
- package/dist/poll/closeJob.js.map +1 -0
- package/dist/poll/definePollOptionSource.d.ts +44 -0
- package/dist/poll/definePollOptionSource.js +6 -0
- package/dist/poll/definePollOptionSource.js.map +1 -0
- package/dist/poll/definePollType.d.ts +34 -0
- package/dist/poll/definePollType.js +6 -0
- package/dist/poll/definePollType.js.map +1 -0
- package/dist/poll/effectivePollOptions.d.ts +38 -0
- package/dist/poll/effectivePollOptions.js +64 -0
- package/dist/poll/effectivePollOptions.js.map +1 -0
- package/dist/poll/mostVoted.d.ts +21 -0
- package/dist/poll/mostVoted.js +32 -0
- package/dist/poll/mostVoted.js.map +1 -0
- package/dist/poll/outcomeBeforeChange.js +91 -0
- package/dist/poll/outcomeBeforeChange.js.map +1 -0
- package/dist/poll/outcomeFields.d.ts +38 -0
- package/dist/poll/outcomeFields.js +52 -0
- package/dist/poll/outcomeFields.js.map +1 -0
- package/dist/poll/pollTypeRegistry.d.ts +34 -0
- package/dist/poll/pollTypeRegistry.js +69 -0
- package/dist/poll/pollTypeRegistry.js.map +1 -0
- package/dist/poll/registry.d.ts +17 -0
- package/dist/poll/registry.js +12 -0
- package/dist/poll/registry.js.map +1 -0
- package/dist/poll/resolvePollCloseRequest.js +105 -0
- package/dist/poll/resolvePollCloseRequest.js.map +1 -0
- package/dist/poll/resolvePollOptions.d.ts +29 -0
- package/dist/poll/resolvePollOptions.js +52 -0
- package/dist/poll/resolvePollOptions.js.map +1 -0
- package/dist/poll/resolvePollOptionsRequest.js +50 -0
- package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
- package/dist/poll/resolvePollOutcome.d.ts +34 -0
- package/dist/poll/resolvePollOutcome.js +76 -0
- package/dist/poll/resolvePollOutcome.js.map +1 -0
- package/dist/poll/resultsField.js +21 -0
- package/dist/poll/resultsField.js.map +1 -0
- package/dist/prefill/valuesFromSearchParams.d.ts +18 -0
- package/dist/prefill/valuesFromSearchParams.js +41 -0
- package/dist/prefill/valuesFromSearchParams.js.map +1 -0
- package/dist/presentations/defaults.d.ts +33 -0
- package/dist/presentations/defaults.js +35 -0
- package/dist/presentations/defaults.js.map +1 -0
- package/dist/presentations/types.d.ts +19 -0
- package/dist/react/Form.d.ts +128 -0
- package/dist/react/Form.js +619 -0
- package/dist/react/Form.js.map +1 -0
- package/dist/react/FormContext.d.ts +59 -0
- package/dist/react/FormContext.js +14 -0
- package/dist/react/FormContext.js.map +1 -0
- package/dist/react/FormControls.d.ts +55 -0
- package/dist/react/FormControls.js +56 -0
- package/dist/react/FormControls.js.map +1 -0
- package/dist/react/FormFields.d.ts +18 -0
- package/dist/react/FormFields.js +114 -0
- package/dist/react/FormFields.js.map +1 -0
- package/dist/react/FormLayout.d.ts +22 -0
- package/dist/react/FormLayout.js +15 -0
- package/dist/react/FormLayout.js.map +1 -0
- package/dist/react/FormResults.d.ts +28 -0
- package/dist/react/FormResults.js +93 -0
- package/dist/react/FormResults.js.map +1 -0
- package/dist/react/FormSteps.d.ts +17 -0
- package/dist/react/FormSteps.js +35 -0
- package/dist/react/FormSteps.js.map +1 -0
- package/dist/react/Honeypot.d.ts +22 -0
- package/dist/react/Honeypot.js +38 -0
- package/dist/react/Honeypot.js.map +1 -0
- package/dist/react/Poll.d.ts +43 -0
- package/dist/react/Poll.js +135 -0
- package/dist/react/Poll.js.map +1 -0
- package/dist/react/captcha/HcaptchaCaptcha.d.ts +28 -0
- package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
- package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
- package/dist/react/captcha/RecaptchaCaptcha.d.ts +41 -0
- package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
- package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
- package/dist/react/captcha/TurnstileCaptcha.d.ts +28 -0
- package/dist/react/captcha/TurnstileCaptcha.js +53 -0
- package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
- package/dist/react/captcha/types.d.ts +8 -0
- package/dist/react/captcha/useCaptchaScript.js +45 -0
- package/dist/react/captcha/useCaptchaScript.js.map +1 -0
- package/dist/react/captcha/vendors.js +8 -0
- package/dist/react/captcha/vendors.js.map +1 -0
- package/dist/react/cn.d.ts +6 -0
- package/dist/react/cn.js +8 -0
- package/dist/react/cn.js.map +1 -0
- package/dist/react/contract.d.ts +31 -0
- package/dist/react/contract.js +7 -0
- package/dist/react/contract.js.map +1 -0
- package/dist/react/events.js +14 -0
- package/dist/react/events.js.map +1 -0
- package/dist/react/fetchResults.d.ts +25 -0
- package/dist/react/fetchResults.js +31 -0
- package/dist/react/fetchResults.js.map +1 -0
- package/dist/react/presentation/Backdrop.d.ts +18 -0
- package/dist/react/presentation/Backdrop.js +14 -0
- package/dist/react/presentation/Backdrop.js.map +1 -0
- package/dist/react/presentation/DialogSurface.d.ts +35 -0
- package/dist/react/presentation/DialogSurface.js +53 -0
- package/dist/react/presentation/DialogSurface.js.map +1 -0
- package/dist/react/presentation/presentations.d.ts +7 -0
- package/dist/react/presentation/presentations.js +32 -0
- package/dist/react/presentation/presentations.js.map +1 -0
- package/dist/react/presentation/registry.d.ts +11 -0
- package/dist/react/presentation/registry.js +12 -0
- package/dist/react/presentation/registry.js.map +1 -0
- package/dist/react/presentation/types.d.ts +19 -0
- package/dist/react/presentation/useDismiss.d.ts +19 -0
- package/dist/react/presentation/useDismiss.js +33 -0
- package/dist/react/presentation/useDismiss.js.map +1 -0
- package/dist/react/presentation/useFocusTrap.d.ts +8 -0
- package/dist/react/presentation/useFocusTrap.js +35 -0
- package/dist/react/presentation/useFocusTrap.js.map +1 -0
- package/dist/react/presentation/useScrollLock.d.ts +6 -0
- package/dist/react/presentation/useScrollLock.js +18 -0
- package/dist/react/presentation/useScrollLock.js.map +1 -0
- package/dist/react/primitives/Checkbox.d.ts +28 -0
- package/dist/react/primitives/Checkbox.js +21 -0
- package/dist/react/primitives/Checkbox.js.map +1 -0
- package/dist/react/primitives/FieldShell.d.ts +29 -0
- package/dist/react/primitives/FieldShell.js +44 -0
- package/dist/react/primitives/FieldShell.js.map +1 -0
- package/dist/react/primitives/Input.d.ts +30 -0
- package/dist/react/primitives/Input.js +21 -0
- package/dist/react/primitives/Input.js.map +1 -0
- package/dist/react/primitives/Select.d.ts +34 -0
- package/dist/react/primitives/Select.js +26 -0
- package/dist/react/primitives/Select.js.map +1 -0
- package/dist/react/primitives/Textarea.d.ts +28 -0
- package/dist/react/primitives/Textarea.js +20 -0
- package/dist/react/primitives/Textarea.js.map +1 -0
- package/dist/react/recall.js +20 -0
- package/dist/react/recall.js.map +1 -0
- package/dist/react/registry.d.ts +16 -0
- package/dist/react/registry.js +16 -0
- package/dist/react/registry.js.map +1 -0
- package/dist/react/renderers/calculation.js +27 -0
- package/dist/react/renderers/calculation.js.map +1 -0
- package/dist/react/renderers/checkbox.js +32 -0
- package/dist/react/renderers/checkbox.js.map +1 -0
- package/dist/react/renderers/consent.js +97 -0
- package/dist/react/renderers/consent.js.map +1 -0
- package/dist/react/renderers/date.js +33 -0
- package/dist/react/renderers/date.js.map +1 -0
- package/dist/react/renderers/email.js +34 -0
- package/dist/react/renderers/email.js.map +1 -0
- package/dist/react/renderers/file.js +107 -0
- package/dist/react/renderers/file.js.map +1 -0
- package/dist/react/renderers/index.d.ts +8 -0
- package/dist/react/renderers/index.js +35 -0
- package/dist/react/renderers/index.js.map +1 -0
- package/dist/react/renderers/message.js +41 -0
- package/dist/react/renderers/message.js.map +1 -0
- package/dist/react/renderers/number.js +37 -0
- package/dist/react/renderers/number.js.map +1 -0
- package/dist/react/renderers/region.js +43 -0
- package/dist/react/renderers/region.js.map +1 -0
- package/dist/react/renderers/repeater.js +131 -0
- package/dist/react/renderers/repeater.js.map +1 -0
- package/dist/react/renderers/select.js +35 -0
- package/dist/react/renderers/select.js.map +1 -0
- package/dist/react/renderers/text.js +34 -0
- package/dist/react/renderers/text.js.map +1 -0
- package/dist/react/renderers/textarea.js +33 -0
- package/dist/react/renderers/textarea.js.map +1 -0
- package/dist/react/resolveForm.js +16 -0
- package/dist/react/resolveForm.js.map +1 -0
- package/dist/react/state.d.ts +52 -0
- package/dist/react/state.js +125 -0
- package/dist/react/state.js.map +1 -0
- package/dist/react/submitForm.d.ts +31 -0
- package/dist/react/submitForm.js +58 -0
- package/dist/react/submitForm.js.map +1 -0
- package/dist/react/uploadFile.d.ts +23 -0
- package/dist/react/uploadFile.js +39 -0
- package/dist/react/uploadFile.js.map +1 -0
- package/dist/react/useField.d.ts +13 -0
- package/dist/react/useField.js +49 -0
- package/dist/react/useField.js.map +1 -0
- package/dist/react/useFormState.d.ts +8 -0
- package/dist/react/useFormState.js +9 -0
- package/dist/react/useFormState.js.map +1 -0
- package/dist/react/useFormStep.d.ts +8 -0
- package/dist/react/useFormStep.js +9 -0
- package/dist/react/useFormStep.js.map +1 -0
- package/dist/react/validateField.js +27 -0
- package/dist/react/validateField.js.map +1 -0
- package/dist/recall/interpolate.d.ts +11 -0
- package/dist/recall/interpolate.js +17 -0
- package/dist/recall/interpolate.js.map +1 -0
- package/dist/recall/resolver.d.ts +22 -0
- package/dist/recall/resolver.js +48 -0
- package/dist/recall/resolver.js.map +1 -0
- package/dist/spam/captcha.d.ts +13 -0
- package/dist/spam/captcha.js +12 -0
- package/dist/spam/captcha.js.map +1 -0
- package/dist/spam/clientIp.js +9 -0
- package/dist/spam/clientIp.js.map +1 -0
- package/dist/spam/constants.d.ts +12 -0
- package/dist/spam/constants.js +21 -0
- package/dist/spam/constants.js.map +1 -0
- package/dist/spam/identify.d.ts +12 -0
- package/dist/spam/identify.js +17 -0
- package/dist/spam/identify.js.map +1 -0
- package/dist/spam/providers/hcaptcha.d.ts +17 -0
- package/dist/spam/providers/hcaptcha.js +18 -0
- package/dist/spam/providers/hcaptcha.js.map +1 -0
- package/dist/spam/providers/recaptcha.d.ts +23 -0
- package/dist/spam/providers/recaptcha.js +23 -0
- package/dist/spam/providers/recaptcha.js.map +1 -0
- package/dist/spam/providers/siteverify.js +34 -0
- package/dist/spam/providers/siteverify.js.map +1 -0
- package/dist/spam/providers/turnstile.d.ts +17 -0
- package/dist/spam/providers/turnstile.js +18 -0
- package/dist/spam/providers/turnstile.js.map +1 -0
- package/dist/spam/rateLimiter.d.ts +18 -0
- package/dist/spam/rateLimiter.js +41 -0
- package/dist/spam/rateLimiter.js.map +1 -0
- package/dist/spam/reserved.js +30 -0
- package/dist/spam/reserved.js.map +1 -0
- package/dist/spam/resolveSpam.d.ts +12 -0
- package/dist/spam/resolveSpam.js +43 -0
- package/dist/spam/resolveSpam.js.map +1 -0
- package/dist/spam/spamGuard.js +81 -0
- package/dist/spam/spamGuard.js.map +1 -0
- package/dist/spam/types.d.ts +88 -0
- package/dist/spam/uploadHooks.js +33 -0
- package/dist/spam/uploadHooks.js.map +1 -0
- package/dist/submissions/SubmissionAnswers.d.ts +14 -0
- package/dist/submissions/SubmissionAnswers.js +137 -0
- package/dist/submissions/SubmissionAnswers.js.map +1 -0
- package/dist/submissions/SubmissionAnswersClient.js +178 -0
- package/dist/submissions/SubmissionAnswersClient.js.map +1 -0
- package/dist/submissions/coerceBoolean.js +14 -0
- package/dist/submissions/coerceBoolean.js.map +1 -0
- package/dist/submissions/createSubmission.d.ts +36 -0
- package/dist/submissions/createSubmission.js +26 -0
- package/dist/submissions/createSubmission.js.map +1 -0
- package/dist/submissions/runSubmission.d.ts +10 -0
- package/dist/submissions/runSubmission.js +306 -0
- package/dist/submissions/runSubmission.js.map +1 -0
- package/dist/submissions/types.d.ts +41 -0
- package/dist/submissions/validateSubmission.js +110 -0
- package/dist/submissions/validateSubmission.js.map +1 -0
- package/dist/submissions/votedCookie.d.ts +13 -0
- package/dist/submissions/votedCookie.js +27 -0
- package/dist/submissions/votedCookie.js.map +1 -0
- package/dist/translations/clientRuntimeKeys.d.ts +17 -0
- package/dist/translations/clientRuntimeKeys.js +46 -0
- package/dist/translations/clientRuntimeKeys.js.map +1 -0
- package/dist/translations/de.d.ts +12 -0
- package/dist/translations/de.js +309 -0
- package/dist/translations/de.js.map +1 -0
- package/dist/translations/en.d.ts +12 -0
- package/dist/translations/en.js +309 -0
- package/dist/translations/en.js.map +1 -0
- package/dist/translations/index.d.ts +23 -0
- package/dist/translations/index.js +37 -0
- package/dist/translations/index.js.map +1 -0
- package/dist/translations/keys.d.ts +308 -0
- package/dist/translations/keys.js +308 -0
- package/dist/translations/keys.js.map +1 -0
- package/dist/translations/makeTranslate.d.ts +15 -0
- package/dist/translations/makeTranslate.js +20 -0
- package/dist/translations/makeTranslate.js.map +1 -0
- package/dist/translations/server.js +32 -0
- package/dist/translations/server.js.map +1 -0
- package/dist/translations/useTranslation.js +12 -0
- package/dist/translations/useTranslation.js.map +1 -0
- package/dist/uploads/captureFileRef.d.ts +34 -0
- package/dist/uploads/captureFileRef.js +43 -0
- package/dist/uploads/captureFileRef.js.map +1 -0
- package/dist/uploads/formatBytes.d.ts +9 -0
- package/dist/uploads/formatBytes.js +25 -0
- package/dist/uploads/formatBytes.js.map +1 -0
- package/dist/uploads/resolveFileRef.d.ts +26 -0
- package/dist/uploads/resolveFileRef.js +45 -0
- package/dist/uploads/resolveFileRef.js.map +1 -0
- package/dist/uploads/types.d.ts +19 -0
- package/dist/validation/buildRuleBlocks.js +47 -0
- package/dist/validation/buildRuleBlocks.js.map +1 -0
- package/dist/validation/builtin/email.js +20 -0
- package/dist/validation/builtin/email.js.map +1 -0
- package/dist/validation/builtin/index.d.ts +14 -0
- package/dist/validation/builtin/index.js +38 -0
- package/dist/validation/builtin/index.js.map +1 -0
- package/dist/validation/builtin/matchesField.js +16 -0
- package/dist/validation/builtin/matchesField.js.map +1 -0
- package/dist/validation/builtin/max.js +22 -0
- package/dist/validation/builtin/max.js.map +1 -0
- package/dist/validation/builtin/maxDate.js +24 -0
- package/dist/validation/builtin/maxDate.js.map +1 -0
- package/dist/validation/builtin/maxLength.js +27 -0
- package/dist/validation/builtin/maxLength.js.map +1 -0
- package/dist/validation/builtin/min.js +22 -0
- package/dist/validation/builtin/min.js.map +1 -0
- package/dist/validation/builtin/minDate.js +24 -0
- package/dist/validation/builtin/minDate.js.map +1 -0
- package/dist/validation/builtin/minLength.js +27 -0
- package/dist/validation/builtin/minLength.js.map +1 -0
- package/dist/validation/builtin/notAlreadySubmitted.js +34 -0
- package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -0
- package/dist/validation/builtin/oneOf.js +35 -0
- package/dist/validation/builtin/oneOf.js.map +1 -0
- package/dist/validation/builtin/pattern.js +50 -0
- package/dist/validation/builtin/pattern.js.map +1 -0
- package/dist/validation/builtin/url.js +23 -0
- package/dist/validation/builtin/url.js.map +1 -0
- package/dist/validation/builtin/validateDateBound.js +18 -0
- package/dist/validation/builtin/validateDateBound.js.map +1 -0
- package/dist/validation/builtin/validateRegexParams.js +44 -0
- package/dist/validation/builtin/validateRegexParams.js.map +1 -0
- package/dist/validation/defineValidationRule.d.ts +12 -0
- package/dist/validation/defineValidationRule.js +11 -0
- package/dist/validation/defineValidationRule.js.map +1 -0
- package/dist/validation/emailPattern.js +10 -0
- package/dist/validation/emailPattern.js.map +1 -0
- package/dist/validation/fieldTargetParam.d.ts +22 -0
- package/dist/validation/fieldTargetParam.js +38 -0
- package/dist/validation/fieldTargetParam.js.map +1 -0
- package/dist/validation/message.js +14 -0
- package/dist/validation/message.js.map +1 -0
- package/dist/validation/registry.d.ts +11 -0
- package/dist/validation/registry.js +13 -0
- package/dist/validation/registry.js.map +1 -0
- package/dist/validation/runValidation.js +90 -0
- package/dist/validation/runValidation.js.map +1 -0
- package/dist/validation/types.d.ts +70 -0
- package/dist/validation/validateUrl.js +22 -0
- package/dist/validation/validateUrl.js.map +1 -0
- package/package.json +12 -7
- package/styles/form-builder.css +21 -11
- package/dist/constants-B-BUfetP.d.ts +0 -288
- package/dist/exports/client.js.map +0 -1
- package/dist/exports/react.js.map +0 -1
- package/dist/exports/rsc.js.map +0 -1
- package/dist/fieldTypes-B8jkNRob.d.ts +0 -188
- package/dist/fieldTypes-CzhhJXjg.js.map +0 -1
- package/dist/index-DfFYGbVF.d.ts +0 -481
- package/dist/keys-N5xGiUsh.js +0 -132
- package/dist/keys-N5xGiUsh.js.map +0 -1
- package/dist/registry-CoCyhtvB.js +0 -282
- package/dist/registry-CoCyhtvB.js.map +0 -1
- package/dist/resolver-OeQyVH2N.js +0 -665
- package/dist/resolver-OeQyVH2N.js.map +0 -1
- package/dist/translations-edMqq_2e.js +0 -152
- package/dist/translations-edMqq_2e.js.map +0 -1
- 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":"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"}
|
|
@@ -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":";;;;;;;;;AAsCA,MAAM,gBACL,aACoC,MAAM,QAAQ,QAAQ,IAAI,SAAS,KAAK;AAE7E,MAAa,gBAAgB,EAAE,WAAW,UAAU,UAAU,eAAkC;CAC/F,MAAM,EAAE,GAAG,SAASA,iBAAe;CACnC,MAAM,UAAU,SAAS,MAAM,UAAU,MAAM,SAAS,UAAU,KAAK;CACvE,MAAM,gBAAgB,SAAS,iBAAiB;CAChD,MAAM,YAAY,mBAAmB;CAErC,MAAM,eAAoC,SAAS,KAAK,WAAW;EAClE,OAAO,MAAM;EACb,OAAO,MAAM;CACd,EAAE;CACF,MAAM,kBAAuC,UAAU,KAAK,cAAc;EACzE,OAAO,KAAK,EAAE,iBAAiB,QAAQ,CAAC;EACxC,OAAO;CACR,EAAE;CAEF,MAAM,qBAAqB,aAAsD;EAChF,MAAM,SAAS,aAAa,QAAQ;EACpC,MAAM,OAAO,SAAS,MAAM,UAAU,MAAM,SAAS,QAAQ,KAAK;EAClE,IAAI,CAAC,MACJ;EAED,SAAS;GACR,OAAO,KAAK;GACZ,UAAU,iBAAiB,KAAK,aAAa;GAC7C,OAAO,KAAA;EACR,CAAC;CACF;CAEA,MAAM,wBAAwB,aAAsD;EACnF,MAAM,SAAS,aAAa,QAAQ;EACpC,IAAI,CAAC,QACJ;EAED,MAAM,WAAW,OAAO;EACxB,MAAM,YAAY,mBAAmB,UAAU,QAAQ,MAAM,mBAAmB,QAAQ;EACxF,SAAS;GAAE,GAAG;GAAW;GAAU,OAAO,YAAY,UAAU,QAAQ,KAAA;EAAU,CAAC;CACpF;CAEA,OACC,qBAAC,OAAD;EAAK,WAAU;YAAf;GACC,oBAAC,OAAD;IAAK,WAAU;cACd,oBAAC,aAAD;KACC,SAAS;KACT,OAAO,aAAa,MAAM,WAAW,OAAO,UAAU,UAAU,KAAK;KACrE,aAAa,EAAE,KAAK,oBAAoB;KACxC,aAAa;KACb,UAAU;IACV,CAAA;GACG,CAAA;GACL,oBAAC,OAAD;IAAK,WAAU;cACd,oBAAC,aAAD;KACC,SAAS;KACT,OAAO,gBAAgB,MAAM,WAAW,OAAO,UAAU,UAAU,QAAQ;KAC3E,UAAU,CAAC;KACX,aAAa;KACb,UAAU;IACV,CAAA;GACG,CAAA;GACL,oBAAC,OAAD;IAAK,WAAU;cACd,oBAAC,gBAAD;KACgB;KACN;KACT,UAAU,UAAU;KACpB,OAAO,UAAU;KACjB,WAAW,UAAU,SAAS;MAAE,GAAG;MAAW;KAAM,CAAC;IACrD,CAAA;GACG,CAAA;GACL,oBAAC,OAAD;IAAK,WAAU;cACd,oBAAC,QAAD;KACC,aAAY;KACZ,MAAK;KACL,SAAS;KACT,cAAY,EAAE,KAAK,eAAe;KAClC,QAAQ;IACR,CAAA;GACG,CAAA;EACD;;AAEP;AAUA,MAAM,kBAAkB,EACvB,eACA,SACA,UACA,OACA,eAC0B;CAC1B,MAAM,EAAE,MAAMA,iBAAe;CAC7B,IAAI,kBAAkB,cAAc,mBAAmB,QAAQ,MAAM,WAAW;EAC/E,MAAM,UAA+B,CACpC;GAAE,OAAO,EAAE,KAAK,aAAa;GAAG,OAAO;EAAO,GAC9C;GAAE,OAAO,EAAE,KAAK,cAAc;GAAG,OAAO;EAAQ,CACjD;EACA,MAAM,uBAAuB,aAAsD;GAElF,SADe,aAAa,QACd,GAAG,UAAU,MAAM;EAClC;EACA,OACC,oBAAC,aAAD;GACU;GACT,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC,KAAK,QAAQ;GACnF,aAAa;GACb,UAAU;EACV,CAAA;CAEH;CACA,IAAI,CAAC,SACJ,OAAO;CAER,QAAQ,eAAR;EACC,KAAK,UACJ,OACC,oBAAC,iBAAD;GACC,UAAU;GACV,OAAO,kBAAkB,OAAO;GACtB;GACH;GACP,WAAW,SAAiB,SAAS,IAAI;EACzC,CAAA;EAEH,KAAK,QACJ,OACC,oBAAC,eAAD;GACC,UAAU;GACV,OAAO,gBAAgB,OAAO;GACpB;GACH;GACP,WAAW,SAAwB,SAAS,IAAI;EAChD,CAAA;EAEH,KAAK,UACJ,OACC,oBAAC,iBAAD;GACC,UAAU;GACV,OAAO,kBAAkB,OAAO;GACtB;GACV,SAAS,QAAQ,WAAW,CAAC;GACtB;GACP,WAAW,SAAiB,SAAS,IAAI;EACzC,CAAA;EAEH,SACC,OACC,oBAAC,eAAD;GACC,UAAU;GACV,OAAO,gBAAgB,OAAO;GACpB;GACH;GACP,WAAW,SAAiB,SAAS,IAAI;EACzC,CAAA;CAEJ;AACD"}
|
|
@@ -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
|