@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,39 @@
|
|
|
1
|
+
import { SubmissionDescriptor, SubmissionValue } from "../submissions/types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/aggregation/types.d.ts
|
|
4
|
+
/** Which submission statuses to count. `complete` (default) excludes partials; `all` counts everything. */
|
|
5
|
+
type SubmissionStatusFilter = 'complete' | 'partial' | 'all';
|
|
6
|
+
/** One answer option (or distinct value) with its tally. */
|
|
7
|
+
type AggregationBucket = {
|
|
8
|
+
/** The answer value, stringified (the grouping key). */value: string; /** Display label: current option label, else the submitted snapshot label, else the raw value. */
|
|
9
|
+
label: string;
|
|
10
|
+
count: number; /** Share of respondents, 0-100, rounded to one decimal. Can sum past 100 for multi-value fields. */
|
|
11
|
+
percentage: number;
|
|
12
|
+
};
|
|
13
|
+
/** Aggregated responses for one field across a form's submissions. */
|
|
14
|
+
type FieldAggregation = {
|
|
15
|
+
field: string;
|
|
16
|
+
label?: string;
|
|
17
|
+
fieldType?: string; /** Respondents: submissions with a non-empty answer for this field. The percentage denominator. */
|
|
18
|
+
total: number;
|
|
19
|
+
buckets: AggregationBucket[]; /** True when the `maxSubmissions` cap was hit, so the tallies are a (large) sample, not the full set. */
|
|
20
|
+
truncated: boolean;
|
|
21
|
+
};
|
|
22
|
+
/** The slice of a submission the reducer reads. */
|
|
23
|
+
type AggregationRow = {
|
|
24
|
+
values?: SubmissionValue[];
|
|
25
|
+
descriptors?: SubmissionDescriptor[];
|
|
26
|
+
};
|
|
27
|
+
/** Field metadata the reducer needs to label and order buckets, derived from the live form definition. */
|
|
28
|
+
type FieldMeta = {
|
|
29
|
+
field: string;
|
|
30
|
+
label?: string;
|
|
31
|
+
fieldType?: string; /** Ordered known options with current labels; drives bucket order and label resolution. */
|
|
32
|
+
options?: {
|
|
33
|
+
value: string;
|
|
34
|
+
label: string;
|
|
35
|
+
}[];
|
|
36
|
+
};
|
|
37
|
+
//#endregion
|
|
38
|
+
export { AggregationBucket, AggregationRow, FieldAggregation, FieldMeta, SubmissionStatusFilter };
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FormFieldInstance } from "../submissions/types.js";
|
|
2
|
+
import { CalcExpression } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/calc/computeCalcFields.d.ts
|
|
5
|
+
/** Returns the calc expression if the field carries one (non-null object), otherwise undefined. */
|
|
6
|
+
declare const calcExpressionOf: (field: FormFieldInstance) => CalcExpression | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Returns answers with every calc field's value derived from its expression,
|
|
9
|
+
* folded in declaration order so a calc may reference an earlier calc's result.
|
|
10
|
+
* Identity when no field carries an expression.
|
|
11
|
+
*/
|
|
12
|
+
declare const computeCalcFields: (fields: FormFieldInstance[], answers: Record<string, unknown>) => Record<string, unknown>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { calcExpressionOf, computeCalcFields };
|
|
15
|
+
//# sourceMappingURL=computeCalcFields.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isNamedField } from "../fields/fieldKey.js";
|
|
2
|
+
import { evaluateCalc } from "./evaluate.js";
|
|
3
|
+
//#region src/calc/computeCalcFields.ts
|
|
4
|
+
/** Returns the calc expression if the field carries one (non-null object), otherwise undefined. */
|
|
5
|
+
const calcExpressionOf = (field) => {
|
|
6
|
+
const expr = field.expression;
|
|
7
|
+
return expr !== null && typeof expr === "object" && !Array.isArray(expr) ? expr : void 0;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Returns answers with every calc field's value derived from its expression,
|
|
11
|
+
* folded in declaration order so a calc may reference an earlier calc's result.
|
|
12
|
+
* Identity when no field carries an expression.
|
|
13
|
+
*/
|
|
14
|
+
const computeCalcFields = (fields, answers) => {
|
|
15
|
+
let next = answers;
|
|
16
|
+
for (const field of fields) {
|
|
17
|
+
const expr = calcExpressionOf(field);
|
|
18
|
+
if (expr && isNamedField(field)) next = {
|
|
19
|
+
...next,
|
|
20
|
+
[field.name]: evaluateCalc(expr, next)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return next;
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { calcExpressionOf, computeCalcFields };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=computeCalcFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeCalcFields.js","names":[],"sources":["../../src/calc/computeCalcFields.ts"],"sourcesContent":["import { isNamedField } from '../fields/fieldKey'\nimport type { FormFieldInstance } from '../submissions/types'\nimport { evaluateCalc } from './evaluate'\nimport type { CalcExpression } from './types'\n\n/** Returns the calc expression if the field carries one (non-null object), otherwise undefined. */\nexport const calcExpressionOf = (field: FormFieldInstance): CalcExpression | undefined => {\n\tconst expr = field.expression\n\treturn expr !== null && typeof expr === 'object' && !Array.isArray(expr)\n\t\t? (expr as CalcExpression)\n\t\t: undefined\n}\n\n/**\n * Returns answers with every calc field's value derived from its expression,\n * folded in declaration order so a calc may reference an earlier calc's result.\n * Identity when no field carries an expression.\n */\nexport const computeCalcFields = (\n\tfields: FormFieldInstance[],\n\tanswers: Record<string, unknown>\n): Record<string, unknown> => {\n\tlet next = answers\n\tfor (const field of fields) {\n\t\tconst expr = calcExpressionOf(field)\n\t\tif (expr && isNamedField(field)) {\n\t\t\tnext = { ...next, [field.name]: evaluateCalc(expr, next) }\n\t\t}\n\t}\n\treturn next\n}\n"],"mappings":";;;;AAMA,MAAa,oBAAoB,UAAyD;CACzF,MAAM,OAAO,MAAM;CACnB,OAAO,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,IACnE,OACD,KAAA;AACJ;;;;;;AAOA,MAAa,qBACZ,QACA,YAC6B;CAC7B,IAAI,OAAO;CACX,KAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,OAAO,iBAAiB,KAAK;EACnC,IAAI,QAAQ,aAAa,KAAK,GAC7B,OAAO;GAAE,GAAG;IAAO,MAAM,OAAO,aAAa,MAAM,IAAI;EAAE;CAE3D;CACA,OAAO;AACR"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CalcExpression } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/calc/evaluate.d.ts
|
|
4
|
+
/** Evaluate a calc expression against form answers. Total + safe: no `eval`, always finite, div/mod by zero -> 0, missing ref -> 0, depth-guarded. Isomorphic (client + server). */
|
|
5
|
+
declare const evaluateCalc: (expr: CalcExpression | null | undefined, answers: Record<string, unknown>) => number;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { evaluateCalc };
|
|
8
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//#region src/calc/evaluate.ts
|
|
2
|
+
const toNumber = (value) => {
|
|
3
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : 0;
|
|
4
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
5
|
+
const n = Number(value);
|
|
6
|
+
return Number.isFinite(n) ? n : 0;
|
|
7
|
+
}
|
|
8
|
+
return 0;
|
|
9
|
+
};
|
|
10
|
+
const finite = (n) => Number.isFinite(n) ? n : 0;
|
|
11
|
+
const FUNCTIONS = {
|
|
12
|
+
min: (a) => a.length ? Math.min(...a) : 0,
|
|
13
|
+
max: (a) => a.length ? Math.max(...a) : 0,
|
|
14
|
+
round: (a) => Math.round(a[0] ?? 0),
|
|
15
|
+
abs: (a) => Math.abs(a[0] ?? 0),
|
|
16
|
+
ceil: (a) => Math.ceil(a[0] ?? 0),
|
|
17
|
+
floor: (a) => Math.floor(a[0] ?? 0)
|
|
18
|
+
};
|
|
19
|
+
const evalNode = (expr, answers, depth) => {
|
|
20
|
+
if (depth > 64 || expr == null || typeof expr !== "object") return 0;
|
|
21
|
+
switch (expr.type) {
|
|
22
|
+
case "lit": return finite(toNumber(expr.value));
|
|
23
|
+
case "ref": return toNumber(answers[expr.field]);
|
|
24
|
+
case "neg": return finite(-evalNode(expr.operand, answers, depth + 1));
|
|
25
|
+
case "op": {
|
|
26
|
+
const l = evalNode(expr.left, answers, depth + 1);
|
|
27
|
+
const r = evalNode(expr.right, answers, depth + 1);
|
|
28
|
+
switch (expr.op) {
|
|
29
|
+
case "+": return finite(l + r);
|
|
30
|
+
case "-": return finite(l - r);
|
|
31
|
+
case "*": return finite(l * r);
|
|
32
|
+
case "/": return r === 0 ? 0 : finite(l / r);
|
|
33
|
+
case "%": return r === 0 ? 0 : finite(l % r);
|
|
34
|
+
default: return 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
case "fn": {
|
|
38
|
+
const fn = FUNCTIONS[expr.fn];
|
|
39
|
+
if (!fn) return 0;
|
|
40
|
+
return finite(fn(Array.isArray(expr.args) ? expr.args.map((a) => evalNode(a, answers, depth + 1)) : []));
|
|
41
|
+
}
|
|
42
|
+
case "weight": {
|
|
43
|
+
const weights = expr.weights ?? {};
|
|
44
|
+
const value = answers[expr.field];
|
|
45
|
+
return finite((Array.isArray(value) ? value : value == null || value === "" ? [] : [value]).reduce((sum, v) => sum + toNumber(weights[String(v)]), 0));
|
|
46
|
+
}
|
|
47
|
+
default: return 0;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/** Evaluate a calc expression against form answers. Total + safe: no `eval`, always finite, div/mod by zero -> 0, missing ref -> 0, depth-guarded. Isomorphic (client + server). */
|
|
51
|
+
const evaluateCalc = (expr, answers) => {
|
|
52
|
+
if (!expr) return 0;
|
|
53
|
+
return evalNode(expr, answers, 0);
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { evaluateCalc };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","names":[],"sources":["../../src/calc/evaluate.ts"],"sourcesContent":["import { type CalcExpression, MAX_DEPTH } from './types'\n\nconst toNumber = (value: unknown): number => {\n\tif (typeof value === 'number') {\n\t\treturn Number.isFinite(value) ? value : 0\n\t}\n\tif (typeof value === 'string' && value.trim() !== '') {\n\t\tconst n = Number(value)\n\t\treturn Number.isFinite(n) ? n : 0\n\t}\n\treturn 0\n}\n\nconst finite = (n: number): number => (Number.isFinite(n) ? n : 0)\n\nconst FUNCTIONS: Record<string, (args: number[]) => number> = {\n\tmin: (a) => (a.length ? Math.min(...a) : 0),\n\tmax: (a) => (a.length ? Math.max(...a) : 0),\n\tround: (a) => Math.round(a[0] ?? 0),\n\tabs: (a) => Math.abs(a[0] ?? 0),\n\tceil: (a) => Math.ceil(a[0] ?? 0),\n\tfloor: (a) => Math.floor(a[0] ?? 0),\n}\n\nconst evalNode = (\n\texpr: CalcExpression,\n\tanswers: Record<string, unknown>,\n\tdepth: number\n): number => {\n\tif (depth > MAX_DEPTH || expr == null || typeof expr !== 'object') {\n\t\treturn 0\n\t}\n\tswitch (expr.type) {\n\t\tcase 'lit':\n\t\t\treturn finite(toNumber(expr.value))\n\t\tcase 'ref':\n\t\t\treturn toNumber(answers[expr.field])\n\t\tcase 'neg':\n\t\t\treturn finite(-evalNode(expr.operand, answers, depth + 1))\n\t\tcase 'op': {\n\t\t\tconst l = evalNode(expr.left, answers, depth + 1)\n\t\t\tconst r = evalNode(expr.right, answers, depth + 1)\n\t\t\tswitch (expr.op) {\n\t\t\t\tcase '+':\n\t\t\t\t\treturn finite(l + r)\n\t\t\t\tcase '-':\n\t\t\t\t\treturn finite(l - r)\n\t\t\t\tcase '*':\n\t\t\t\t\treturn finite(l * r)\n\t\t\t\tcase '/':\n\t\t\t\t\treturn r === 0 ? 0 : finite(l / r)\n\t\t\t\tcase '%':\n\t\t\t\t\treturn r === 0 ? 0 : finite(l % r)\n\t\t\t\tdefault:\n\t\t\t\t\treturn 0\n\t\t\t}\n\t\t}\n\t\tcase 'fn': {\n\t\t\tconst fn = FUNCTIONS[expr.fn]\n\t\t\tif (!fn) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst args = Array.isArray(expr.args)\n\t\t\t\t? expr.args.map((a) => evalNode(a, answers, depth + 1))\n\t\t\t\t: []\n\t\t\treturn finite(fn(args))\n\t\t}\n\t\tcase 'weight': {\n\t\t\tconst weights = expr.weights ?? {}\n\t\t\tconst value = answers[expr.field]\n\t\t\tconst chosen = Array.isArray(value) ? value : value == null || value === '' ? [] : [value]\n\t\t\treturn finite(\n\t\t\t\tchosen.reduce((sum: number, v: unknown) => sum + toNumber(weights[String(v)]), 0)\n\t\t\t)\n\t\t}\n\t\tdefault:\n\t\t\treturn 0\n\t}\n}\n\n/** Evaluate a calc expression against form answers. Total + safe: no `eval`, always finite, div/mod by zero -> 0, missing ref -> 0, depth-guarded. Isomorphic (client + server). */\nexport const evaluateCalc = (\n\texpr: CalcExpression | null | undefined,\n\tanswers: Record<string, unknown>\n): number => {\n\tif (!expr) {\n\t\treturn 0\n\t}\n\treturn evalNode(expr, answers, 0)\n}\n"],"mappings":";AAEA,MAAM,YAAY,UAA2B;CAC5C,IAAI,OAAO,UAAU,UACpB,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;CAEzC,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;EACrD,MAAM,IAAI,OAAO,KAAK;EACtB,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;CACjC;CACA,OAAO;AACR;AAEA,MAAM,UAAU,MAAuB,OAAO,SAAS,CAAC,IAAI,IAAI;AAEhE,MAAM,YAAwD;CAC7D,MAAM,MAAO,EAAE,SAAS,KAAK,IAAI,GAAG,CAAC,IAAI;CACzC,MAAM,MAAO,EAAE,SAAS,KAAK,IAAI,GAAG,CAAC,IAAI;CACzC,QAAQ,MAAM,KAAK,MAAM,EAAE,MAAM,CAAC;CAClC,MAAM,MAAM,KAAK,IAAI,EAAE,MAAM,CAAC;CAC9B,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,CAAC;CAChC,QAAQ,MAAM,KAAK,MAAM,EAAE,MAAM,CAAC;AACnC;AAEA,MAAM,YACL,MACA,SACA,UACY;CACZ,IAAI,QAAA,MAAqB,QAAQ,QAAQ,OAAO,SAAS,UACxD,OAAO;CAER,QAAQ,KAAK,MAAb;EACC,KAAK,OACJ,OAAO,OAAO,SAAS,KAAK,KAAK,CAAC;EACnC,KAAK,OACJ,OAAO,SAAS,QAAQ,KAAK,MAAM;EACpC,KAAK,OACJ,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC;EAC1D,KAAK,MAAM;GACV,MAAM,IAAI,SAAS,KAAK,MAAM,SAAS,QAAQ,CAAC;GAChD,MAAM,IAAI,SAAS,KAAK,OAAO,SAAS,QAAQ,CAAC;GACjD,QAAQ,KAAK,IAAb;IACC,KAAK,KACJ,OAAO,OAAO,IAAI,CAAC;IACpB,KAAK,KACJ,OAAO,OAAO,IAAI,CAAC;IACpB,KAAK,KACJ,OAAO,OAAO,IAAI,CAAC;IACpB,KAAK,KACJ,OAAO,MAAM,IAAI,IAAI,OAAO,IAAI,CAAC;IAClC,KAAK,KACJ,OAAO,MAAM,IAAI,IAAI,OAAO,IAAI,CAAC;IAClC,SACC,OAAO;GACT;EACD;EACA,KAAK,MAAM;GACV,MAAM,KAAK,UAAU,KAAK;GAC1B,IAAI,CAAC,IACJ,OAAO;GAKR,OAAO,OAAO,GAHD,MAAM,QAAQ,KAAK,IAAI,IACjC,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,SAAS,QAAQ,CAAC,CAAC,IACpD,CAAC,CACiB,CAAC;EACvB;EACA,KAAK,UAAU;GACd,MAAM,UAAU,KAAK,WAAW,CAAC;GACjC,MAAM,QAAQ,QAAQ,KAAK;GAE3B,OAAO,QADQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,QAAQ,UAAU,KAAK,CAAC,IAAI,CAAC,KAAK,GAEjF,QAAQ,KAAa,MAAe,MAAM,SAAS,QAAQ,OAAO,CAAC,EAAE,GAAG,CAAC,CACjF;EACD;EACA,SACC,OAAO;CACT;AACD;;AAGA,MAAa,gBACZ,MACA,YACY;CACZ,IAAI,CAAC,MACJ,OAAO;CAER,OAAO,SAAS,MAAM,SAAS,CAAC;AACjC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CalcExpression } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/calc/normalizeCalc.d.ts
|
|
4
|
+
/** Structural guard: returns a valid CalcExpression if `value` is structurally sound (depth-guarded at 64), otherwise undefined. Never throws. */
|
|
5
|
+
declare const normalizeCalc: (value: unknown) => CalcExpression | undefined;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { normalizeCalc };
|
|
8
|
+
//# sourceMappingURL=normalizeCalc.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { CALC_FNS, CALC_OPS } from "./types.js";
|
|
2
|
+
//#region src/calc/normalizeCalc.ts
|
|
3
|
+
const isOp = (v) => CALC_OPS.includes(v);
|
|
4
|
+
const isFn = (v) => CALC_FNS.includes(v);
|
|
5
|
+
const isRecord = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
6
|
+
const normalizeNode = (value, depth) => {
|
|
7
|
+
if (depth > 64) return void 0;
|
|
8
|
+
if (!isRecord(value)) return void 0;
|
|
9
|
+
switch (value.type) {
|
|
10
|
+
case "lit": {
|
|
11
|
+
const { value: v } = value;
|
|
12
|
+
if (typeof v !== "number" || !Number.isFinite(v)) return void 0;
|
|
13
|
+
return {
|
|
14
|
+
type: "lit",
|
|
15
|
+
value: v
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
case "ref": {
|
|
19
|
+
const { field } = value;
|
|
20
|
+
if (typeof field !== "string") return void 0;
|
|
21
|
+
return {
|
|
22
|
+
type: "ref",
|
|
23
|
+
field
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
case "op": {
|
|
27
|
+
const { op, left, right } = value;
|
|
28
|
+
if (!isOp(op)) return void 0;
|
|
29
|
+
const l = normalizeNode(left, depth + 1);
|
|
30
|
+
if (!l) return void 0;
|
|
31
|
+
const r = normalizeNode(right, depth + 1);
|
|
32
|
+
if (!r) return void 0;
|
|
33
|
+
return {
|
|
34
|
+
type: "op",
|
|
35
|
+
op,
|
|
36
|
+
left: l,
|
|
37
|
+
right: r
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
case "neg": {
|
|
41
|
+
const operand = normalizeNode(value.operand, depth + 1);
|
|
42
|
+
if (!operand) return void 0;
|
|
43
|
+
return {
|
|
44
|
+
type: "neg",
|
|
45
|
+
operand
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
case "fn": {
|
|
49
|
+
const { fn, args } = value;
|
|
50
|
+
if (!isFn(fn)) return void 0;
|
|
51
|
+
if (!Array.isArray(args)) return void 0;
|
|
52
|
+
const normalizedArgs = [];
|
|
53
|
+
for (const arg of args) {
|
|
54
|
+
const a = normalizeNode(arg, depth + 1);
|
|
55
|
+
if (!a) return void 0;
|
|
56
|
+
normalizedArgs.push(a);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
type: "fn",
|
|
60
|
+
fn,
|
|
61
|
+
args: normalizedArgs
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
case "weight": {
|
|
65
|
+
const { field, weights } = value;
|
|
66
|
+
if (typeof field !== "string") return void 0;
|
|
67
|
+
if (!isRecord(weights)) return void 0;
|
|
68
|
+
const normalizedWeights = {};
|
|
69
|
+
for (const [k, v] of Object.entries(weights)) {
|
|
70
|
+
if (typeof v !== "number" || !Number.isFinite(v)) return void 0;
|
|
71
|
+
normalizedWeights[k] = v;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
type: "weight",
|
|
75
|
+
field,
|
|
76
|
+
weights: normalizedWeights
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
default: return;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/** Structural guard: returns a valid CalcExpression if `value` is structurally sound (depth-guarded at 64), otherwise undefined. Never throws. */
|
|
83
|
+
const normalizeCalc = (value) => normalizeNode(value, 0);
|
|
84
|
+
//#endregion
|
|
85
|
+
export { normalizeCalc };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=normalizeCalc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeCalc.js","names":[],"sources":["../../src/calc/normalizeCalc.ts"],"sourcesContent":["import {\n\tCALC_FNS,\n\tCALC_OPS,\n\ttype CalcExpression,\n\ttype CalcFn,\n\ttype CalcOp,\n\tMAX_DEPTH,\n} from './types'\n\nconst isOp = (v: unknown): v is CalcOp => (CALC_OPS as readonly unknown[]).includes(v)\nconst isFn = (v: unknown): v is CalcFn => (CALC_FNS as readonly unknown[]).includes(v)\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n\tv !== null && typeof v === 'object' && !Array.isArray(v)\n\nconst normalizeNode = (value: unknown, depth: number): CalcExpression | undefined => {\n\tif (depth > MAX_DEPTH) return undefined\n\tif (!isRecord(value)) return undefined\n\n\tswitch (value.type) {\n\t\tcase 'lit': {\n\t\t\tconst { value: v } = value\n\t\t\tif (typeof v !== 'number' || !Number.isFinite(v)) return undefined\n\t\t\treturn { type: 'lit', value: v }\n\t\t}\n\t\tcase 'ref': {\n\t\t\tconst { field } = value\n\t\t\tif (typeof field !== 'string') return undefined\n\t\t\treturn { type: 'ref', field }\n\t\t}\n\t\tcase 'op': {\n\t\t\tconst { op, left, right } = value\n\t\t\tif (!isOp(op)) return undefined\n\t\t\tconst l = normalizeNode(left, depth + 1)\n\t\t\tif (!l) return undefined\n\t\t\tconst r = normalizeNode(right, depth + 1)\n\t\t\tif (!r) return undefined\n\t\t\treturn { type: 'op', op, left: l, right: r }\n\t\t}\n\t\tcase 'neg': {\n\t\t\tconst operand = normalizeNode(value.operand, depth + 1)\n\t\t\tif (!operand) return undefined\n\t\t\treturn { type: 'neg', operand }\n\t\t}\n\t\tcase 'fn': {\n\t\t\tconst { fn, args } = value\n\t\t\tif (!isFn(fn)) return undefined\n\t\t\tif (!Array.isArray(args)) return undefined\n\t\t\tconst normalizedArgs: CalcExpression[] = []\n\t\t\tfor (const arg of args) {\n\t\t\t\tconst a = normalizeNode(arg, depth + 1)\n\t\t\t\tif (!a) return undefined\n\t\t\t\tnormalizedArgs.push(a)\n\t\t\t}\n\t\t\treturn { type: 'fn', fn, args: normalizedArgs }\n\t\t}\n\t\tcase 'weight': {\n\t\t\tconst { field, weights } = value\n\t\t\tif (typeof field !== 'string') return undefined\n\t\t\tif (!isRecord(weights)) return undefined\n\t\t\tconst normalizedWeights: Record<string, number> = {}\n\t\t\tfor (const [k, v] of Object.entries(weights)) {\n\t\t\t\tif (typeof v !== 'number' || !Number.isFinite(v)) return undefined\n\t\t\t\tnormalizedWeights[k] = v\n\t\t\t}\n\t\t\treturn { type: 'weight', field, weights: normalizedWeights }\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\n\n/** Structural guard: returns a valid CalcExpression if `value` is structurally sound (depth-guarded at 64), otherwise undefined. Never throws. */\nexport const normalizeCalc = (value: unknown): CalcExpression | undefined => normalizeNode(value, 0)\n"],"mappings":";;AASA,MAAM,QAAQ,MAA6B,SAAgC,SAAS,CAAC;AACrF,MAAM,QAAQ,MAA6B,SAAgC,SAAS,CAAC;AAErF,MAAM,YAAY,MACjB,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAExD,MAAM,iBAAiB,OAAgB,UAA8C;CACpF,IAAI,QAAA,IAAmB,OAAO,KAAA;CAC9B,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,KAAA;CAE7B,QAAQ,MAAM,MAAd;EACC,KAAK,OAAO;GACX,MAAM,EAAE,OAAO,MAAM;GACrB,IAAI,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,KAAA;GACzD,OAAO;IAAE,MAAM;IAAO,OAAO;GAAE;EAChC;EACA,KAAK,OAAO;GACX,MAAM,EAAE,UAAU;GAClB,IAAI,OAAO,UAAU,UAAU,OAAO,KAAA;GACtC,OAAO;IAAE,MAAM;IAAO;GAAM;EAC7B;EACA,KAAK,MAAM;GACV,MAAM,EAAE,IAAI,MAAM,UAAU;GAC5B,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,KAAA;GACtB,MAAM,IAAI,cAAc,MAAM,QAAQ,CAAC;GACvC,IAAI,CAAC,GAAG,OAAO,KAAA;GACf,MAAM,IAAI,cAAc,OAAO,QAAQ,CAAC;GACxC,IAAI,CAAC,GAAG,OAAO,KAAA;GACf,OAAO;IAAE,MAAM;IAAM;IAAI,MAAM;IAAG,OAAO;GAAE;EAC5C;EACA,KAAK,OAAO;GACX,MAAM,UAAU,cAAc,MAAM,SAAS,QAAQ,CAAC;GACtD,IAAI,CAAC,SAAS,OAAO,KAAA;GACrB,OAAO;IAAE,MAAM;IAAO;GAAQ;EAC/B;EACA,KAAK,MAAM;GACV,MAAM,EAAE,IAAI,SAAS;GACrB,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,KAAA;GACtB,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG,OAAO,KAAA;GACjC,MAAM,iBAAmC,CAAC;GAC1C,KAAK,MAAM,OAAO,MAAM;IACvB,MAAM,IAAI,cAAc,KAAK,QAAQ,CAAC;IACtC,IAAI,CAAC,GAAG,OAAO,KAAA;IACf,eAAe,KAAK,CAAC;GACtB;GACA,OAAO;IAAE,MAAM;IAAM;IAAI,MAAM;GAAe;EAC/C;EACA,KAAK,UAAU;GACd,MAAM,EAAE,OAAO,YAAY;GAC3B,IAAI,OAAO,UAAU,UAAU,OAAO,KAAA;GACtC,IAAI,CAAC,SAAS,OAAO,GAAG,OAAO,KAAA;GAC/B,MAAM,oBAA4C,CAAC;GACnD,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,GAAG;IAC7C,IAAI,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,KAAA;IACzD,kBAAkB,KAAK;GACxB;GACA,OAAO;IAAE,MAAM;IAAU;IAAO,SAAS;GAAkB;EAC5D;EACA,SACC;CACF;AACD;;AAGA,MAAa,iBAAiB,UAA+C,cAAc,OAAO,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/calc/types.d.ts
|
|
2
|
+
/** Canonical operator grammar; `CalcExpression`, `normalizeCalc`, and the admin editor's jsonSchema all derive from this list. */
|
|
3
|
+
declare const CALC_OPS: readonly ["+", "-", "*", "/", "%"];
|
|
4
|
+
type CalcOp = (typeof CALC_OPS)[number];
|
|
5
|
+
/** Canonical function grammar; same single source of truth as `CALC_OPS`. */
|
|
6
|
+
declare const CALC_FNS: readonly ["min", "max", "round", "abs", "ceil", "floor"];
|
|
7
|
+
type CalcFn = (typeof CALC_FNS)[number];
|
|
8
|
+
/** A serializable, safe-by-construction calculation expression. No strings are parsed; the evaluator tree-walks this closed node set (never `eval`). */
|
|
9
|
+
type CalcExpression = {
|
|
10
|
+
type: 'lit';
|
|
11
|
+
value: number;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'ref';
|
|
14
|
+
field: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'op';
|
|
17
|
+
op: CalcOp;
|
|
18
|
+
left: CalcExpression;
|
|
19
|
+
right: CalcExpression;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'neg';
|
|
22
|
+
operand: CalcExpression;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'fn';
|
|
25
|
+
fn: CalcFn;
|
|
26
|
+
args: CalcExpression[];
|
|
27
|
+
} | {
|
|
28
|
+
type: 'weight';
|
|
29
|
+
field: string;
|
|
30
|
+
weights: Record<string, number>;
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
export { CalcExpression };
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/calc/types.ts
|
|
2
|
+
/** Canonical operator grammar; `CalcExpression`, `normalizeCalc`, and the admin editor's jsonSchema all derive from this list. */
|
|
3
|
+
const CALC_OPS = [
|
|
4
|
+
"+",
|
|
5
|
+
"-",
|
|
6
|
+
"*",
|
|
7
|
+
"/",
|
|
8
|
+
"%"
|
|
9
|
+
];
|
|
10
|
+
/** Canonical function grammar; same single source of truth as `CALC_OPS`. */
|
|
11
|
+
const CALC_FNS = [
|
|
12
|
+
"min",
|
|
13
|
+
"max",
|
|
14
|
+
"round",
|
|
15
|
+
"abs",
|
|
16
|
+
"ceil",
|
|
17
|
+
"floor"
|
|
18
|
+
];
|
|
19
|
+
//#endregion
|
|
20
|
+
export { CALC_FNS, CALC_OPS };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/calc/types.ts"],"sourcesContent":["/** Canonical operator grammar; `CalcExpression`, `normalizeCalc`, and the admin editor's jsonSchema all derive from this list. */\nexport const CALC_OPS = ['+', '-', '*', '/', '%'] as const\nexport type CalcOp = (typeof CALC_OPS)[number]\n\n/** Canonical function grammar; same single source of truth as `CALC_OPS`. */\nexport const CALC_FNS = ['min', 'max', 'round', 'abs', 'ceil', 'floor'] as const\nexport type CalcFn = (typeof CALC_FNS)[number]\n\n/** Recursion guard shared by `normalizeCalc` (parse) and `evaluate` (walk) so both bound depth identically. */\nexport const MAX_DEPTH = 64\n\n/** A serializable, safe-by-construction calculation expression. No strings are parsed; the evaluator tree-walks this closed node set (never `eval`). */\nexport type CalcExpression =\n\t| { type: 'lit'; value: number }\n\t| { type: 'ref'; field: string }\n\t| { type: 'op'; op: CalcOp; left: CalcExpression; right: CalcExpression }\n\t| { type: 'neg'; operand: CalcExpression }\n\t| { type: 'fn'; fn: CalcFn; args: CalcExpression[] }\n\t| { type: 'weight'; field: string; weights: Record<string, number> }\n"],"mappings":";;AACA,MAAa,WAAW;CAAC;CAAK;CAAK;CAAK;CAAK;AAAG;;AAIhD,MAAa,WAAW;CAAC;CAAO;CAAO;CAAS;CAAO;CAAQ;AAAO"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { TranslationKey } from "../translations/keys.js";
|
|
2
|
+
|
|
3
|
+
//#region src/client/ByteSizeField.d.ts
|
|
4
|
+
/** Props: standard number field client props; label and description arrive resolved on `field`. */
|
|
5
|
+
type ByteSizeFieldProps = {
|
|
6
|
+
path?: string;
|
|
7
|
+
field?: {
|
|
8
|
+
label?: unknown;
|
|
9
|
+
admin?: {
|
|
10
|
+
description?: unknown;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
label?: unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Field description as a translation key, resolved client-side. Payload drops `admin.description`
|
|
16
|
+
* functions from client fields, so a translated description must travel as a key; a static
|
|
17
|
+
* `admin.description` string still renders when this is unset.
|
|
18
|
+
*/
|
|
19
|
+
descriptionKey?: TranslationKey;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The `Field` mounted on a byte-count number config field (the file field's `maxSize`): a plain
|
|
23
|
+
* number input that live-previews the value as a human-readable size ('= 2.5 MB') so authors are
|
|
24
|
+
* not left decoding raw bytes. Stores the raw byte number unchanged.
|
|
25
|
+
*/
|
|
26
|
+
declare const ByteSizeField: (props: ByteSizeFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ByteSizeField };
|
|
29
|
+
//# sourceMappingURL=ByteSizeField.d.ts.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { formatBytes } from "../uploads/formatBytes.js";
|
|
3
|
+
import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
|
|
4
|
+
import { toStaticLabel } from "./toStaticLabel.js";
|
|
5
|
+
import { FieldDescription, FieldLabel, useField } from "@payloadcms/ui";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/client/ByteSizeField.tsx
|
|
8
|
+
/**
|
|
9
|
+
* The `Field` mounted on a byte-count number config field (the file field's `maxSize`): a plain
|
|
10
|
+
* number input that live-previews the value as a human-readable size ('= 2.5 MB') so authors are
|
|
11
|
+
* not left decoding raw bytes. Stores the raw byte number unchanged.
|
|
12
|
+
*/
|
|
13
|
+
const ByteSizeField = (props) => {
|
|
14
|
+
const { path, setValue, value } = useField({ path: props.path });
|
|
15
|
+
const label = toStaticLabel(props.field?.label ?? props.label);
|
|
16
|
+
const { t } = useTranslation$1();
|
|
17
|
+
const description = props.descriptionKey ? t(props.descriptionKey) : toStaticLabel(props.field?.admin?.description);
|
|
18
|
+
const handleChange = (event) => {
|
|
19
|
+
if (event.target.value === "") {
|
|
20
|
+
setValue(null);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const parsed = Number(event.target.value);
|
|
24
|
+
if (Number.isFinite(parsed)) setValue(parsed);
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
27
|
+
className: "field-type number",
|
|
28
|
+
style: { marginBlockEnd: "1rem" },
|
|
29
|
+
children: [/* @__PURE__ */ jsx(FieldLabel, {
|
|
30
|
+
label,
|
|
31
|
+
path
|
|
32
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
33
|
+
className: "field-type__wrap",
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsx("input", {
|
|
36
|
+
id: `field-${path.replace(/\./g, "__")}`,
|
|
37
|
+
min: 0,
|
|
38
|
+
name: path,
|
|
39
|
+
onChange: handleChange,
|
|
40
|
+
type: "number",
|
|
41
|
+
value: typeof value === "number" ? value : ""
|
|
42
|
+
}),
|
|
43
|
+
typeof value === "number" && value > 0 ? /* @__PURE__ */ jsx("div", {
|
|
44
|
+
className: "field-description",
|
|
45
|
+
children: `= ${formatBytes(value)}`
|
|
46
|
+
}) : null,
|
|
47
|
+
/* @__PURE__ */ jsx(FieldDescription, {
|
|
48
|
+
description,
|
|
49
|
+
path
|
|
50
|
+
})
|
|
51
|
+
]
|
|
52
|
+
})]
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { ByteSizeField };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=ByteSizeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ByteSizeField.js","names":["useTranslation"],"sources":["../../src/client/ByteSizeField.tsx"],"sourcesContent":["'use client'\n\nimport { FieldDescription, FieldLabel, useField } from '@payloadcms/ui'\nimport type { ChangeEvent } from 'react'\nimport type { TranslationKey } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\nimport { formatBytes } from '../uploads/formatBytes'\nimport { toStaticLabel } from './toStaticLabel'\n\n/** Props: standard number field client props; label and description arrive resolved on `field`. */\nexport type ByteSizeFieldProps = {\n\tpath?: string\n\tfield?: { label?: unknown; admin?: { description?: unknown } }\n\tlabel?: unknown\n\t/**\n\t * Field description as a translation key, resolved client-side. Payload drops `admin.description`\n\t * functions from client fields, so a translated description must travel as a key; a static\n\t * `admin.description` string still renders when this is unset.\n\t */\n\tdescriptionKey?: TranslationKey\n}\n\n/**\n * The `Field` mounted on a byte-count number config field (the file field's `maxSize`): a plain\n * number input that live-previews the value as a human-readable size ('= 2.5 MB') so authors are\n * not left decoding raw bytes. Stores the raw byte number unchanged.\n */\nexport const ByteSizeField = (props: ByteSizeFieldProps) => {\n\tconst { path, setValue, value } = useField<number>({ path: props.path })\n\tconst label = toStaticLabel(props.field?.label ?? props.label)\n\tconst { t } = useTranslation()\n\tconst description = props.descriptionKey\n\t\t? t(props.descriptionKey)\n\t\t: toStaticLabel(props.field?.admin?.description)\n\n\tconst handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n\t\tif (event.target.value === '') {\n\t\t\tsetValue(null)\n\t\t\treturn\n\t\t}\n\t\tconst parsed = Number(event.target.value)\n\t\tif (Number.isFinite(parsed)) {\n\t\t\tsetValue(parsed)\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"field-type number\" style={{ marginBlockEnd: '1rem' }}>\n\t\t\t<FieldLabel label={label} path={path} />\n\t\t\t<div className=\"field-type__wrap\">\n\t\t\t\t<input\n\t\t\t\t\tid={`field-${path.replace(/\\./g, '__')}`}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tname={path}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\tvalue={typeof value === 'number' ? value : ''}\n\t\t\t\t/>\n\t\t\t\t{typeof value === 'number' && value > 0 ? (\n\t\t\t\t\t<div className=\"field-description\">{`= ${formatBytes(value)}`}</div>\n\t\t\t\t) : null}\n\t\t\t\t<FieldDescription description={description} path={path} />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"mappings":";;;;;;;;;;;;AA2BA,MAAa,iBAAiB,UAA8B;CAC3D,MAAM,EAAE,MAAM,UAAU,UAAU,SAAiB,EAAE,MAAM,MAAM,KAAK,CAAC;CACvE,MAAM,QAAQ,cAAc,MAAM,OAAO,SAAS,MAAM,KAAK;CAC7D,MAAM,EAAE,MAAMA,iBAAe;CAC7B,MAAM,cAAc,MAAM,iBACvB,EAAE,MAAM,cAAc,IACtB,cAAc,MAAM,OAAO,OAAO,WAAW;CAEhD,MAAM,gBAAgB,UAAyC;EAC9D,IAAI,MAAM,OAAO,UAAU,IAAI;GAC9B,SAAS,IAAI;GACb;EACD;EACA,MAAM,SAAS,OAAO,MAAM,OAAO,KAAK;EACxC,IAAI,OAAO,SAAS,MAAM,GACzB,SAAS,MAAM;CAEjB;CAEA,OACC,qBAAC,OAAD;EAAK,WAAU;EAAoB,OAAO,EAAE,gBAAgB,OAAO;YAAnE,CACC,oBAAC,YAAD;GAAmB;GAAa;EAAO,CAAA,GACvC,qBAAC,OAAD;GAAK,WAAU;aAAf;IACC,oBAAC,SAAD;KACC,IAAI,SAAS,KAAK,QAAQ,OAAO,IAAI;KACrC,KAAK;KACL,MAAM;KACN,UAAU;KACV,MAAK;KACL,OAAO,OAAO,UAAU,WAAW,QAAQ;IAC3C,CAAA;IACA,OAAO,UAAU,YAAY,QAAQ,IACrC,oBAAC,OAAD;KAAK,WAAU;eAAqB,KAAK,YAAY,KAAK;IAAS,CAAA,IAChE;IACJ,oBAAC,kBAAD;KAA+B;KAAmB;IAAO,CAAA;GACrD;IACD;;AAEP"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/client/ClosePollButton.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* The `poll.closePoll` UI field: one button that closes the poll and, once closed, reopens it, by
|
|
4
|
+
* saving the whole document rather than calling the `/:id/close` endpoint. Closing stamps
|
|
5
|
+
* `poll.closesAt` now while keeping the admin's just-picked winner, so both persist together through
|
|
6
|
+
* the normal save (`pollOutcomeBeforeChange` validates the winner and stamps `resolvedAt`; the
|
|
7
|
+
* `afterChange` hook enqueues the close for a `mostVoted`/`source` strategy). Reopening clears both
|
|
8
|
+
* `closesAt` and `winningValues`, since either one keeps a poll finalized. A `manual` poll with no
|
|
9
|
+
* winner selected disables the button (there is nothing to record); `mostVoted`/`source` stay enabled
|
|
10
|
+
* because the winner is server-computed. Disabled on an unsaved document (no id yet).
|
|
11
|
+
*/
|
|
12
|
+
declare const ClosePollButton: () => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { ClosePollButton };
|
|
15
|
+
//# sourceMappingURL=ClosePollButton.d.ts.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { keys } from "../translations/keys.js";
|
|
3
|
+
import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
|
|
4
|
+
import { Button, useDocumentInfo, useForm, useFormFields } from "@payloadcms/ui";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
//#region src/client/ClosePollButton.tsx
|
|
8
|
+
/** The help line under the button when closing, tailored to the strategy that closing will apply. */
|
|
9
|
+
const closeHintKeyFor = (type) => {
|
|
10
|
+
if (type === "mostVoted") return keys.pollCloseHintMostVoted;
|
|
11
|
+
if (type === "source") return keys.pollCloseHintSource;
|
|
12
|
+
return keys.pollCloseHintManual;
|
|
13
|
+
};
|
|
14
|
+
const strOf = (value) => typeof value === "string" && value.length > 0 ? value : "manual";
|
|
15
|
+
/** True once a `closesAt` is set (scheduled or past): the toggle treats that as closed/finalized. */
|
|
16
|
+
const isClosed = (value) => typeof value === "string" && value.length > 0;
|
|
17
|
+
/** True when the winner set holds at least one non-empty value. */
|
|
18
|
+
const hasWinner = (value) => Array.isArray(value) && value.some((entry) => typeof entry === "string" && entry.length > 0);
|
|
19
|
+
const asRecord = (value) => value != null && typeof value === "object" ? value : {};
|
|
20
|
+
/**
|
|
21
|
+
* The `poll.closePoll` UI field: one button that closes the poll and, once closed, reopens it, by
|
|
22
|
+
* saving the whole document rather than calling the `/:id/close` endpoint. Closing stamps
|
|
23
|
+
* `poll.closesAt` now while keeping the admin's just-picked winner, so both persist together through
|
|
24
|
+
* the normal save (`pollOutcomeBeforeChange` validates the winner and stamps `resolvedAt`; the
|
|
25
|
+
* `afterChange` hook enqueues the close for a `mostVoted`/`source` strategy). Reopening clears both
|
|
26
|
+
* `closesAt` and `winningValues`, since either one keeps a poll finalized. A `manual` poll with no
|
|
27
|
+
* winner selected disables the button (there is nothing to record); `mostVoted`/`source` stay enabled
|
|
28
|
+
* because the winner is server-computed. Disabled on an unsaved document (no id yet).
|
|
29
|
+
*/
|
|
30
|
+
const ClosePollButton = () => {
|
|
31
|
+
const { t } = useTranslation$1();
|
|
32
|
+
const { id } = useDocumentInfo();
|
|
33
|
+
const { getDataByPath, submit } = useForm();
|
|
34
|
+
const type = useFormFields(([fields]) => strOf(fields?.["poll.type"]?.value));
|
|
35
|
+
const closed = useFormFields(([fields]) => isClosed(fields?.["poll.closesAt"]?.value));
|
|
36
|
+
const winnerSet = useFormFields(([fields]) => hasWinner(fields?.["poll.outcome.winningValues"]?.value));
|
|
37
|
+
const [submitting, setSubmitting] = useState(false);
|
|
38
|
+
const manualNeedsWinner = !closed && type === "manual" && !winnerSet;
|
|
39
|
+
const disabled = id == null || submitting || manualNeedsWinner;
|
|
40
|
+
const save = async (nextPoll) => {
|
|
41
|
+
if (id == null) return;
|
|
42
|
+
setSubmitting(true);
|
|
43
|
+
try {
|
|
44
|
+
await submit({ overrides: { poll: nextPoll(asRecord(getDataByPath("poll"))) } });
|
|
45
|
+
} finally {
|
|
46
|
+
setSubmitting(false);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const close = () => save((poll) => ({
|
|
50
|
+
...poll,
|
|
51
|
+
closesAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
52
|
+
}));
|
|
53
|
+
const reopen = () => save((poll) => ({
|
|
54
|
+
...poll,
|
|
55
|
+
closesAt: null,
|
|
56
|
+
outcome: {
|
|
57
|
+
...asRecord(poll.outcome),
|
|
58
|
+
winningValues: []
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
const hintKey = closed ? keys.pollReopenHint : manualNeedsWinner ? keys.pollCloseNeedsWinner : closeHintKeyFor(type);
|
|
62
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
63
|
+
className: "field-type",
|
|
64
|
+
style: { marginBlockEnd: "1rem" },
|
|
65
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
66
|
+
buttonStyle: "secondary",
|
|
67
|
+
onClick: closed ? reopen : close,
|
|
68
|
+
disabled,
|
|
69
|
+
children: t(closed ? keys.pollReopenButton : keys.pollCloseButton)
|
|
70
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
71
|
+
className: "field-description",
|
|
72
|
+
style: { marginBlockStart: "0.5rem" },
|
|
73
|
+
children: t(hintKey)
|
|
74
|
+
})]
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
//#endregion
|
|
78
|
+
export { ClosePollButton };
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=ClosePollButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClosePollButton.js","names":["useTranslation"],"sources":["../../src/client/ClosePollButton.tsx"],"sourcesContent":["'use client'\n\nimport { Button, useDocumentInfo, useForm, useFormFields } from '@payloadcms/ui'\nimport { useState } from 'react'\nimport { keys, type TranslationKey } from '../translations/keys'\nimport { useTranslation } from '../translations/useTranslation'\n\n/** The help line under the button when closing, tailored to the strategy that closing will apply. */\nconst closeHintKeyFor = (type: string): TranslationKey => {\n\tif (type === 'mostVoted') {\n\t\treturn keys.pollCloseHintMostVoted\n\t}\n\tif (type === 'source') {\n\t\treturn keys.pollCloseHintSource\n\t}\n\treturn keys.pollCloseHintManual\n}\n\nconst strOf = (value: unknown): string =>\n\ttypeof value === 'string' && value.length > 0 ? value : 'manual'\n\n/** True once a `closesAt` is set (scheduled or past): the toggle treats that as closed/finalized. */\nconst isClosed = (value: unknown): boolean => typeof value === 'string' && value.length > 0\n\n/** True when the winner set holds at least one non-empty value. */\nconst hasWinner = (value: unknown): boolean =>\n\tArray.isArray(value) && value.some((entry) => typeof entry === 'string' && entry.length > 0)\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n\tvalue != null && typeof value === 'object' ? (value as Record<string, unknown>) : {}\n\n/**\n * The `poll.closePoll` UI field: one button that closes the poll and, once closed, reopens it, by\n * saving the whole document rather than calling the `/:id/close` endpoint. Closing stamps\n * `poll.closesAt` now while keeping the admin's just-picked winner, so both persist together through\n * the normal save (`pollOutcomeBeforeChange` validates the winner and stamps `resolvedAt`; the\n * `afterChange` hook enqueues the close for a `mostVoted`/`source` strategy). Reopening clears both\n * `closesAt` and `winningValues`, since either one keeps a poll finalized. A `manual` poll with no\n * winner selected disables the button (there is nothing to record); `mostVoted`/`source` stay enabled\n * because the winner is server-computed. Disabled on an unsaved document (no id yet).\n */\nexport const ClosePollButton = () => {\n\tconst { t } = useTranslation()\n\tconst { id } = useDocumentInfo()\n\tconst { getDataByPath, submit } = useForm()\n\tconst type = useFormFields(([fields]) => strOf(fields?.['poll.type']?.value))\n\tconst closed = useFormFields(([fields]) => isClosed(fields?.['poll.closesAt']?.value))\n\tconst winnerSet = useFormFields(([fields]) =>\n\t\thasWinner(fields?.['poll.outcome.winningValues']?.value)\n\t)\n\tconst [submitting, setSubmitting] = useState(false)\n\n\tconst manualNeedsWinner = !closed && type === 'manual' && !winnerSet\n\tconst disabled = id == null || submitting || manualNeedsWinner\n\n\tconst save = async (nextPoll: (poll: Record<string, unknown>) => Record<string, unknown>) => {\n\t\tif (id == null) {\n\t\t\treturn\n\t\t}\n\t\tsetSubmitting(true)\n\t\ttry {\n\t\t\t// Rebuild the whole poll group from live form state and override it in one shot: a shallow\n\t\t\t// top-level override, so the winner and every other poll field are preserved (a dotted\n\t\t\t// `poll.closesAt` override key never reaches the nested field on the server).\n\t\t\tconst poll = asRecord(getDataByPath('poll'))\n\t\t\tawait submit({ overrides: { poll: nextPoll(poll) } })\n\t\t} finally {\n\t\t\tsetSubmitting(false)\n\t\t}\n\t}\n\n\tconst close = () => save((poll) => ({ ...poll, closesAt: new Date().toISOString() }))\n\tconst reopen = () =>\n\t\tsave((poll) => ({\n\t\t\t...poll,\n\t\t\tclosesAt: null,\n\t\t\toutcome: { ...asRecord(poll.outcome), winningValues: [] },\n\t\t}))\n\n\tconst hintKey: TranslationKey = closed\n\t\t? keys.pollReopenHint\n\t\t: manualNeedsWinner\n\t\t\t? keys.pollCloseNeedsWinner\n\t\t\t: closeHintKeyFor(type)\n\n\treturn (\n\t\t<div className=\"field-type\" style={{ marginBlockEnd: '1rem' }}>\n\t\t\t<Button buttonStyle=\"secondary\" onClick={closed ? reopen : close} disabled={disabled}>\n\t\t\t\t{t(closed ? keys.pollReopenButton : keys.pollCloseButton)}\n\t\t\t</Button>\n\t\t\t<p className=\"field-description\" style={{ marginBlockStart: '0.5rem' }}>\n\t\t\t\t{t(hintKey)}\n\t\t\t</p>\n\t\t</div>\n\t)\n}\n"],"mappings":";;;;;;;;AAQA,MAAM,mBAAmB,SAAiC;CACzD,IAAI,SAAS,aACZ,OAAO,KAAK;CAEb,IAAI,SAAS,UACZ,OAAO,KAAK;CAEb,OAAO,KAAK;AACb;AAEA,MAAM,SAAS,UACd,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;;AAGzD,MAAM,YAAY,UAA4B,OAAO,UAAU,YAAY,MAAM,SAAS;;AAG1F,MAAM,aAAa,UAClB,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,UAAU,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AAE5F,MAAM,YAAY,UACjB,SAAS,QAAQ,OAAO,UAAU,WAAY,QAAoC,CAAC;;;;;;;;;;;AAYpF,MAAa,wBAAwB;CACpC,MAAM,EAAE,MAAMA,iBAAe;CAC7B,MAAM,EAAE,OAAO,gBAAgB;CAC/B,MAAM,EAAE,eAAe,WAAW,QAAQ;CAC1C,MAAM,OAAO,eAAe,CAAC,YAAY,MAAM,SAAS,cAAc,KAAK,CAAC;CAC5E,MAAM,SAAS,eAAe,CAAC,YAAY,SAAS,SAAS,kBAAkB,KAAK,CAAC;CACrF,MAAM,YAAY,eAAe,CAAC,YACjC,UAAU,SAAS,+BAA+B,KAAK,CACxD;CACA,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAElD,MAAM,oBAAoB,CAAC,UAAU,SAAS,YAAY,CAAC;CAC3D,MAAM,WAAW,MAAM,QAAQ,cAAc;CAE7C,MAAM,OAAO,OAAO,aAAyE;EAC5F,IAAI,MAAM,MACT;EAED,cAAc,IAAI;EAClB,IAAI;GAKH,MAAM,OAAO,EAAE,WAAW,EAAE,MAAM,SADrB,SAAS,cAAc,MAAM,CACI,CAAC,EAAE,EAAE,CAAC;EACrD,UAAU;GACT,cAAc,KAAK;EACpB;CACD;CAEA,MAAM,cAAc,MAAM,UAAU;EAAE,GAAG;EAAM,2BAAU,IAAI,KAAK,GAAE,YAAY;CAAE,EAAE;CACpF,MAAM,eACL,MAAM,UAAU;EACf,GAAG;EACH,UAAU;EACV,SAAS;GAAE,GAAG,SAAS,KAAK,OAAO;GAAG,eAAe,CAAC;EAAE;CACzD,EAAE;CAEH,MAAM,UAA0B,SAC7B,KAAK,iBACL,oBACC,KAAK,uBACL,gBAAgB,IAAI;CAExB,OACC,qBAAC,OAAD;EAAK,WAAU;EAAa,OAAO,EAAE,gBAAgB,OAAO;YAA5D,CACC,oBAAC,QAAD;GAAQ,aAAY;GAAY,SAAS,SAAS,SAAS;GAAiB;aAC1E,EAAE,SAAS,KAAK,mBAAmB,KAAK,eAAe;EACjD,CAAA,GACR,oBAAC,KAAD;GAAG,WAAU;GAAoB,OAAO,EAAE,kBAAkB,SAAS;aACnE,EAAE,OAAO;EACR,CAAA,CACC;;AAEP"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ArrayFieldClientComponent } from "payload";
|
|
2
|
+
//#region src/client/CondensedArray.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* A custom `Field` for a real Payload `array` that renders its rows flat: each row is `[label, email]`
|
|
5
|
+
* laid out at 50% width with a remove control, added by a footer button, and never wrapped in the
|
|
6
|
+
* per-row `Collapsible` that Payload's native array applies unconditionally. Row ids and per-locale
|
|
7
|
+
* storage stay Payload's: rows come from `useField({ hasRows: true })`, mutations go through
|
|
8
|
+
* `useForm`'s `addFieldRow`/`removeFieldRow`, and each row's subfields render through `RenderFields`
|
|
9
|
+
* at `{path}.{index}` exactly as the native array does, so localization, validation, and descriptions
|
|
10
|
+
* work natively. Placed by {@link departmentsField}.
|
|
11
|
+
*/
|
|
12
|
+
declare const CondensedArray: ArrayFieldClientComponent;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { CondensedArray };
|
|
15
|
+
//# sourceMappingURL=CondensedArray.d.ts.map
|