@gusto/embedded-react-sdk 0.52.0 → 0.52.1
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 +16 -0
- package/dist/components/Base/Base.d.ts +2 -0
- package/dist/components/Base/Base.js.map +1 -1
- package/dist/components/Common/PaginationControl/PaginationControlTypes.d.ts +4 -1
- package/dist/components/Common/UI/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -1
- package/dist/components/Common/UI/Breadcrumbs/BreadcrumbsTypes.js.map +1 -1
- package/dist/components/Common/UI/CheckboxGroup/CheckboxGroupTypes.d.ts +1 -1
- package/dist/components/Common/UI/CheckboxGroup/CheckboxGroupTypes.js.map +1 -1
- package/dist/components/Common/UI/ComboBox/ComboBoxTypes.d.ts +2 -2
- package/dist/components/Common/UI/DateRangePicker/DateRangePickerTypes.d.ts +3 -2
- package/dist/components/Common/UI/DescriptionList/DescriptionListTypes.d.ts +1 -1
- package/dist/components/Common/UI/DescriptionList/DescriptionListTypes.js.map +1 -1
- package/dist/components/Common/UI/Menu/MenuTypes.d.ts +3 -3
- package/dist/components/Common/UI/Menu/MenuTypes.js.map +1 -1
- package/dist/components/Common/UI/MultiSelectComboBox/MultiSelectComboBoxTypes.d.ts +2 -2
- package/dist/components/Common/UI/RadioGroup/RadioGroupTypes.d.ts +2 -2
- package/dist/components/Common/UI/RadioGroup/RadioGroupTypes.js.map +1 -1
- package/dist/components/Common/UI/Select/SelectTypes.d.ts +2 -2
- package/dist/components/Common/UI/Table/TableTypes.d.ts +4 -4
- package/dist/components/Common/UI/Table/TableTypes.js.map +1 -1
- package/dist/components/Common/UI/Tabs/TabsTypes.d.ts +2 -2
- package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +5 -3
- package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +5 -3
- package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/useAssignSignatory.js +7 -5
- package/dist/components/Company/AssignSignatory/useAssignSignatory.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountForm/context.js +5 -3
- package/dist/components/Company/BankAccount/BankAccountForm/context.js.map +1 -1
- package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +5 -3
- package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
- package/dist/components/Company/FederalTaxes/useFederalTaxes.js +10 -8
- package/dist/components/Company/FederalTaxes/useFederalTaxes.js.map +1 -1
- package/dist/components/Company/Industry/Context.js +8 -6
- package/dist/components/Company/Industry/Context.js.map +1 -1
- package/dist/components/Company/Locations/LocationForm/useLocationForm.js +5 -3
- package/dist/components/Company/Locations/LocationForm/useLocationForm.js.map +1 -1
- package/dist/components/Company/Locations/LocationsList/useLocationsList.js +5 -3
- package/dist/components/Company/Locations/LocationsList/useLocationsList.js.map +1 -1
- package/dist/components/Company/OnboardingOverview/context.js +5 -3
- package/dist/components/Company/OnboardingOverview/context.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +5 -3
- package/dist/components/Company/StateTaxes/StateTaxesForm/context.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesList/context.js +5 -3
- package/dist/components/Company/StateTaxes/StateTaxesList/context.js.map +1 -1
- package/dist/components/Contractor/ContractorList/index.d.ts +2 -1
- package/dist/components/Contractor/ContractorList/index.js +121 -99
- package/dist/components/Contractor/ContractorList/index.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlow.d.ts +1 -1
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlow.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlowComponents.d.ts +2 -0
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlowComponents.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/onboardingStateMachine.js +150 -80
- package/dist/components/Contractor/OnboardingFlow/onboardingStateMachine.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/onboardingStateMachine.test.d.ts +1 -0
- package/dist/components/Contractor/Profile/BusinessSelfOnboardingProfile.js +19 -18
- package/dist/components/Contractor/Profile/BusinessSelfOnboardingProfile.js.map +1 -1
- package/dist/components/Contractor/Profile/ContractorProfile.d.ts +1 -1
- package/dist/components/Contractor/Profile/ContractorProfile.js +114 -110
- package/dist/components/Contractor/Profile/ContractorProfile.js.map +1 -1
- package/dist/components/Contractor/Profile/IndividualSelfOnboardingProfile.js +27 -26
- package/dist/components/Contractor/Profile/IndividualSelfOnboardingProfile.js.map +1 -1
- package/dist/components/Contractor/Submit/Submit.js +106 -63
- package/dist/components/Contractor/Submit/Submit.js.map +1 -1
- package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js +5 -3
- package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
- package/dist/components/Employee/StateTaxes/shared/useEmployeeStateTaxesForm/fields.d.ts +2 -2
- package/dist/components/Employee/StateTaxes/shared/useEmployeeStateTaxesForm/fields.js.map +1 -1
- package/dist/components/Payroll/usePreparedPayrollData.js +10 -8
- package/dist/components/Payroll/usePreparedPayrollData.js.map +1 -1
- package/dist/contexts/ComponentAdapter/useComponentContext.d.ts +1 -1
- package/dist/contexts/ComponentAdapter/useComponentContext.js.map +1 -1
- package/dist/contexts/GustoProvider/GustoProvider.d.ts +1 -0
- package/dist/contexts/GustoProvider/GustoProvider.js.map +1 -1
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.d.ts +1 -0
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.js.map +1 -1
- package/dist/contexts/ThemeProvider/types.d.ts +2 -2
- package/dist/i18n/en/Contractor.ContractorList.json.js +22 -20
- package/dist/i18n/en/Contractor.ContractorList.json.js.map +1 -1
- package/dist/i18n/en/Contractor.Submit.json.js +11 -11
- package/dist/i18n/types.d.ts +7 -3
- package/dist/models/WA_RISK_CODES.d.ts +1 -0
- package/dist/models/WA_RISK_CODES.js.map +1 -1
- package/dist/partner-hook-utils/composeErrorHandler.d.ts +4 -0
- package/dist/partner-hook-utils/composeErrorHandler.js.map +1 -1
- package/dist/partner-hook-utils/form/SDKFormProvider.d.ts +1 -0
- package/dist/partner-hook-utils/form/SDKFormProvider.js.map +1 -1
- package/dist/partner-hook-utils/form/composeSubmitHandler.d.ts +4 -0
- package/dist/partner-hook-utils/form/composeSubmitHandler.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/CheckboxHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/CheckboxHookField.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/DatePickerHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/DatePickerHookField.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/NumberInputHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/NumberInputHookField.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/RadioGroupHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/RadioGroupHookField.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/SelectHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/SelectHookField.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/SwitchHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/SwitchHookField.js.map +1 -1
- package/dist/partner-hook-utils/form/fields/TextInputHookField.d.ts +1 -0
- package/dist/partner-hook-utils/form/fields/TextInputHookField.js.map +1 -1
- package/dist/partner-hook-utils/types.d.ts +9 -0
- package/dist/shared/constants.d.ts +10 -0
- package/dist/shared/constants.js +7 -6
- package/dist/shared/constants.js.map +1 -1
- package/dist/types/Helpers.d.ts +2 -0
- package/dist/types/hooks.d.ts +1 -0
- package/dist/types/observability.d.ts +1 -0
- package/docs/guides/endpoint-inventory.json +17 -1
- package/package.json +11 -11
|
@@ -6,6 +6,7 @@ import { SDKError } from '../types/sdkError';
|
|
|
6
6
|
* {@link composeErrorHandler} reads from an additional query passed as a source.
|
|
7
7
|
*
|
|
8
8
|
* @public
|
|
9
|
+
* @childOf {@link composeErrorHandler}
|
|
9
10
|
*/
|
|
10
11
|
export type QueryWithRefetch = Pick<UseQueryResult, 'error' | 'refetch'>;
|
|
11
12
|
/**
|
|
@@ -17,6 +18,7 @@ export type QueryWithRefetch = Pick<UseQueryResult, 'error' | 'refetch'>;
|
|
|
17
18
|
* and can be cleared together with `clearSubmitError`.
|
|
18
19
|
*
|
|
19
20
|
* @public
|
|
21
|
+
* @childOf {@link composeErrorHandler}
|
|
20
22
|
*/
|
|
21
23
|
export type SubmitStateForErrorHandling = {
|
|
22
24
|
/** The current submit error, or `null` when cleared. */
|
|
@@ -30,6 +32,7 @@ export type SubmitStateForErrorHandling = {
|
|
|
30
32
|
* an `errorHandling` object.
|
|
31
33
|
*
|
|
32
34
|
* @public
|
|
35
|
+
* @childOf {@link composeErrorHandler}
|
|
33
36
|
*/
|
|
34
37
|
export type MixedErrorSource = QueryWithRefetch | {
|
|
35
38
|
errorHandling: HookErrorHandling;
|
|
@@ -56,6 +59,7 @@ export type MixedErrorSource = QueryWithRefetch | {
|
|
|
56
59
|
* @param submitState - Optional screen-level submit state to fold into the result.
|
|
57
60
|
* @returns A single `HookErrorHandling` covering every source.
|
|
58
61
|
* @public
|
|
62
|
+
* @group Form composition
|
|
59
63
|
*
|
|
60
64
|
* @example
|
|
61
65
|
* ```tsx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composeErrorHandler.js","sources":["../../src/partner-hook-utils/composeErrorHandler.ts"],"sourcesContent":["import type { UseQueryResult } from '@tanstack/react-query'\nimport { collectErrors } from './collectErrors'\nimport type { HookErrorHandling } from './types'\nimport type { SDKError } from '@/types/sdkError'\n\n/**\n * The subset of a TanStack Query result — its `error` and `refetch` — that\n * {@link composeErrorHandler} reads from an additional query passed as a source.\n *\n * @public\n */\nexport type QueryWithRefetch = Pick<UseQueryResult, 'error' | 'refetch'>\n\n/**\n * Submit-side error state to merge into a composed {@link HookErrorHandling}.\n *\n * @remarks\n * Pass to {@link composeErrorHandler} when a screen has its own submit state outside of\n * any SDK form hook, so submit errors appear in the same error surface as query errors\n * and can be cleared together with `clearSubmitError`.\n *\n * @public\n */\nexport type SubmitStateForErrorHandling = {\n /** The current submit error, or `null` when cleared. */\n submitError: SDKError | null\n /** Sets or clears the submit error. */\n setSubmitError: (error: SDKError | null) => void\n}\n\n/**\n * Accepted input shape for {@link composeErrorHandler}: either a React Query result\n * (anything with `error` and `refetch`) or another SDK hook result that exposes\n * an `errorHandling` object.\n *\n * @public\n */\nexport type MixedErrorSource = QueryWithRefetch | { errorHandling: HookErrorHandling }\n\nfunction isHookResultWithErrorHandling(\n source: MixedErrorSource,\n): source is { errorHandling: HookErrorHandling } {\n return 'errorHandling' in source\n}\n\n/**\n * Merges multiple error sources into a single {@link HookErrorHandling}.\n *\n * @remarks\n * Accepts any mix of `@gusto/embedded-api-v-2026-06-15` React Query results and SDK hook\n * results that already expose an `errorHandling` object (including the value returned by\n * {@link composeSubmitHandler}). Query errors are normalized to `SDKError`, nested hook\n * errors are flattened in, and an optional submit-state argument adds a submit error to\n * the same list.\n *\n * The returned `retryQueries` refetches every failed query and delegates into each nested\n * hook so their retries fire too. `clearSubmitError` clears the optional submit state and\n * delegates into each nested hook.\n *\n * Pairs with {@link composeSubmitHandler} by name only — this composes error state and\n * recovery, not a submit callback.\n *\n * @param sources - Error sources to merge. Each entry is either a React Query result or\n * an object with an `errorHandling` property.\n * @param submitState - Optional screen-level submit state to fold into the result.\n * @returns A single `HookErrorHandling` covering every source.\n * @public\n *\n * @example\n * ```tsx\n * import { composeErrorHandler, useEmployeeDetailsForm } from '@gusto/embedded-react-sdk'\n * import { useEmployeeFormsList } from '@gusto/embedded-api-v-2026-06-15/react-query/employeeFormsList'\n *\n * function EmployeeProfileView({ companyId, employeeId }: { companyId: string; employeeId: string }) {\n * const employeeDetails = useEmployeeDetailsForm({ companyId, employeeId })\n * const formsListQuery = useEmployeeFormsList({ employeeId })\n *\n * const errorHandling = composeErrorHandler([employeeDetails, formsListQuery])\n *\n * if (errorHandling.errors.length > 0) {\n * return (\n * <div role=\"alert\">\n * {errorHandling.errors.map((error, i) => (\n * <p key={i}>{error.message}</p>\n * ))}\n * <button onClick={errorHandling.retryQueries}>Retry</button>\n * </div>\n * )\n * }\n *\n * return null\n * }\n * ```\n */\nexport function composeErrorHandler(\n sources: MixedErrorSource[],\n submitState?: SubmitStateForErrorHandling,\n): HookErrorHandling {\n const queries: QueryWithRefetch[] = []\n const errorHandlingsFromNestedHooks: HookErrorHandling[] = []\n\n for (const source of sources) {\n if (isHookResultWithErrorHandling(source)) {\n errorHandlingsFromNestedHooks.push(source.errorHandling)\n } else {\n queries.push(source)\n }\n }\n\n const nestedErrors = errorHandlingsFromNestedHooks.flatMap(handling => handling.errors)\n\n let errors: SDKError[]\n if (errorHandlingsFromNestedHooks.length === 0) {\n errors = collectErrors(queries, submitState?.submitError ?? null)\n } else {\n const standaloneQueryErrors = collectErrors(queries, null)\n errors = [...nestedErrors, ...standaloneQueryErrors]\n if (submitState?.submitError) {\n errors.push(submitState.submitError)\n }\n }\n\n const retryQueries = () => {\n for (const handling of errorHandlingsFromNestedHooks) {\n handling.retryQueries()\n }\n queries.filter(q => q.error != null).forEach(q => void q.refetch())\n }\n\n const clearSubmitError = () => {\n for (const handling of errorHandlingsFromNestedHooks) {\n handling.clearSubmitError()\n }\n submitState?.setSubmitError(null)\n }\n\n return { errors, retryQueries, clearSubmitError }\n}\n"],"names":["isHookResultWithErrorHandling","source","composeErrorHandler","sources","submitState","queries","errorHandlingsFromNestedHooks","nestedErrors","handling","errors","collectErrors","standaloneQueryErrors","q"],"mappings":";
|
|
1
|
+
{"version":3,"file":"composeErrorHandler.js","sources":["../../src/partner-hook-utils/composeErrorHandler.ts"],"sourcesContent":["import type { UseQueryResult } from '@tanstack/react-query'\nimport { collectErrors } from './collectErrors'\nimport type { HookErrorHandling } from './types'\nimport type { SDKError } from '@/types/sdkError'\n\n/**\n * The subset of a TanStack Query result — its `error` and `refetch` — that\n * {@link composeErrorHandler} reads from an additional query passed as a source.\n *\n * @public\n * @childOf {@link composeErrorHandler}\n */\nexport type QueryWithRefetch = Pick<UseQueryResult, 'error' | 'refetch'>\n\n/**\n * Submit-side error state to merge into a composed {@link HookErrorHandling}.\n *\n * @remarks\n * Pass to {@link composeErrorHandler} when a screen has its own submit state outside of\n * any SDK form hook, so submit errors appear in the same error surface as query errors\n * and can be cleared together with `clearSubmitError`.\n *\n * @public\n * @childOf {@link composeErrorHandler}\n */\nexport type SubmitStateForErrorHandling = {\n /** The current submit error, or `null` when cleared. */\n submitError: SDKError | null\n /** Sets or clears the submit error. */\n setSubmitError: (error: SDKError | null) => void\n}\n\n/**\n * Accepted input shape for {@link composeErrorHandler}: either a React Query result\n * (anything with `error` and `refetch`) or another SDK hook result that exposes\n * an `errorHandling` object.\n *\n * @public\n * @childOf {@link composeErrorHandler}\n */\nexport type MixedErrorSource = QueryWithRefetch | { errorHandling: HookErrorHandling }\n\nfunction isHookResultWithErrorHandling(\n source: MixedErrorSource,\n): source is { errorHandling: HookErrorHandling } {\n return 'errorHandling' in source\n}\n\n/**\n * Merges multiple error sources into a single {@link HookErrorHandling}.\n *\n * @remarks\n * Accepts any mix of `@gusto/embedded-api-v-2026-06-15` React Query results and SDK hook\n * results that already expose an `errorHandling` object (including the value returned by\n * {@link composeSubmitHandler}). Query errors are normalized to `SDKError`, nested hook\n * errors are flattened in, and an optional submit-state argument adds a submit error to\n * the same list.\n *\n * The returned `retryQueries` refetches every failed query and delegates into each nested\n * hook so their retries fire too. `clearSubmitError` clears the optional submit state and\n * delegates into each nested hook.\n *\n * Pairs with {@link composeSubmitHandler} by name only — this composes error state and\n * recovery, not a submit callback.\n *\n * @param sources - Error sources to merge. Each entry is either a React Query result or\n * an object with an `errorHandling` property.\n * @param submitState - Optional screen-level submit state to fold into the result.\n * @returns A single `HookErrorHandling` covering every source.\n * @public\n * @group Form composition\n *\n * @example\n * ```tsx\n * import { composeErrorHandler, useEmployeeDetailsForm } from '@gusto/embedded-react-sdk'\n * import { useEmployeeFormsList } from '@gusto/embedded-api-v-2026-06-15/react-query/employeeFormsList'\n *\n * function EmployeeProfileView({ companyId, employeeId }: { companyId: string; employeeId: string }) {\n * const employeeDetails = useEmployeeDetailsForm({ companyId, employeeId })\n * const formsListQuery = useEmployeeFormsList({ employeeId })\n *\n * const errorHandling = composeErrorHandler([employeeDetails, formsListQuery])\n *\n * if (errorHandling.errors.length > 0) {\n * return (\n * <div role=\"alert\">\n * {errorHandling.errors.map((error, i) => (\n * <p key={i}>{error.message}</p>\n * ))}\n * <button onClick={errorHandling.retryQueries}>Retry</button>\n * </div>\n * )\n * }\n *\n * return null\n * }\n * ```\n */\nexport function composeErrorHandler(\n sources: MixedErrorSource[],\n submitState?: SubmitStateForErrorHandling,\n): HookErrorHandling {\n const queries: QueryWithRefetch[] = []\n const errorHandlingsFromNestedHooks: HookErrorHandling[] = []\n\n for (const source of sources) {\n if (isHookResultWithErrorHandling(source)) {\n errorHandlingsFromNestedHooks.push(source.errorHandling)\n } else {\n queries.push(source)\n }\n }\n\n const nestedErrors = errorHandlingsFromNestedHooks.flatMap(handling => handling.errors)\n\n let errors: SDKError[]\n if (errorHandlingsFromNestedHooks.length === 0) {\n errors = collectErrors(queries, submitState?.submitError ?? null)\n } else {\n const standaloneQueryErrors = collectErrors(queries, null)\n errors = [...nestedErrors, ...standaloneQueryErrors]\n if (submitState?.submitError) {\n errors.push(submitState.submitError)\n }\n }\n\n const retryQueries = () => {\n for (const handling of errorHandlingsFromNestedHooks) {\n handling.retryQueries()\n }\n queries.filter(q => q.error != null).forEach(q => void q.refetch())\n }\n\n const clearSubmitError = () => {\n for (const handling of errorHandlingsFromNestedHooks) {\n handling.clearSubmitError()\n }\n submitState?.setSubmitError(null)\n }\n\n return { errors, retryQueries, clearSubmitError }\n}\n"],"names":["isHookResultWithErrorHandling","source","composeErrorHandler","sources","submitState","queries","errorHandlingsFromNestedHooks","nestedErrors","handling","errors","collectErrors","standaloneQueryErrors","q"],"mappings":";AA0CA,SAASA,EACPC,GACgD;AAChD,SAAO,mBAAmBA;AAC5B;AAoDO,SAASC,EACdC,GACAC,GACmB;AACnB,QAAMC,IAA8B,CAAA,GAC9BC,IAAqD,CAAA;AAE3D,aAAWL,KAAUE;AACnB,IAAIH,EAA8BC,CAAM,IACtCK,EAA8B,KAAKL,EAAO,aAAa,IAEvDI,EAAQ,KAAKJ,CAAM;AAIvB,QAAMM,IAAeD,EAA8B,QAAQ,CAAAE,MAAYA,EAAS,MAAM;AAEtF,MAAIC;AACJ,MAAIH,EAA8B,WAAW;AAC3C,IAAAG,IAASC,EAAcL,GAASD,GAAa,eAAe,IAAI;AAAA,OAC3D;AACL,UAAMO,IAAwBD,EAAcL,GAAS,IAAI;AACzD,IAAAI,IAAS,CAAC,GAAGF,GAAc,GAAGI,CAAqB,GAC/CP,GAAa,eACfK,EAAO,KAAKL,EAAY,WAAW;AAAA,EAEvC;AAgBA,SAAO,EAAE,QAAAK,GAAQ,cAdI,MAAM;AACzB,eAAWD,KAAYF;AACrB,MAAAE,EAAS,aAAA;AAEX,IAAAH,EAAQ,OAAO,CAAAO,MAAKA,EAAE,SAAS,IAAI,EAAE,QAAQ,CAAAA,MAAA;AAAK,MAAKA,EAAE,QAAA;AAAA,KAAS;AAAA,EACpE,GAS+B,kBAPN,MAAM;AAC7B,eAAWJ,KAAYF;AACrB,MAAAE,EAAS,iBAAA;AAEX,IAAAJ,GAAa,eAAe,IAAI;AAAA,EAClC,EAE+B;AACjC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SDKFormProvider.js","sources":["../../../src/partner-hook-utils/form/SDKFormProvider.tsx"],"sourcesContent":["import { type ReactNode, useEffect } from 'react'\nimport type { FieldPath, FieldValues } from 'react-hook-form'\nimport { FormProvider } from 'react-hook-form'\nimport type { FieldMetadata, FieldMetadataWithOptions, HookFormInternals } from '../types'\nimport { FormFieldsMetadataProvider } from './FormFieldsMetadataProvider'\nimport { FieldElementRegistryProvider } from '@/components/Common/Fields/hooks/FieldElementRegistryProvider'\nimport type { FieldElementRegistry } from '@/components/Common/Fields/hooks/fieldElementRegistry'\nimport { normalizeErrorKeyForForm } from '@/helpers/formattedStrings'\nimport type { SDKError, SDKFieldError } from '@/types/sdkError'\n\nfunction useSyncFieldErrors<\n TFormData extends FieldValues,\n TFieldsMetadata extends {\n [K in keyof TFieldsMetadata]: FieldMetadata | FieldMetadataWithOptions\n },\n>(\n fieldErrors: SDKFieldError[],\n form: {\n fieldsMetadata: TFieldsMetadata\n hookFormInternals: HookFormInternals<TFormData>\n },\n) {\n const { fieldsMetadata } = form\n const { setError } = form.hookFormInternals.formMethods\n\n useEffect(() => {\n if (!fieldErrors.length) return\n const knownFields = new Set(Object.keys(fieldsMetadata))\n for (const fieldError of fieldErrors) {\n const normalizedField = normalizeErrorKeyForForm(fieldError.field)\n if (knownFields.has(normalizedField)) {\n setError(normalizedField as FieldPath<TFormData>, {\n type: 'custom',\n message: fieldError.message,\n })\n }\n }\n }, [fieldErrors, setError, fieldsMetadata])\n}\n\n/**\n * Props for {@link SDKFormProvider}.\n *\n * @typeParam TFormData - Shape of the form values managed by the wrapped form hook.\n * @typeParam TFieldsMetadata - The form hook's field-metadata map.\n * @public\n */\nexport interface SDKFormProviderProps<\n TFormData extends FieldValues = FieldValues,\n TFieldsMetadata extends {\n [K in keyof TFieldsMetadata]: FieldMetadata | FieldMetadataWithOptions\n } = Record<string, FieldMetadata | FieldMetadataWithOptions>,\n> {\n /** The form hook result whose fields, metadata, and errors are shared with descendant field components. */\n formHookResult: {\n errorHandling: { errors: SDKError[] }\n form: {\n fieldsMetadata: TFieldsMetadata\n hookFormInternals: HookFormInternals<TFormData>\n }\n }\n /** Field components (or any content) that consume the provided form context. */\n children: ReactNode\n}\n\n/**\n * Provides form context to field components so they can read metadata, control,\n * and error state without an explicit `formHookResult` prop on each field.\n * Server-side field errors are automatically synced onto their corresponding fields.\n *\n * @public\n *\n * @example\n * ```tsx\n * const formHookResult = useEmployeeDetailsForm({ employeeId })\n * const { Fields } = formHookResult.form\n *\n * // SDKFormProvider supplies context only — wire up submission and render the\n * // <form> element yourself.\n * const handleSubmit = () =>\n * formHookResult.actions.onSubmit({ onEmployeeUpdated: (emp) => { ... } })\n *\n * return (\n * <SDKFormProvider formHookResult={formHookResult}>\n * <form onSubmit={handleSubmit}>\n * <Fields.FirstName label=\"First name\" />\n * <Fields.LastName label=\"Last name\" />\n * <button type=\"submit\">Save</button>\n * </form>\n * </SDKFormProvider>\n * )\n * ```\n */\nexport function SDKFormProvider<\n TFormData extends FieldValues = FieldValues,\n TFieldsMetadata extends {\n [K in keyof TFieldsMetadata]: FieldMetadata | FieldMetadataWithOptions\n } = Record<string, FieldMetadata | FieldMetadataWithOptions>,\n>({ formHookResult, children }: SDKFormProviderProps<TFormData, TFieldsMetadata>) {\n const { errorHandling, form } = formHookResult\n const allFieldErrors = errorHandling.errors.flatMap(e => e.fieldErrors)\n useSyncFieldErrors(allFieldErrors, form)\n\n return (\n <FormFieldsMetadataProvider metadata={form.fieldsMetadata} errors={errorHandling.errors}>\n <FieldElementRegistryProvider\n registry={form.hookFormInternals._fieldElementRegistry as FieldElementRegistry | undefined}\n >\n <FormProvider {...form.hookFormInternals.formMethods}>{children}</FormProvider>\n </FieldElementRegistryProvider>\n </FormFieldsMetadataProvider>\n )\n}\n"],"names":["useSyncFieldErrors","fieldErrors","form","fieldsMetadata","setError","useEffect","knownFields","fieldError","normalizedField","normalizeErrorKeyForForm","SDKFormProvider","formHookResult","children","errorHandling","allFieldErrors","e","FormFieldsMetadataProvider","jsx","FieldElementRegistryProvider","FormProvider"],"mappings":";;;;;;AAUA,SAASA,EAMPC,GACAC,GAIA;AACA,QAAM,EAAE,gBAAAC,MAAmBD,GACrB,EAAE,UAAAE,EAAA,IAAaF,EAAK,kBAAkB;AAE5C,EAAAG,EAAU,MAAM;AACd,QAAI,CAACJ,EAAY,OAAQ;AACzB,UAAMK,IAAc,IAAI,IAAI,OAAO,KAAKH,CAAc,CAAC;AACvD,eAAWI,KAAcN,GAAa;AACpC,YAAMO,IAAkBC,EAAyBF,EAAW,KAAK;AACjE,MAAID,EAAY,IAAIE,CAAe,KACjCJ,EAASI,GAAyC;AAAA,QAChD,MAAM;AAAA,QACN,SAASD,EAAW;AAAA,MAAA,CACrB;AAAA,IAEL;AAAA,EACF,GAAG,CAACN,GAAaG,GAAUD,CAAc,CAAC;AAC5C;
|
|
1
|
+
{"version":3,"file":"SDKFormProvider.js","sources":["../../../src/partner-hook-utils/form/SDKFormProvider.tsx"],"sourcesContent":["import { type ReactNode, useEffect } from 'react'\nimport type { FieldPath, FieldValues } from 'react-hook-form'\nimport { FormProvider } from 'react-hook-form'\nimport type { FieldMetadata, FieldMetadataWithOptions, HookFormInternals } from '../types'\nimport { FormFieldsMetadataProvider } from './FormFieldsMetadataProvider'\nimport { FieldElementRegistryProvider } from '@/components/Common/Fields/hooks/FieldElementRegistryProvider'\nimport type { FieldElementRegistry } from '@/components/Common/Fields/hooks/fieldElementRegistry'\nimport { normalizeErrorKeyForForm } from '@/helpers/formattedStrings'\nimport type { SDKError, SDKFieldError } from '@/types/sdkError'\n\nfunction useSyncFieldErrors<\n TFormData extends FieldValues,\n TFieldsMetadata extends {\n [K in keyof TFieldsMetadata]: FieldMetadata | FieldMetadataWithOptions\n },\n>(\n fieldErrors: SDKFieldError[],\n form: {\n fieldsMetadata: TFieldsMetadata\n hookFormInternals: HookFormInternals<TFormData>\n },\n) {\n const { fieldsMetadata } = form\n const { setError } = form.hookFormInternals.formMethods\n\n useEffect(() => {\n if (!fieldErrors.length) return\n const knownFields = new Set(Object.keys(fieldsMetadata))\n for (const fieldError of fieldErrors) {\n const normalizedField = normalizeErrorKeyForForm(fieldError.field)\n if (knownFields.has(normalizedField)) {\n setError(normalizedField as FieldPath<TFormData>, {\n type: 'custom',\n message: fieldError.message,\n })\n }\n }\n }, [fieldErrors, setError, fieldsMetadata])\n}\n\n/**\n * Props for {@link SDKFormProvider}.\n *\n * @typeParam TFormData - Shape of the form values managed by the wrapped form hook.\n * @typeParam TFieldsMetadata - The form hook's field-metadata map.\n * @public\n */\nexport interface SDKFormProviderProps<\n TFormData extends FieldValues = FieldValues,\n TFieldsMetadata extends {\n [K in keyof TFieldsMetadata]: FieldMetadata | FieldMetadataWithOptions\n } = Record<string, FieldMetadata | FieldMetadataWithOptions>,\n> {\n /** The form hook result whose fields, metadata, and errors are shared with descendant field components. */\n formHookResult: {\n errorHandling: { errors: SDKError[] }\n form: {\n fieldsMetadata: TFieldsMetadata\n hookFormInternals: HookFormInternals<TFormData>\n }\n }\n /** Field components (or any content) that consume the provided form context. */\n children: ReactNode\n}\n\n/**\n * Provides form context to field components so they can read metadata, control,\n * and error state without an explicit `formHookResult` prop on each field.\n * Server-side field errors are automatically synced onto their corresponding fields.\n *\n * @public\n * @group Providers\n *\n * @example\n * ```tsx\n * const formHookResult = useEmployeeDetailsForm({ employeeId })\n * const { Fields } = formHookResult.form\n *\n * // SDKFormProvider supplies context only — wire up submission and render the\n * // <form> element yourself.\n * const handleSubmit = () =>\n * formHookResult.actions.onSubmit({ onEmployeeUpdated: (emp) => { ... } })\n *\n * return (\n * <SDKFormProvider formHookResult={formHookResult}>\n * <form onSubmit={handleSubmit}>\n * <Fields.FirstName label=\"First name\" />\n * <Fields.LastName label=\"Last name\" />\n * <button type=\"submit\">Save</button>\n * </form>\n * </SDKFormProvider>\n * )\n * ```\n */\nexport function SDKFormProvider<\n TFormData extends FieldValues = FieldValues,\n TFieldsMetadata extends {\n [K in keyof TFieldsMetadata]: FieldMetadata | FieldMetadataWithOptions\n } = Record<string, FieldMetadata | FieldMetadataWithOptions>,\n>({ formHookResult, children }: SDKFormProviderProps<TFormData, TFieldsMetadata>) {\n const { errorHandling, form } = formHookResult\n const allFieldErrors = errorHandling.errors.flatMap(e => e.fieldErrors)\n useSyncFieldErrors(allFieldErrors, form)\n\n return (\n <FormFieldsMetadataProvider metadata={form.fieldsMetadata} errors={errorHandling.errors}>\n <FieldElementRegistryProvider\n registry={form.hookFormInternals._fieldElementRegistry as FieldElementRegistry | undefined}\n >\n <FormProvider {...form.hookFormInternals.formMethods}>{children}</FormProvider>\n </FieldElementRegistryProvider>\n </FormFieldsMetadataProvider>\n )\n}\n"],"names":["useSyncFieldErrors","fieldErrors","form","fieldsMetadata","setError","useEffect","knownFields","fieldError","normalizedField","normalizeErrorKeyForForm","SDKFormProvider","formHookResult","children","errorHandling","allFieldErrors","e","FormFieldsMetadataProvider","jsx","FieldElementRegistryProvider","FormProvider"],"mappings":";;;;;;AAUA,SAASA,EAMPC,GACAC,GAIA;AACA,QAAM,EAAE,gBAAAC,MAAmBD,GACrB,EAAE,UAAAE,EAAA,IAAaF,EAAK,kBAAkB;AAE5C,EAAAG,EAAU,MAAM;AACd,QAAI,CAACJ,EAAY,OAAQ;AACzB,UAAMK,IAAc,IAAI,IAAI,OAAO,KAAKH,CAAc,CAAC;AACvD,eAAWI,KAAcN,GAAa;AACpC,YAAMO,IAAkBC,EAAyBF,EAAW,KAAK;AACjE,MAAID,EAAY,IAAIE,CAAe,KACjCJ,EAASI,GAAyC;AAAA,QAChD,MAAM;AAAA,QACN,SAASD,EAAW;AAAA,MAAA,CACrB;AAAA,IAEL;AAAA,EACF,GAAG,CAACN,GAAaG,GAAUD,CAAc,CAAC;AAC5C;AAwDO,SAASO,EAKd,EAAE,gBAAAC,GAAgB,UAAAC,KAA8D;AAChF,QAAM,EAAE,eAAAC,GAAe,MAAAX,EAAA,IAASS,GAC1BG,IAAiBD,EAAc,OAAO,QAAQ,CAAAE,MAAKA,EAAE,WAAW;AACtE,SAAAf,EAAmBc,GAAgBZ,CAAI,qBAGpCc,GAAA,EAA2B,UAAUd,EAAK,gBAAgB,QAAQW,EAAc,QAC/E,UAAA,gBAAAI;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,UAAUhB,EAAK,kBAAkB;AAAA,MAEjC,4BAACiB,GAAA,EAAc,GAAGjB,EAAK,kBAAkB,aAAc,UAAAU,EAAA,CAAS;AAAA,IAAA;AAAA,EAAA,GAEpE;AAEJ;"}
|
|
@@ -12,6 +12,7 @@ import { HookErrorHandling, HookFormInternals } from '../types';
|
|
|
12
12
|
* the form's generic.
|
|
13
13
|
*
|
|
14
14
|
* @public
|
|
15
|
+
* @childOf {@link composeSubmitHandler}
|
|
15
16
|
*/
|
|
16
17
|
export interface ComposableFormHookResult {
|
|
17
18
|
/** The form surface: the react-hook-form internals used to validate and focus fields. */
|
|
@@ -40,6 +41,7 @@ export interface ComposableFormHookResult {
|
|
|
40
41
|
*
|
|
41
42
|
* @typeParam T - The shape of the form values when a raw `UseFormReturn` is passed.
|
|
42
43
|
* @public
|
|
44
|
+
* @childOf {@link composeSubmitHandler}
|
|
43
45
|
*/
|
|
44
46
|
export type ComposeSubmitInput<T extends FieldValues = FieldValues> = ComposableFormHookResult | UseFormReturn<T>;
|
|
45
47
|
/**
|
|
@@ -47,6 +49,7 @@ export type ComposeSubmitInput<T extends FieldValues = FieldValues> = Composable
|
|
|
47
49
|
* coordinates validation across the composed forms, and aggregated error state.
|
|
48
50
|
*
|
|
49
51
|
* @public
|
|
52
|
+
* @childOf {@link composeSubmitHandler}
|
|
50
53
|
*/
|
|
51
54
|
export interface ComposeSubmitHandlerResult {
|
|
52
55
|
/** Submit handler to pass to a form's `onSubmit`. Validates all composed forms before calling `onAllValid`. */
|
|
@@ -79,6 +82,7 @@ export interface ComposeSubmitHandlerResult {
|
|
|
79
82
|
* @param onAllValid - Async callback invoked once every form has passed validation.
|
|
80
83
|
* @returns A {@link ComposeSubmitHandlerResult} with a unified `handleSubmit` and aggregated `errorHandling`.
|
|
81
84
|
* @public
|
|
85
|
+
* @group Form composition
|
|
82
86
|
*
|
|
83
87
|
* @example
|
|
84
88
|
* ```tsx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composeSubmitHandler.js","sources":["../../../src/partner-hook-utils/form/composeSubmitHandler.ts"],"sourcesContent":["import type { SyntheticEvent } from 'react'\nimport type { FieldValues, UseFormReturn } from 'react-hook-form'\nimport { composeErrorHandler } from '../composeErrorHandler'\nimport type { HookErrorHandling, HookFormInternals } from '../types'\nimport type { FieldElementRegistry } from '@/components/Common/Fields/hooks/fieldElementRegistry'\n\n/**\n * Minimal shape required for a form hook result to participate in `composeSubmitHandler`.\n * Any hook returning `BaseFormHookReady` satisfies this interface.\n *\n * `formMethods` is declared with method-call syntax (rather than reused from\n * `HookFormInternals`) so TypeScript applies bivariant parameter checking,\n * allowing hooks with specific form data generics to be passed without casts.\n * `_fieldElementRegistry` is reused directly since its type doesn't depend on\n * the form's generic.\n *\n * @public\n */\nexport interface ComposableFormHookResult {\n /** The form surface: the react-hook-form internals used to validate and focus fields. */\n form: {\n hookFormInternals: Pick<HookFormInternals, '_fieldElementRegistry'> & {\n formMethods: {\n handleSubmit(\n onValid: () => void,\n onInvalid?: (errors: Record<string, unknown>) => void,\n ): () => Promise<void>\n setFocus(name: string): void\n formState: { errors: Record<string, unknown> }\n }\n }\n }\n /** The error-handling surface aggregated across the composed forms. */\n errorHandling: HookErrorHandling\n}\n\n/**\n * Accepted input for a single slot of `composeSubmitHandler`'s `forms` array.\n *\n * @remarks\n * - SDK form hook results (anything matching `ComposableFormHookResult`) are composed directly.\n * - A raw `react-hook-form` `UseFormReturn<T>` is supported for screen-local auxiliary forms\n * that don't warrant a dedicated SDK hook. Raw forms contribute validation/focus behavior\n * but no `errorHandling` (fields surface their own inline errors via react-hook-form).\n *\n * @typeParam T - The shape of the form values when a raw `UseFormReturn` is passed.\n * @public\n */\nexport type ComposeSubmitInput<T extends FieldValues = FieldValues> =\n ComposableFormHookResult | UseFormReturn<T>\n\ninterface FormValidationResult {\n input: ComposeSubmitInput\n formMethods: FormMethods\n valid: boolean\n errors: Record<string, unknown>\n}\n\n/**\n * Result returned by {@link composeSubmitHandler}: a single submit handler that\n * coordinates validation across the composed forms, and aggregated error state.\n *\n * @public\n */\nexport interface ComposeSubmitHandlerResult {\n /** Submit handler to pass to a form's `onSubmit`. Validates all composed forms before calling `onAllValid`. */\n handleSubmit: (e: SyntheticEvent) => Promise<void>\n /** Aggregated error state across all composed SDK form hooks. Pass to {@link composeErrorHandler} for screen-level error surfaces. */\n errorHandling: HookErrorHandling\n}\n\ntype FormMethods = ComposableFormHookResult['form']['hookFormInternals']['formMethods']\n\nfunction isRawUseForm<T extends FieldValues>(\n input: ComposeSubmitInput<T>,\n): input is UseFormReturn<T> {\n return 'handleSubmit' in input && typeof input.handleSubmit === 'function'\n}\n\nfunction extractFormMethods<T extends FieldValues>(input: ComposeSubmitInput<T>): FormMethods {\n if (isRawUseForm(input)) return input as unknown as FormMethods\n return input.form.hookFormInternals.formMethods\n}\n\n/**\n * Picks the visually first invalid field across all composed forms using live\n * `getBoundingClientRect()` positions, then focuses its DOM element. Falls back\n * to array-order (first form's first error) when no element can be resolved —\n * raw `UseFormReturn` inputs have no registry, and forms rendered without\n * `SDKFormProvider` or a HookField wrapper won't have their fields registered\n * either, so we let react-hook-form's `setFocus` attempt it instead.\n *\n * Consumes `results` (captured from each form's `onInvalid` callback) rather\n * than reading `formState.errors` — the latter is a proxy that returns `{}`\n * when accessed outside a component subscription.\n */\nfunction focusFirstInvalidAcrossForms(results: FormValidationResult[]): void {\n type Candidate = {\n formMethods: FormMethods\n name: string\n element: HTMLElement\n }\n const candidates: Candidate[] = []\n for (const { input, formMethods, errors } of results) {\n if (isRawUseForm(input)) continue\n const registry = input.form.hookFormInternals._fieldElementRegistry as\n FieldElementRegistry | undefined\n if (!registry) continue\n for (const name of Object.keys(errors)) {\n const element = registry.get(name)\n if (element) {\n candidates.push({ formMethods, name, element })\n }\n }\n }\n\n if (candidates.length > 0) {\n candidates.sort((a, b) => {\n const ar = a.element.getBoundingClientRect()\n const br = b.element.getBoundingClientRect()\n return ar.top - br.top || ar.left - br.left\n })\n const winner = candidates[0]!\n // Focus the DOM element directly. Bypasses react-hook-form's `setFocus`,\n // which depends on `_fields[name]._f.ref` and isn't reliably populated\n // when fields are rendered through libraries like react-aria-components.\n winner.element.focus()\n return\n }\n\n for (const { formMethods, errors } of results) {\n const firstErrorField = Object.keys(errors)[0]\n if (firstErrorField) {\n formMethods.setFocus(firstErrorField)\n return\n }\n }\n}\n\n/**\n * Coordinates validation and submission across multiple form hooks on the same page.\n *\n * @remarks\n * Validates all forms simultaneously via `handleSubmit()`, then focuses the visually first\n * invalid field across all forms (sorted by `getBoundingClientRect()`). Only calls\n * `onAllValid` when every form passes.\n *\n * Uses `handleSubmit` rather than `trigger` so that react-hook-form sets\n * `formState.isSubmitted = true`, which enables `reValidateMode` (default: `onChange`).\n * Without this, errors set by manual `trigger()` calls would never clear as the user types.\n *\n * Each hook passed to `forms` should be initialized with `shouldFocusError: false` so that\n * react-hook-form's built-in per-form focus is disabled and `composeSubmitHandler` can manage\n * cross-form focus instead.\n *\n * The returned `errorHandling` is the same shape every SDK hook returns, so the whole result\n * can be passed back into {@link composeErrorHandler} when you need to add extra\n * `@gusto/embedded-api-v-2026-06-15` queries or screen-level submit state.\n *\n * @typeParam TForms - Tuple of form value shapes, one per slot of `forms`.\n * @param forms - Form hook results and/or raw `UseFormReturn` instances to coordinate.\n * @param onAllValid - Async callback invoked once every form has passed validation.\n * @returns A {@link ComposeSubmitHandlerResult} with a unified `handleSubmit` and aggregated `errorHandling`.\n * @public\n *\n * @example\n * ```tsx\n * const detailsForm = useEmployeeDetailsForm({ employeeId, shouldFocusError: false })\n * const addressForm = useHomeAddressForm({ employeeId, shouldFocusError: false })\n *\n * const { handleSubmit, errorHandling } = composeSubmitHandler(\n * [detailsForm, addressForm],\n * async () => {\n * await detailsForm.actions.onSubmit()\n * await addressForm.actions.onSubmit()\n * },\n * )\n *\n * return <form onSubmit={handleSubmit}>...</form>\n * ```\n */\nexport function composeSubmitHandler<TForms extends readonly FieldValues[]>(\n forms: readonly [...{ [K in keyof TForms]: ComposeSubmitInput<TForms[K]> }],\n onAllValid: () => Promise<void>,\n): ComposeSubmitHandlerResult {\n const errorSources = forms.filter((form): form is ComposableFormHookResult => !isRawUseForm(form))\n\n const handleSubmit = async (e: SyntheticEvent) => {\n e.preventDefault()\n\n const validationResults = await Promise.all(\n forms.map(\n input =>\n new Promise<FormValidationResult>(resolve => {\n const formMethods = extractFormMethods(input)\n void formMethods.handleSubmit(\n () => {\n resolve({ input, formMethods, valid: true, errors: {} })\n },\n errors => {\n resolve({ input, formMethods, valid: false, errors })\n },\n )()\n }),\n ),\n )\n\n const allValid = validationResults.every(r => r.valid)\n\n if (!allValid) {\n focusFirstInvalidAcrossForms(validationResults)\n return\n }\n\n await onAllValid()\n }\n\n const errorHandling = composeErrorHandler(errorSources)\n\n return { handleSubmit, errorHandling }\n}\n"],"names":["isRawUseForm","input","extractFormMethods","focusFirstInvalidAcrossForms","results","candidates","formMethods","errors","registry","name","element","a","b","ar","br","firstErrorField","composeSubmitHandler","forms","onAllValid","errorSources","form","handleSubmit","e","validationResults","resolve","r","errorHandling","composeErrorHandler"],"mappings":";AAyEA,SAASA,EACPC,GAC2B;AAC3B,SAAO,kBAAkBA,KAAS,OAAOA,EAAM,gBAAiB;AAClE;AAEA,SAASC,EAA0CD,GAA2C;AAC5F,SAAID,EAAaC,CAAK,IAAUA,IACzBA,EAAM,KAAK,kBAAkB;AACtC;AAcA,SAASE,EAA6BC,GAAuC;AAM3E,QAAMC,IAA0B,CAAA;AAChC,aAAW,EAAE,OAAAJ,GAAO,aAAAK,GAAa,QAAAC,EAAA,KAAYH,GAAS;AACpD,QAAIJ,EAAaC,CAAK,EAAG;AACzB,UAAMO,IAAWP,EAAM,KAAK,kBAAkB;AAE9C,QAAKO;AACL,iBAAWC,KAAQ,OAAO,KAAKF,CAAM,GAAG;AACtC,cAAMG,IAAUF,EAAS,IAAIC,CAAI;AACjC,QAAIC,KACFL,EAAW,KAAK,EAAE,aAAAC,GAAa,MAAAG,GAAM,SAAAC,GAAS;AAAA,MAElD;AAAA,EACF;AAEA,MAAIL,EAAW,SAAS,GAAG;AACzB,IAAAA,EAAW,KAAK,CAACM,GAAGC,MAAM;AACxB,YAAMC,IAAKF,EAAE,QAAQ,sBAAA,GACfG,IAAKF,EAAE,QAAQ,sBAAA;AACrB,aAAOC,EAAG,MAAMC,EAAG,OAAOD,EAAG,OAAOC,EAAG;AAAA,IACzC,CAAC,GACcT,EAAW,CAAC,EAIpB,QAAQ,MAAA;AACf;AAAA,EACF;AAEA,aAAW,EAAE,aAAAC,GAAa,QAAAC,EAAA,KAAYH,GAAS;AAC7C,UAAMW,IAAkB,OAAO,KAAKR,CAAM,EAAE,CAAC;AAC7C,QAAIQ,GAAiB;AACnB,MAAAT,EAAY,SAASS,CAAe;AACpC;AAAA,IACF;AAAA,EACF;AACF;AA4CO,SAASC,EACdC,GACAC,GAC4B;AAC5B,QAAMC,IAAeF,EAAM,OAAO,CAACG,MAA2C,CAACpB,EAAaoB,CAAI,CAAC,GAE3FC,IAAe,OAAOC,MAAsB;AAChD,IAAAA,EAAE,eAAA;AAEF,UAAMC,IAAoB,MAAM,QAAQ;AAAA,MACtCN,EAAM;AAAA,QACJ,CAAAhB,MACE,IAAI,QAA8B,CAAAuB,MAAW;AAC3C,gBAAMlB,IAAcJ,EAAmBD,CAAK;AAC5C,UAAKK,EAAY;AAAA,YACf,MAAM;AACJ,cAAAkB,EAAQ,EAAE,OAAAvB,GAAO,aAAAK,GAAa,OAAO,IAAM,QAAQ,CAAA,GAAI;AAAA,YACzD;AAAA,YACA,CAAAC,MAAU;AACR,cAAAiB,EAAQ,EAAE,OAAAvB,GAAO,aAAAK,GAAa,OAAO,IAAO,QAAAC,GAAQ;AAAA,YACtD;AAAA,UAAA,EACF;AAAA,QACF,CAAC;AAAA,MAAA;AAAA,IACL;AAKF,QAAI,CAFagB,EAAkB,MAAM,CAAAE,MAAKA,EAAE,KAAK,GAEtC;AACb,MAAAtB,EAA6BoB,CAAiB;AAC9C;AAAA,IACF;AAEA,UAAML,EAAA;AAAA,EACR,GAEMQ,IAAgBC,EAAoBR,CAAY;AAEtD,SAAO,EAAE,cAAAE,GAAc,eAAAK,EAAA;AACzB;"}
|
|
1
|
+
{"version":3,"file":"composeSubmitHandler.js","sources":["../../../src/partner-hook-utils/form/composeSubmitHandler.ts"],"sourcesContent":["import type { SyntheticEvent } from 'react'\nimport type { FieldValues, UseFormReturn } from 'react-hook-form'\nimport { composeErrorHandler } from '../composeErrorHandler'\nimport type { HookErrorHandling, HookFormInternals } from '../types'\nimport type { FieldElementRegistry } from '@/components/Common/Fields/hooks/fieldElementRegistry'\n\n/**\n * Minimal shape required for a form hook result to participate in `composeSubmitHandler`.\n * Any hook returning `BaseFormHookReady` satisfies this interface.\n *\n * `formMethods` is declared with method-call syntax (rather than reused from\n * `HookFormInternals`) so TypeScript applies bivariant parameter checking,\n * allowing hooks with specific form data generics to be passed without casts.\n * `_fieldElementRegistry` is reused directly since its type doesn't depend on\n * the form's generic.\n *\n * @public\n * @childOf {@link composeSubmitHandler}\n */\nexport interface ComposableFormHookResult {\n /** The form surface: the react-hook-form internals used to validate and focus fields. */\n form: {\n hookFormInternals: Pick<HookFormInternals, '_fieldElementRegistry'> & {\n formMethods: {\n handleSubmit(\n onValid: () => void,\n onInvalid?: (errors: Record<string, unknown>) => void,\n ): () => Promise<void>\n setFocus(name: string): void\n formState: { errors: Record<string, unknown> }\n }\n }\n }\n /** The error-handling surface aggregated across the composed forms. */\n errorHandling: HookErrorHandling\n}\n\n/**\n * Accepted input for a single slot of `composeSubmitHandler`'s `forms` array.\n *\n * @remarks\n * - SDK form hook results (anything matching `ComposableFormHookResult`) are composed directly.\n * - A raw `react-hook-form` `UseFormReturn<T>` is supported for screen-local auxiliary forms\n * that don't warrant a dedicated SDK hook. Raw forms contribute validation/focus behavior\n * but no `errorHandling` (fields surface their own inline errors via react-hook-form).\n *\n * @typeParam T - The shape of the form values when a raw `UseFormReturn` is passed.\n * @public\n * @childOf {@link composeSubmitHandler}\n */\nexport type ComposeSubmitInput<T extends FieldValues = FieldValues> =\n ComposableFormHookResult | UseFormReturn<T>\n\ninterface FormValidationResult {\n input: ComposeSubmitInput\n formMethods: FormMethods\n valid: boolean\n errors: Record<string, unknown>\n}\n\n/**\n * Result returned by {@link composeSubmitHandler}: a single submit handler that\n * coordinates validation across the composed forms, and aggregated error state.\n *\n * @public\n * @childOf {@link composeSubmitHandler}\n */\nexport interface ComposeSubmitHandlerResult {\n /** Submit handler to pass to a form's `onSubmit`. Validates all composed forms before calling `onAllValid`. */\n handleSubmit: (e: SyntheticEvent) => Promise<void>\n /** Aggregated error state across all composed SDK form hooks. Pass to {@link composeErrorHandler} for screen-level error surfaces. */\n errorHandling: HookErrorHandling\n}\n\ntype FormMethods = ComposableFormHookResult['form']['hookFormInternals']['formMethods']\n\nfunction isRawUseForm<T extends FieldValues>(\n input: ComposeSubmitInput<T>,\n): input is UseFormReturn<T> {\n return 'handleSubmit' in input && typeof input.handleSubmit === 'function'\n}\n\nfunction extractFormMethods<T extends FieldValues>(input: ComposeSubmitInput<T>): FormMethods {\n if (isRawUseForm(input)) return input as unknown as FormMethods\n return input.form.hookFormInternals.formMethods\n}\n\n/**\n * Picks the visually first invalid field across all composed forms using live\n * `getBoundingClientRect()` positions, then focuses its DOM element. Falls back\n * to array-order (first form's first error) when no element can be resolved —\n * raw `UseFormReturn` inputs have no registry, and forms rendered without\n * `SDKFormProvider` or a HookField wrapper won't have their fields registered\n * either, so we let react-hook-form's `setFocus` attempt it instead.\n *\n * Consumes `results` (captured from each form's `onInvalid` callback) rather\n * than reading `formState.errors` — the latter is a proxy that returns `{}`\n * when accessed outside a component subscription.\n */\nfunction focusFirstInvalidAcrossForms(results: FormValidationResult[]): void {\n type Candidate = {\n formMethods: FormMethods\n name: string\n element: HTMLElement\n }\n const candidates: Candidate[] = []\n for (const { input, formMethods, errors } of results) {\n if (isRawUseForm(input)) continue\n const registry = input.form.hookFormInternals._fieldElementRegistry as\n FieldElementRegistry | undefined\n if (!registry) continue\n for (const name of Object.keys(errors)) {\n const element = registry.get(name)\n if (element) {\n candidates.push({ formMethods, name, element })\n }\n }\n }\n\n if (candidates.length > 0) {\n candidates.sort((a, b) => {\n const ar = a.element.getBoundingClientRect()\n const br = b.element.getBoundingClientRect()\n return ar.top - br.top || ar.left - br.left\n })\n const winner = candidates[0]!\n // Focus the DOM element directly. Bypasses react-hook-form's `setFocus`,\n // which depends on `_fields[name]._f.ref` and isn't reliably populated\n // when fields are rendered through libraries like react-aria-components.\n winner.element.focus()\n return\n }\n\n for (const { formMethods, errors } of results) {\n const firstErrorField = Object.keys(errors)[0]\n if (firstErrorField) {\n formMethods.setFocus(firstErrorField)\n return\n }\n }\n}\n\n/**\n * Coordinates validation and submission across multiple form hooks on the same page.\n *\n * @remarks\n * Validates all forms simultaneously via `handleSubmit()`, then focuses the visually first\n * invalid field across all forms (sorted by `getBoundingClientRect()`). Only calls\n * `onAllValid` when every form passes.\n *\n * Uses `handleSubmit` rather than `trigger` so that react-hook-form sets\n * `formState.isSubmitted = true`, which enables `reValidateMode` (default: `onChange`).\n * Without this, errors set by manual `trigger()` calls would never clear as the user types.\n *\n * Each hook passed to `forms` should be initialized with `shouldFocusError: false` so that\n * react-hook-form's built-in per-form focus is disabled and `composeSubmitHandler` can manage\n * cross-form focus instead.\n *\n * The returned `errorHandling` is the same shape every SDK hook returns, so the whole result\n * can be passed back into {@link composeErrorHandler} when you need to add extra\n * `@gusto/embedded-api-v-2026-06-15` queries or screen-level submit state.\n *\n * @typeParam TForms - Tuple of form value shapes, one per slot of `forms`.\n * @param forms - Form hook results and/or raw `UseFormReturn` instances to coordinate.\n * @param onAllValid - Async callback invoked once every form has passed validation.\n * @returns A {@link ComposeSubmitHandlerResult} with a unified `handleSubmit` and aggregated `errorHandling`.\n * @public\n * @group Form composition\n *\n * @example\n * ```tsx\n * const detailsForm = useEmployeeDetailsForm({ employeeId, shouldFocusError: false })\n * const addressForm = useHomeAddressForm({ employeeId, shouldFocusError: false })\n *\n * const { handleSubmit, errorHandling } = composeSubmitHandler(\n * [detailsForm, addressForm],\n * async () => {\n * await detailsForm.actions.onSubmit()\n * await addressForm.actions.onSubmit()\n * },\n * )\n *\n * return <form onSubmit={handleSubmit}>...</form>\n * ```\n */\nexport function composeSubmitHandler<TForms extends readonly FieldValues[]>(\n forms: readonly [...{ [K in keyof TForms]: ComposeSubmitInput<TForms[K]> }],\n onAllValid: () => Promise<void>,\n): ComposeSubmitHandlerResult {\n const errorSources = forms.filter((form): form is ComposableFormHookResult => !isRawUseForm(form))\n\n const handleSubmit = async (e: SyntheticEvent) => {\n e.preventDefault()\n\n const validationResults = await Promise.all(\n forms.map(\n input =>\n new Promise<FormValidationResult>(resolve => {\n const formMethods = extractFormMethods(input)\n void formMethods.handleSubmit(\n () => {\n resolve({ input, formMethods, valid: true, errors: {} })\n },\n errors => {\n resolve({ input, formMethods, valid: false, errors })\n },\n )()\n }),\n ),\n )\n\n const allValid = validationResults.every(r => r.valid)\n\n if (!allValid) {\n focusFirstInvalidAcrossForms(validationResults)\n return\n }\n\n await onAllValid()\n }\n\n const errorHandling = composeErrorHandler(errorSources)\n\n return { handleSubmit, errorHandling }\n}\n"],"names":["isRawUseForm","input","extractFormMethods","focusFirstInvalidAcrossForms","results","candidates","formMethods","errors","registry","name","element","a","b","ar","br","firstErrorField","composeSubmitHandler","forms","onAllValid","errorSources","form","handleSubmit","e","validationResults","resolve","r","errorHandling","composeErrorHandler"],"mappings":";AA4EA,SAASA,EACPC,GAC2B;AAC3B,SAAO,kBAAkBA,KAAS,OAAOA,EAAM,gBAAiB;AAClE;AAEA,SAASC,EAA0CD,GAA2C;AAC5F,SAAID,EAAaC,CAAK,IAAUA,IACzBA,EAAM,KAAK,kBAAkB;AACtC;AAcA,SAASE,EAA6BC,GAAuC;AAM3E,QAAMC,IAA0B,CAAA;AAChC,aAAW,EAAE,OAAAJ,GAAO,aAAAK,GAAa,QAAAC,EAAA,KAAYH,GAAS;AACpD,QAAIJ,EAAaC,CAAK,EAAG;AACzB,UAAMO,IAAWP,EAAM,KAAK,kBAAkB;AAE9C,QAAKO;AACL,iBAAWC,KAAQ,OAAO,KAAKF,CAAM,GAAG;AACtC,cAAMG,IAAUF,EAAS,IAAIC,CAAI;AACjC,QAAIC,KACFL,EAAW,KAAK,EAAE,aAAAC,GAAa,MAAAG,GAAM,SAAAC,GAAS;AAAA,MAElD;AAAA,EACF;AAEA,MAAIL,EAAW,SAAS,GAAG;AACzB,IAAAA,EAAW,KAAK,CAACM,GAAGC,MAAM;AACxB,YAAMC,IAAKF,EAAE,QAAQ,sBAAA,GACfG,IAAKF,EAAE,QAAQ,sBAAA;AACrB,aAAOC,EAAG,MAAMC,EAAG,OAAOD,EAAG,OAAOC,EAAG;AAAA,IACzC,CAAC,GACcT,EAAW,CAAC,EAIpB,QAAQ,MAAA;AACf;AAAA,EACF;AAEA,aAAW,EAAE,aAAAC,GAAa,QAAAC,EAAA,KAAYH,GAAS;AAC7C,UAAMW,IAAkB,OAAO,KAAKR,CAAM,EAAE,CAAC;AAC7C,QAAIQ,GAAiB;AACnB,MAAAT,EAAY,SAASS,CAAe;AACpC;AAAA,IACF;AAAA,EACF;AACF;AA6CO,SAASC,EACdC,GACAC,GAC4B;AAC5B,QAAMC,IAAeF,EAAM,OAAO,CAACG,MAA2C,CAACpB,EAAaoB,CAAI,CAAC,GAE3FC,IAAe,OAAOC,MAAsB;AAChD,IAAAA,EAAE,eAAA;AAEF,UAAMC,IAAoB,MAAM,QAAQ;AAAA,MACtCN,EAAM;AAAA,QACJ,CAAAhB,MACE,IAAI,QAA8B,CAAAuB,MAAW;AAC3C,gBAAMlB,IAAcJ,EAAmBD,CAAK;AAC5C,UAAKK,EAAY;AAAA,YACf,MAAM;AACJ,cAAAkB,EAAQ,EAAE,OAAAvB,GAAO,aAAAK,GAAa,OAAO,IAAM,QAAQ,CAAA,GAAI;AAAA,YACzD;AAAA,YACA,CAAAC,MAAU;AACR,cAAAiB,EAAQ,EAAE,OAAAvB,GAAO,aAAAK,GAAa,OAAO,IAAO,QAAAC,GAAQ;AAAA,YACtD;AAAA,UAAA,EACF;AAAA,QACF,CAAC;AAAA,MAAA;AAAA,IACL;AAKF,QAAI,CAFagB,EAAkB,MAAM,CAAAE,MAAKA,EAAE,KAAK,GAEtC;AACb,MAAAtB,EAA6BoB,CAAiB;AAC9C;AAAA,IACF;AAEA,UAAML,EAAA;AAAA,EACR,GAEMQ,IAAgBC,EAAoBR,CAAY;AAEtD,SAAO,EAAE,cAAAE,GAAc,eAAAK,EAAA;AACzB;"}
|
|
@@ -8,6 +8,7 @@ import { CheckboxProps } from '../../../components/Common/UI/Checkbox/CheckboxTy
|
|
|
8
8
|
*
|
|
9
9
|
* @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.
|
|
10
10
|
* @public
|
|
11
|
+
* @group Hook field props
|
|
11
12
|
*/
|
|
12
13
|
export interface CheckboxHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {
|
|
13
14
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/CheckboxHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { CheckboxField } from '@/components/Common'\nimport type { CheckboxProps } from '@/components/Common/UI/Checkbox/CheckboxTypes'\n\n/**\n * Props accepted by a checkbox field surfaced through a form hook.\n * Exposes `validationMessages` for custom error text alongside the shared base\n * field attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n */\nexport interface CheckboxHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default checkbox UI component; must accept the same props as `CheckboxProps`. */\n FieldComponent?: ComponentType<CheckboxProps>\n}\n\n/**\n * Checkbox field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, and label content.\n * @returns The rendered checkbox field wrapped in the field element registry.\n * @internal\n */\nexport function CheckboxHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n FieldComponent,\n}: CheckboxHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <CheckboxField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["CheckboxHookField","name","formHookResult","label","description","validationMessages","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","CheckboxField"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"CheckboxHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/CheckboxHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { CheckboxField } from '@/components/Common'\nimport type { CheckboxProps } from '@/components/Common/UI/Checkbox/CheckboxTypes'\n\n/**\n * Props accepted by a checkbox field surfaced through a form hook.\n * Exposes `validationMessages` for custom error text alongside the shared base\n * field attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n * @group Hook field props\n */\nexport interface CheckboxHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default checkbox UI component; must accept the same props as `CheckboxProps`. */\n FieldComponent?: ComponentType<CheckboxProps>\n}\n\n/**\n * Checkbox field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, and label content.\n * @returns The rendered checkbox field wrapped in the field element registry.\n * @internal\n */\nexport function CheckboxHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n FieldComponent,\n}: CheckboxHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <CheckboxField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["CheckboxHookField","name","formHookResult","label","description","validationMessages","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","CheckboxField"],"mappings":";;;;;;;AAmCO,SAASA,EAA6C;AAAA,EAC3D,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEV;AAAA,IACAC;AAAA,IACAG;AAAA,EAAA,GAEIO,IAAgBL,EAASN,CAAI;AAEnC,SAAOY;AAAA,IACLH;AAAA,IACA,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAd;AAAA,QACA,SAAAO;AAAA,QACA,OAAAL;AAAA,QACA,aAAAC;AAAA,QACA,cAAAK;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,gBAAAN;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -10,6 +10,7 @@ import { DatePickerProps } from '../../../components/Common/UI/DatePicker/DatePi
|
|
|
10
10
|
*
|
|
11
11
|
* @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.
|
|
12
12
|
* @public
|
|
13
|
+
* @group Hook field props
|
|
13
14
|
*/
|
|
14
15
|
export interface DatePickerHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps, Pick<DatePickerProps, 'portalContainer' | 'minDate' | 'maxDate'> {
|
|
15
16
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/DatePickerHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { DatePickerField } from '@/components/Common/Fields/DatePickerField'\nimport type { DatePickerProps } from '@/components/Common/UI/DatePicker/DatePickerTypes'\nimport { normalizeToDate } from '@/helpers/dateFormatting'\n\n/**\n * Props accepted by a date picker field surfaced through a form hook.\n * Exposes `minDate` and `maxDate` bounds (override server-provided constraints when\n * supplied), `portalContainer` for correct stacking inside modals, and\n * `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n */\nexport interface DatePickerHookFieldProps<TErrorCode extends string = never>\n extends BaseFieldProps, Pick<DatePickerProps, 'portalContainer' | 'minDate' | 'maxDate'> {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default date picker UI component; must accept the same props as `DatePickerProps`. */\n FieldComponent?: ComponentType<DatePickerProps>\n /** When used inside a modal, pass the modal backdrop ref's element so the calendar popover stacks correctly. */\n portalContainer?: DatePickerProps['portalContainer']\n}\n\n/**\n * Date picker field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, label content, and optional date bounds.\n * @returns The rendered date picker field wrapped in the field element registry.\n * @internal\n */\nexport function DatePickerHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n FieldComponent,\n portalContainer,\n minDate,\n maxDate,\n}: DatePickerHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <DatePickerField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n FieldComponent={FieldComponent}\n portalContainer={portalContainer}\n minDate={\n minDate ??\n (fieldMetadata?.minDate ? (normalizeToDate(fieldMetadata.minDate) ?? undefined) : undefined)\n }\n maxDate={\n maxDate ??\n (fieldMetadata?.maxDate ? (normalizeToDate(fieldMetadata.maxDate) ?? undefined) : undefined)\n }\n />,\n )\n}\n"],"names":["DatePickerHookField","name","formHookResult","label","description","validationMessages","FieldComponent","portalContainer","minDate","maxDate","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","DatePickerField","normalizeToDate"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"DatePickerHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/DatePickerHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { DatePickerField } from '@/components/Common/Fields/DatePickerField'\nimport type { DatePickerProps } from '@/components/Common/UI/DatePicker/DatePickerTypes'\nimport { normalizeToDate } from '@/helpers/dateFormatting'\n\n/**\n * Props accepted by a date picker field surfaced through a form hook.\n * Exposes `minDate` and `maxDate` bounds (override server-provided constraints when\n * supplied), `portalContainer` for correct stacking inside modals, and\n * `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n * @group Hook field props\n */\nexport interface DatePickerHookFieldProps<TErrorCode extends string = never>\n extends BaseFieldProps, Pick<DatePickerProps, 'portalContainer' | 'minDate' | 'maxDate'> {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default date picker UI component; must accept the same props as `DatePickerProps`. */\n FieldComponent?: ComponentType<DatePickerProps>\n /** When used inside a modal, pass the modal backdrop ref's element so the calendar popover stacks correctly. */\n portalContainer?: DatePickerProps['portalContainer']\n}\n\n/**\n * Date picker field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, label content, and optional date bounds.\n * @returns The rendered date picker field wrapped in the field element registry.\n * @internal\n */\nexport function DatePickerHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n FieldComponent,\n portalContainer,\n minDate,\n maxDate,\n}: DatePickerHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <DatePickerField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n FieldComponent={FieldComponent}\n portalContainer={portalContainer}\n minDate={\n minDate ??\n (fieldMetadata?.minDate ? (normalizeToDate(fieldMetadata.minDate) ?? undefined) : undefined)\n }\n maxDate={\n maxDate ??\n (fieldMetadata?.maxDate ? (normalizeToDate(fieldMetadata.maxDate) ?? undefined) : undefined)\n }\n />,\n )\n}\n"],"names":["DatePickerHookField","name","formHookResult","label","description","validationMessages","FieldComponent","portalContainer","minDate","maxDate","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","DatePickerField","normalizeToDate"],"mappings":";;;;;AAyCO,SAASA,EAA+C;AAAA,EAC7D,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AACF,GAAyC;AACvC,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEb;AAAA,IACAC;AAAA,IACAG;AAAA,EAAA,GAEIU,IAAgBL,EAAST,CAAI;AAEnC,SAAOe;AAAA,IACLH;AAAA,IACA,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAjB;AAAA,QACA,SAAAU;AAAA,QACA,OAAAR;AAAA,QACA,aAAAC;AAAA,QACA,cAAAQ;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,gBAAAT;AAAA,QACA,iBAAAC;AAAA,QACA,SACEC,MACCO,GAAe,UAAWI,EAAgBJ,EAAc,OAAO,KAAK,SAAa;AAAA,QAEpF,SACEN,MACCM,GAAe,UAAWI,EAAgBJ,EAAc,OAAO,KAAK,SAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAEtF;AAEJ;"}
|
|
@@ -9,6 +9,7 @@ import { NumberInputProps } from '../../../components/Common/UI/NumberInput/Numb
|
|
|
9
9
|
*
|
|
10
10
|
* @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.
|
|
11
11
|
* @public
|
|
12
|
+
* @group Hook field props
|
|
12
13
|
*/
|
|
13
14
|
export interface NumberInputHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {
|
|
14
15
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberInputHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/NumberInputHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { NumberInputField } from '@/components/Common'\nimport type { NumberInputProps } from '@/components/Common/UI/NumberInput/NumberInputTypes'\n\n/**\n * Props accepted by a number input field surfaced through a form hook.\n * Exposes numeric constraints (`min`, `max`), display `format`, `placeholder` text,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n */\nexport interface NumberInputHookFieldProps<\n TErrorCode extends string = never,\n> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Display format for the number value (e.g. `'currency'`). */\n format?: NumberInputProps['format']\n /** Minimum allowed numeric value. */\n min?: NumberInputProps['min']\n /** Maximum allowed numeric value. */\n max?: NumberInputProps['max']\n /** Placeholder text displayed when the field has no value. */\n placeholder?: NumberInputProps['placeholder']\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default number input UI component; must accept the same props as `NumberInputProps`. */\n FieldComponent?: ComponentType<NumberInputProps>\n}\n\n/**\n * Number input field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, formatting, and numeric bounds.\n * @returns The rendered number input field wrapped in the field element registry.\n * @internal\n */\nexport function NumberInputHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n format,\n min,\n max,\n placeholder,\n validationMessages,\n FieldComponent,\n}: NumberInputHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <NumberInputField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n format={format}\n min={min}\n max={max}\n placeholder={placeholder}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["NumberInputHookField","name","formHookResult","label","description","format","min","max","placeholder","validationMessages","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","NumberInputField"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"NumberInputHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/NumberInputHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { NumberInputField } from '@/components/Common'\nimport type { NumberInputProps } from '@/components/Common/UI/NumberInput/NumberInputTypes'\n\n/**\n * Props accepted by a number input field surfaced through a form hook.\n * Exposes numeric constraints (`min`, `max`), display `format`, `placeholder` text,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n * @group Hook field props\n */\nexport interface NumberInputHookFieldProps<\n TErrorCode extends string = never,\n> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Display format for the number value (e.g. `'currency'`). */\n format?: NumberInputProps['format']\n /** Minimum allowed numeric value. */\n min?: NumberInputProps['min']\n /** Maximum allowed numeric value. */\n max?: NumberInputProps['max']\n /** Placeholder text displayed when the field has no value. */\n placeholder?: NumberInputProps['placeholder']\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default number input UI component; must accept the same props as `NumberInputProps`. */\n FieldComponent?: ComponentType<NumberInputProps>\n}\n\n/**\n * Number input field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, formatting, and numeric bounds.\n * @returns The rendered number input field wrapped in the field element registry.\n * @internal\n */\nexport function NumberInputHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n format,\n min,\n max,\n placeholder,\n validationMessages,\n FieldComponent,\n}: NumberInputHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <NumberInputField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n format={format}\n min={min}\n max={max}\n placeholder={placeholder}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["NumberInputHookField","name","formHookResult","label","description","format","min","max","placeholder","validationMessages","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","NumberInputField"],"mappings":";;;;;;;AA8CO,SAASA,EAAgD;AAAA,EAC9D,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC;AAAA,EACA,KAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AACF,GAA0C;AACxC,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEd;AAAA,IACAC;AAAA,IACAO;AAAA,EAAA,GAEIO,IAAgBL,EAASV,CAAI;AAEnC,SAAOgB;AAAA,IACLH;AAAA,IACA,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAlB;AAAA,QACA,SAAAW;AAAA,QACA,OAAAT;AAAA,QACA,aAAAC;AAAA,QACA,cAAAS;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,QAAAX;AAAA,QACA,KAAAC;AAAA,QACA,KAAAC;AAAA,QACA,aAAAC;AAAA,QACA,gBAAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -10,6 +10,7 @@ import { RadioGroupProps } from '../../../components/Common/UI/RadioGroup/RadioG
|
|
|
10
10
|
* @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.
|
|
11
11
|
* @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.
|
|
12
12
|
* @public
|
|
13
|
+
* @group Hook field props
|
|
13
14
|
*/
|
|
14
15
|
export interface RadioGroupHookFieldProps<TErrorCode extends string = never, TEntry = unknown> extends BaseFieldProps {
|
|
15
16
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroupHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/RadioGroupHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport { getFieldWithOptions } from '../getFieldWithOptions'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { RadioGroupField } from '@/components/Common'\nimport type { RadioGroupProps } from '@/components/Common/UI/RadioGroup/RadioGroupTypes'\n\n/**\n * Props accepted by a radio group field surfaced through a form hook.\n * Exposes `getOptionLabel` to customize how option entries are rendered as labels,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @public\n */\nexport interface RadioGroupHookFieldProps<\n TErrorCode extends string = never,\n TEntry = unknown,\n> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Maps a raw option entry to its display label; when omitted, options use the labels provided by the hook. */\n getOptionLabel?: (entry: TEntry) => string\n /** Replaces the default radio group UI component; must accept the same props as `RadioGroupProps`. */\n FieldComponent?: ComponentType<RadioGroupProps>\n}\n\n/**\n * Radio group field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @param props - Field configuration including `name`, `formHookResult`, and an optional `getOptionLabel`.\n * @returns The rendered radio group field wrapped in the field element registry.\n * @internal\n */\nexport function RadioGroupHookField<TErrorCode extends string, TEntry = unknown>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n getOptionLabel,\n FieldComponent,\n}: RadioGroupHookFieldProps<TErrorCode, TEntry>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = getFieldWithOptions<TEntry>(metadata, name)\n\n const defaultOptions = fieldMetadata?.options ?? []\n const options =\n getOptionLabel && fieldMetadata?.entries\n ? fieldMetadata.entries.map((entry, index) => ({\n value: defaultOptions[index]?.value ?? '',\n label: getOptionLabel(entry),\n }))\n : defaultOptions\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <RadioGroupField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n options={options}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["RadioGroupHookField","name","formHookResult","label","description","validationMessages","getOptionLabel","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","getFieldWithOptions","defaultOptions","options","entry","index","withFieldElementRegistry","jsx","RadioGroupField"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"RadioGroupHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/RadioGroupHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport { getFieldWithOptions } from '../getFieldWithOptions'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { RadioGroupField } from '@/components/Common'\nimport type { RadioGroupProps } from '@/components/Common/UI/RadioGroup/RadioGroupTypes'\n\n/**\n * Props accepted by a radio group field surfaced through a form hook.\n * Exposes `getOptionLabel` to customize how option entries are rendered as labels,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @public\n * @group Hook field props\n */\nexport interface RadioGroupHookFieldProps<\n TErrorCode extends string = never,\n TEntry = unknown,\n> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Maps a raw option entry to its display label; when omitted, options use the labels provided by the hook. */\n getOptionLabel?: (entry: TEntry) => string\n /** Replaces the default radio group UI component; must accept the same props as `RadioGroupProps`. */\n FieldComponent?: ComponentType<RadioGroupProps>\n}\n\n/**\n * Radio group field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @param props - Field configuration including `name`, `formHookResult`, and an optional `getOptionLabel`.\n * @returns The rendered radio group field wrapped in the field element registry.\n * @internal\n */\nexport function RadioGroupHookField<TErrorCode extends string, TEntry = unknown>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n getOptionLabel,\n FieldComponent,\n}: RadioGroupHookFieldProps<TErrorCode, TEntry>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = getFieldWithOptions<TEntry>(metadata, name)\n\n const defaultOptions = fieldMetadata?.options ?? []\n const options =\n getOptionLabel && fieldMetadata?.entries\n ? fieldMetadata.entries.map((entry, index) => ({\n value: defaultOptions[index]?.value ?? '',\n label: getOptionLabel(entry),\n }))\n : defaultOptions\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <RadioGroupField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n options={options}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["RadioGroupHookField","name","formHookResult","label","description","validationMessages","getOptionLabel","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","getFieldWithOptions","defaultOptions","options","entry","index","withFieldElementRegistry","jsx","RadioGroupField"],"mappings":";;;;;;;;AA4CO,SAASA,EAAiE;AAAA,EAC/E,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AACF,GAAiD;AAC/C,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEX;AAAA,IACAC;AAAA,IACAG;AAAA,EAAA,GAEIQ,IAAgBC,EAA4BN,GAAUP,CAAI,GAE1Dc,IAAiBF,GAAe,WAAW,CAAA,GAC3CG,IACJV,KAAkBO,GAAe,UAC7BA,EAAc,QAAQ,IAAI,CAACI,GAAOC,OAAW;AAAA,IAC3C,OAAOH,EAAeG,CAAK,GAAG,SAAS;AAAA,IACvC,OAAOZ,EAAeW,CAAK;AAAA,EAAA,EAC3B,IACFF;AAEN,SAAOI;AAAA,IACLR;AAAA,IACA,gBAAAS;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAApB;AAAA,QACA,SAAAQ;AAAA,QACA,OAAAN;AAAA,QACA,aAAAC;AAAA,QACA,cAAAM;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,SAAAG;AAAA,QACA,gBAAAT;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -11,6 +11,7 @@ import { SelectProps } from '../../../components/Common/UI/Select/SelectTypes';
|
|
|
11
11
|
* @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.
|
|
12
12
|
* @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.
|
|
13
13
|
* @public
|
|
14
|
+
* @group Hook field props
|
|
14
15
|
*/
|
|
15
16
|
export interface SelectHookFieldProps<TErrorCode extends string = never, TEntry = unknown> extends BaseFieldProps, Pick<SelectProps, 'portalContainer'> {
|
|
16
17
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/SelectHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport { getFieldWithOptions } from '../getFieldWithOptions'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { SelectField } from '@/components/Common'\nimport type { SelectProps } from '@/components/Common/UI/Select/SelectTypes'\n\n/**\n * Props accepted by a select field surfaced through a form hook.\n * Exposes `getOptionLabel` to customize how option entries are rendered as labels,\n * `placeholder` text, `portalContainer` for correct stacking inside modals,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @public\n */\nexport interface SelectHookFieldProps<TErrorCode extends string = never, TEntry = unknown>\n extends BaseFieldProps, Pick<SelectProps, 'portalContainer'> {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Maps a raw option entry to its display label; when omitted, options use the labels provided by the hook. */\n getOptionLabel?: (entry: TEntry) => string\n /**\n * Placeholder text displayed when no option is selected.\n * Required so empty dropdowns always communicate the action — pass an empty string only when a default value is guaranteed.\n */\n placeholder: string\n /** Replaces the default select UI component; must accept the same props as `SelectProps`. */\n FieldComponent?: ComponentType<SelectProps>\n /** When used inside a modal, pass the modal backdrop ref's element so the listbox stacks correctly. */\n portalContainer?: SelectProps['portalContainer']\n}\n\n/**\n * Select field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @param props - Field configuration including `name`, `formHookResult`, and an optional `getOptionLabel`.\n * @returns The rendered select field wrapped in the field element registry.\n * @internal\n */\nexport function SelectHookField<TErrorCode extends string, TEntry = unknown>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n getOptionLabel,\n placeholder,\n FieldComponent,\n portalContainer,\n}: SelectHookFieldProps<TErrorCode, TEntry>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = getFieldWithOptions<TEntry>(metadata, name)\n\n const defaultOptions = fieldMetadata?.options ?? []\n const options =\n getOptionLabel && fieldMetadata?.entries\n ? fieldMetadata.entries.map((entry, index) => ({\n value: defaultOptions[index]?.value ?? '',\n label: getOptionLabel(entry),\n }))\n : defaultOptions\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <SelectField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n options={options}\n placeholder={placeholder}\n FieldComponent={FieldComponent}\n portalContainer={portalContainer}\n />,\n )\n}\n"],"names":["SelectHookField","name","formHookResult","label","description","validationMessages","getOptionLabel","placeholder","FieldComponent","portalContainer","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","getFieldWithOptions","defaultOptions","options","entry","index","withFieldElementRegistry","jsx","SelectField"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"SelectHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/SelectHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport { getFieldWithOptions } from '../getFieldWithOptions'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { SelectField } from '@/components/Common'\nimport type { SelectProps } from '@/components/Common/UI/Select/SelectTypes'\n\n/**\n * Props accepted by a select field surfaced through a form hook.\n * Exposes `getOptionLabel` to customize how option entries are rendered as labels,\n * `placeholder` text, `portalContainer` for correct stacking inside modals,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @public\n * @group Hook field props\n */\nexport interface SelectHookFieldProps<TErrorCode extends string = never, TEntry = unknown>\n extends BaseFieldProps, Pick<SelectProps, 'portalContainer'> {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Maps a raw option entry to its display label; when omitted, options use the labels provided by the hook. */\n getOptionLabel?: (entry: TEntry) => string\n /**\n * Placeholder text displayed when no option is selected.\n * Required so empty dropdowns always communicate the action — pass an empty string only when a default value is guaranteed.\n */\n placeholder: string\n /** Replaces the default select UI component; must accept the same props as `SelectProps`. */\n FieldComponent?: ComponentType<SelectProps>\n /** When used inside a modal, pass the modal backdrop ref's element so the listbox stacks correctly. */\n portalContainer?: SelectProps['portalContainer']\n}\n\n/**\n * Select field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @typeParam TEntry - Shape of each option entry consumed by `getOptionLabel`.\n * @param props - Field configuration including `name`, `formHookResult`, and an optional `getOptionLabel`.\n * @returns The rendered select field wrapped in the field element registry.\n * @internal\n */\nexport function SelectHookField<TErrorCode extends string, TEntry = unknown>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n getOptionLabel,\n placeholder,\n FieldComponent,\n portalContainer,\n}: SelectHookFieldProps<TErrorCode, TEntry>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = getFieldWithOptions<TEntry>(metadata, name)\n\n const defaultOptions = fieldMetadata?.options ?? []\n const options =\n getOptionLabel && fieldMetadata?.entries\n ? fieldMetadata.entries.map((entry, index) => ({\n value: defaultOptions[index]?.value ?? '',\n label: getOptionLabel(entry),\n }))\n : defaultOptions\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <SelectField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n options={options}\n placeholder={placeholder}\n FieldComponent={FieldComponent}\n portalContainer={portalContainer}\n />,\n )\n}\n"],"names":["SelectHookField","name","formHookResult","label","description","validationMessages","getOptionLabel","placeholder","FieldComponent","portalContainer","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","getFieldWithOptions","defaultOptions","options","entry","index","withFieldElementRegistry","jsx","SelectField"],"mappings":";;;;;;;;AAkDO,SAASA,EAA6D;AAAA,EAC3E,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AACF,GAA6C;AAC3C,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEb;AAAA,IACAC;AAAA,IACAG;AAAA,EAAA,GAEIU,IAAgBC,EAA4BN,GAAUT,CAAI,GAE1DgB,IAAiBF,GAAe,WAAW,CAAA,GAC3CG,IACJZ,KAAkBS,GAAe,UAC7BA,EAAc,QAAQ,IAAI,CAACI,GAAOC,OAAW;AAAA,IAC3C,OAAOH,EAAeG,CAAK,GAAG,SAAS;AAAA,IACvC,OAAOd,EAAea,CAAK;AAAA,EAAA,EAC3B,IACFF;AAEN,SAAOI;AAAA,IACLR;AAAA,IACA,gBAAAS;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAtB;AAAA,QACA,SAAAU;AAAA,QACA,OAAAR;AAAA,QACA,aAAAC;AAAA,QACA,cAAAQ;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,SAAAG;AAAA,QACA,aAAAX;AAAA,QACA,gBAAAC;AAAA,QACA,iBAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -8,6 +8,7 @@ import { SwitchProps } from '../../../components/Common/UI/Switch/SwitchTypes';
|
|
|
8
8
|
*
|
|
9
9
|
* @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.
|
|
10
10
|
* @public
|
|
11
|
+
* @group Hook field props
|
|
11
12
|
*/
|
|
12
13
|
export interface SwitchHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {
|
|
13
14
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/SwitchHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { SwitchField } from '@/components/Common'\nimport type { SwitchProps } from '@/components/Common/UI/Switch/SwitchTypes'\n\n/**\n * Props accepted by a toggle switch field surfaced through a form hook.\n * Exposes `validationMessages` for custom error text alongside the shared base\n * field attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n */\nexport interface SwitchHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default toggle switch UI component; must accept the same props as `SwitchProps`. */\n FieldComponent?: ComponentType<SwitchProps>\n}\n\n/**\n * Switch field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, and label content.\n * @returns The rendered switch field wrapped in the field element registry.\n * @internal\n */\nexport function SwitchHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n FieldComponent,\n}: SwitchHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <SwitchField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["SwitchHookField","name","formHookResult","label","description","validationMessages","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","SwitchField"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"SwitchHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/SwitchHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { SwitchField } from '@/components/Common'\nimport type { SwitchProps } from '@/components/Common/UI/Switch/SwitchTypes'\n\n/**\n * Props accepted by a toggle switch field surfaced through a form hook.\n * Exposes `validationMessages` for custom error text alongside the shared base\n * field attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @public\n * @group Hook field props\n */\nexport interface SwitchHookFieldProps<TErrorCode extends string = never> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode>\n /** Replaces the default toggle switch UI component; must accept the same props as `SwitchProps`. */\n FieldComponent?: ComponentType<SwitchProps>\n}\n\n/**\n * Switch field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, and label content.\n * @returns The rendered switch field wrapped in the field element registry.\n * @internal\n */\nexport function SwitchHookField<TErrorCode extends string>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n FieldComponent,\n}: SwitchHookFieldProps<TErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <SwitchField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["SwitchHookField","name","formHookResult","label","description","validationMessages","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","SwitchField"],"mappings":";;;;;;;AAmCO,SAASA,EAA2C;AAAA,EACzD,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AACF,GAAqC;AACnC,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEV;AAAA,IACAC;AAAA,IACAG;AAAA,EAAA,GAEIO,IAAgBL,EAASN,CAAI;AAEnC,SAAOY;AAAA,IACLH;AAAA,IACA,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAd;AAAA,QACA,SAAAO;AAAA,QACA,OAAAL;AAAA,QACA,aAAAC;AAAA,QACA,cAAAK;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,gBAAAN;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -10,6 +10,7 @@ import { TextInputProps } from '../../../components/Common/UI/TextInput/TextInpu
|
|
|
10
10
|
* @typeParam TErrorCode - Required validation error code keys mapped via `validationMessages`.
|
|
11
11
|
* @typeParam TOptionalErrorCode - Optional validation error code keys mapped via `validationMessages`.
|
|
12
12
|
* @public
|
|
13
|
+
* @group Hook field props
|
|
13
14
|
*/
|
|
14
15
|
export interface TextInputHookFieldProps<TErrorCode extends string = never, TOptionalErrorCode extends string = never> extends BaseFieldProps {
|
|
15
16
|
/** The field name; must match the corresponding key in the form schema. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextInputHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/TextInputHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { TextInputField } from '@/components/Common'\nimport type { TextInputProps } from '@/components/Common/UI/TextInput/TextInputTypes'\n\n/**\n * Props accepted by a text input field surfaced through a form hook.\n * Exposes a `transform` function for preprocessing raw input, `placeholder` text,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Required validation error code keys mapped via `validationMessages`.\n * @typeParam TOptionalErrorCode - Optional validation error code keys mapped via `validationMessages`.\n * @public\n */\nexport interface TextInputHookFieldProps<\n TErrorCode extends string = never,\n TOptionalErrorCode extends string = never,\n> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode, TOptionalErrorCode>\n /** Transforms the raw string value on every change before storing it; use for normalization such as trimming or changing case. */\n transform?: (value: string) => string\n /** Placeholder text displayed when the field has no value. */\n placeholder?: string\n /** Replaces the default text input UI component; must accept the same props as `TextInputProps`. */\n FieldComponent?: ComponentType<TextInputProps>\n}\n\n/**\n * Text input field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Required validation error code keys mapped via `validationMessages`.\n * @typeParam TOptionalErrorCode - Optional validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, `transform`, `placeholder`, and label content.\n * @returns The rendered text input field wrapped in the field element registry.\n * @internal\n */\nexport function TextInputHookField<\n TErrorCode extends string,\n TOptionalErrorCode extends string = never,\n>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n transform,\n placeholder,\n FieldComponent,\n}: TextInputHookFieldProps<TErrorCode, TOptionalErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <TextInputField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n transform={transform}\n placeholder={placeholder}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["TextInputHookField","name","formHookResult","label","description","validationMessages","transform","placeholder","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","TextInputField"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"TextInputHookField.js","sources":["../../../../src/partner-hook-utils/form/fields/TextInputHookField.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { useHookFieldResolution } from '../useHookFieldResolution'\nimport type { BaseFieldProps, ValidationMessages, FormHookResult } from '../../types'\nimport { withFieldElementRegistry } from './withFieldElementRegistry'\nimport { TextInputField } from '@/components/Common'\nimport type { TextInputProps } from '@/components/Common/UI/TextInput/TextInputTypes'\n\n/**\n * Props accepted by a text input field surfaced through a form hook.\n * Exposes a `transform` function for preprocessing raw input, `placeholder` text,\n * and `validationMessages` for custom error text alongside the shared base field\n * attributes (`label`, `description`).\n *\n * @typeParam TErrorCode - Required validation error code keys mapped via `validationMessages`.\n * @typeParam TOptionalErrorCode - Optional validation error code keys mapped via `validationMessages`.\n * @public\n * @group Hook field props\n */\nexport interface TextInputHookFieldProps<\n TErrorCode extends string = never,\n TOptionalErrorCode extends string = never,\n> extends BaseFieldProps {\n /** The field name; must match the corresponding key in the form schema. */\n name: string\n /** Form hook result to connect to; falls back to the nearest `SDKFormProvider` when omitted. */\n formHookResult?: FormHookResult\n /** Custom error text keyed by validation error code. */\n validationMessages?: ValidationMessages<TErrorCode, TOptionalErrorCode>\n /** Transforms the raw string value on every change before storing it; use for normalization such as trimming or changing case. */\n transform?: (value: string) => string\n /** Placeholder text displayed when the field has no value. */\n placeholder?: string\n /** Replaces the default text input UI component; must accept the same props as `TextInputProps`. */\n FieldComponent?: ComponentType<TextInputProps>\n}\n\n/**\n * Text input field connected to a partner form hook result via `useHookFieldResolution`.\n *\n * @typeParam TErrorCode - Required validation error code keys mapped via `validationMessages`.\n * @typeParam TOptionalErrorCode - Optional validation error code keys mapped via `validationMessages`.\n * @param props - Field configuration including `name`, `formHookResult`, `transform`, `placeholder`, and label content.\n * @returns The rendered text input field wrapped in the field element registry.\n * @internal\n */\nexport function TextInputHookField<\n TErrorCode extends string,\n TOptionalErrorCode extends string = never,\n>({\n name,\n formHookResult,\n label,\n description,\n validationMessages,\n transform,\n placeholder,\n FieldComponent,\n}: TextInputHookFieldProps<TErrorCode, TOptionalErrorCode>) {\n const { metadata, control, errorMessage, fieldElementRegistry } = useHookFieldResolution(\n name,\n formHookResult,\n validationMessages,\n )\n const fieldMetadata = metadata[name]\n\n return withFieldElementRegistry(\n fieldElementRegistry,\n <TextInputField\n name={name}\n control={control}\n label={label}\n description={description}\n errorMessage={errorMessage}\n isRequired={fieldMetadata?.isRequired}\n isDisabled={fieldMetadata?.isDisabled}\n transform={transform}\n placeholder={placeholder}\n FieldComponent={FieldComponent}\n />,\n )\n}\n"],"names":["TextInputHookField","name","formHookResult","label","description","validationMessages","transform","placeholder","FieldComponent","metadata","control","errorMessage","fieldElementRegistry","useHookFieldResolution","fieldMetadata","withFieldElementRegistry","jsx","TextInputField"],"mappings":";;;;;;;AA6CO,SAASA,EAGd;AAAA,EACA,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AACF,GAA4D;AAC1D,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,cAAAC,GAAc,sBAAAC,MAAyBC;AAAA,IAChEZ;AAAA,IACAC;AAAA,IACAG;AAAA,EAAA,GAEIS,IAAgBL,EAASR,CAAI;AAEnC,SAAOc;AAAA,IACLH;AAAA,IACA,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAhB;AAAA,QACA,SAAAS;AAAA,QACA,OAAAP;AAAA,QACA,aAAAC;AAAA,QACA,cAAAO;AAAA,QACA,YAAYG,GAAe;AAAA,QAC3B,YAAYA,GAAe;AAAA,QAC3B,WAAAR;AAAA,QACA,aAAAC;AAAA,QACA,gBAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -77,6 +77,7 @@ export type ValidationMessages<TErrorCode extends string, TOptionalErrorCode ext
|
|
|
77
77
|
* Common presentation props accepted by every hook field component.
|
|
78
78
|
*
|
|
79
79
|
* @public
|
|
80
|
+
* @group Hook field props
|
|
80
81
|
*/
|
|
81
82
|
export interface BaseFieldProps {
|
|
82
83
|
/** Visible label rendered above the field. */
|
|
@@ -90,6 +91,7 @@ export interface BaseFieldProps {
|
|
|
90
91
|
*
|
|
91
92
|
* @typeParam TProps - Original hook field props type that includes a `name` property.
|
|
92
93
|
* @public
|
|
94
|
+
* @group Hook field props
|
|
93
95
|
*/
|
|
94
96
|
export type HookFieldProps<TProps extends {
|
|
95
97
|
name: string;
|
|
@@ -107,6 +109,7 @@ export type HookFieldProps<TProps extends {
|
|
|
107
109
|
*
|
|
108
110
|
* @typeParam TFormData - Shape of the form values managed by react-hook-form.
|
|
109
111
|
* @public
|
|
112
|
+
* @group Form hook results
|
|
110
113
|
*/
|
|
111
114
|
export interface HookFormInternals<TFormData extends FieldValues = FieldValues> {
|
|
112
115
|
/** The full react-hook-form return value; use for watching fields, setting values, or triggering validation. */
|
|
@@ -138,6 +141,7 @@ export interface HookFormInternals<TFormData extends FieldValues = FieldValues>
|
|
|
138
141
|
* ready-state shape (data, form, actions, status) becomes available.
|
|
139
142
|
*
|
|
140
143
|
* @public
|
|
144
|
+
* @group Common hook results
|
|
141
145
|
*/
|
|
142
146
|
export interface HookLoadingResult {
|
|
143
147
|
/** Always `true` in this branch; narrows to `false` once the hook's ready-state shape is available. */
|
|
@@ -156,6 +160,7 @@ export interface HookLoadingResult {
|
|
|
156
160
|
*
|
|
157
161
|
* @typeParam T - Type of the saved entity returned by the underlying mutation.
|
|
158
162
|
* @public
|
|
163
|
+
* @group Form hook results
|
|
159
164
|
*/
|
|
160
165
|
export interface HookSubmitResult<T> {
|
|
161
166
|
/** Whether the submission created a new entity or updated an existing one. */
|
|
@@ -175,6 +180,7 @@ export interface HookSubmitResult<T> {
|
|
|
175
180
|
* the supported way to discriminate fetch vs submit failures today.
|
|
176
181
|
*
|
|
177
182
|
* @public
|
|
183
|
+
* @group Common hook results
|
|
178
184
|
*/
|
|
179
185
|
export interface HookErrorHandling {
|
|
180
186
|
/** Aggregated fetch and submit errors as normalized {@link SDKError} values. */
|
|
@@ -196,6 +202,7 @@ export interface HookErrorHandling {
|
|
|
196
202
|
* @typeParam TData - Shape of the data the hook exposes once loaded.
|
|
197
203
|
* @typeParam TStatus - Shape of the status flags the hook exposes.
|
|
198
204
|
* @public
|
|
205
|
+
* @group Common hook results
|
|
199
206
|
*/
|
|
200
207
|
export interface BaseHookReady<TData extends Record<string, unknown> = Record<string, unknown>, TStatus extends Record<string, unknown> = Record<string, unknown>> {
|
|
201
208
|
/** Always `false` in this branch; discriminates from {@link HookLoadingResult}. */
|
|
@@ -225,6 +232,7 @@ export interface BaseHookReady<TData extends Record<string, unknown> = Record<st
|
|
|
225
232
|
* @typeParam TFields - Shape of the pre-bound `Fields` component map.
|
|
226
233
|
* @typeParam TFormOutputs - Shape of the values produced once the schema parses on submit (the resolver output / `TTransformedValues`). Defaults to `TFormData`, which holds whenever the form's input and parsed-output shapes coincide; pass it explicitly when a schema transform makes them diverge.
|
|
227
234
|
* @public
|
|
235
|
+
* @group Form hook results
|
|
228
236
|
*/
|
|
229
237
|
export interface BaseFormHookReady<TFieldsMetadata extends FieldsMetadata = FieldsMetadata, TFormData extends FieldValues = FieldValues, TFields extends object = Record<string, unknown>, TFormOutputs = TFormData> {
|
|
230
238
|
/** Always `false` in this branch; discriminates from {@link HookLoadingResult}. */
|
|
@@ -259,6 +267,7 @@ export interface BaseFormHookReady<TFieldsMetadata extends FieldsMetadata = Fiel
|
|
|
259
267
|
* under an `SDKFormProvider`.
|
|
260
268
|
*
|
|
261
269
|
* @public
|
|
270
|
+
* @group Form hook results
|
|
262
271
|
* @privateRemarks
|
|
263
272
|
* `_fieldElementRegistry` is forwarded from {@link HookFormInternals} so HookFields
|
|
264
273
|
* can self-publish the registry for descendant `useField` calls when partners
|
|
@@ -185,6 +185,7 @@ export declare const companyEvents: {
|
|
|
185
185
|
export declare const contractorEvents: {
|
|
186
186
|
readonly CONTRACTOR_SELF_ONBOARDING_START: "contractor/selfOnboarding/start";
|
|
187
187
|
readonly CONTRACTOR_SELF_ONBOARDING_DONE: "contractor/selfOnboarding/done";
|
|
188
|
+
readonly CONTRACTOR_SELF_ONBOARDING_CANCELLED: "contractor/selfOnboarding/cancelled";
|
|
188
189
|
readonly CONTRACTOR_ADDRESS_UPDATED: "contractor/address/updated";
|
|
189
190
|
readonly CONTRACTOR_ADDRESS_DONE: "contractor/address/done";
|
|
190
191
|
readonly CONTRACTOR_PAYMENT_METHOD_UPDATED: "contractor/paymentMethod/updated";
|
|
@@ -553,6 +554,7 @@ export declare const componentEvents: {
|
|
|
553
554
|
readonly RUN_PAYROLL_GROSS_UP_CALCULATED: "runPayroll/grossUp/calculated";
|
|
554
555
|
readonly CONTRACTOR_SELF_ONBOARDING_START: "contractor/selfOnboarding/start";
|
|
555
556
|
readonly CONTRACTOR_SELF_ONBOARDING_DONE: "contractor/selfOnboarding/done";
|
|
557
|
+
readonly CONTRACTOR_SELF_ONBOARDING_CANCELLED: "contractor/selfOnboarding/cancelled";
|
|
556
558
|
readonly CONTRACTOR_ADDRESS_UPDATED: "contractor/address/updated";
|
|
557
559
|
readonly CONTRACTOR_ADDRESS_DONE: "contractor/address/done";
|
|
558
560
|
readonly CONTRACTOR_PAYMENT_METHOD_UPDATED: "contractor/paymentMethod/updated";
|
|
@@ -765,6 +767,7 @@ export type EventType = (typeof componentEvents)[keyof typeof componentEvents];
|
|
|
765
767
|
* record. The values mirror the strings returned by the API.
|
|
766
768
|
*
|
|
767
769
|
* @public
|
|
770
|
+
* @page employee/types
|
|
768
771
|
*/
|
|
769
772
|
export declare const EmployeeOnboardingStatus: {
|
|
770
773
|
readonly ADMIN_ONBOARDING_INCOMPLETE: "admin_onboarding_incomplete";
|
|
@@ -785,6 +788,7 @@ export declare const EmployeeOnboardingStatus: {
|
|
|
785
788
|
* flow (invited, started, or overdue) versus an admin-driven onboarding flow.
|
|
786
789
|
*
|
|
787
790
|
* @public
|
|
791
|
+
* @page employee/types
|
|
788
792
|
*/
|
|
789
793
|
export declare const EmployeeSelfOnboardingStatuses: Set<string>;
|
|
790
794
|
/**
|
|
@@ -795,6 +799,7 @@ export declare const EmployeeSelfOnboardingStatuses: Set<string>;
|
|
|
795
799
|
* record. The values mirror the strings returned by the API.
|
|
796
800
|
*
|
|
797
801
|
* @public
|
|
802
|
+
* @page contractor/types
|
|
798
803
|
*/
|
|
799
804
|
export declare const ContractorOnboardingStatus: {
|
|
800
805
|
readonly ADMIN_ONBOARDING_INCOMPLETE: "admin_onboarding_incomplete";
|
|
@@ -815,6 +820,7 @@ export declare const ContractorOnboardingStatus: {
|
|
|
815
820
|
* onboarding flow.
|
|
816
821
|
*
|
|
817
822
|
* @public
|
|
823
|
+
* @page contractor/types
|
|
818
824
|
*/
|
|
819
825
|
export declare const ContractorSelfOnboardingStatuses: Set<ContractorOnboardingStatus1>;
|
|
820
826
|
/**
|
|
@@ -862,6 +868,7 @@ export declare const HOURS_PER_PAY_PERIOD_ANNUALLY = 2080;
|
|
|
862
868
|
* `SignatureForm`.
|
|
863
869
|
*
|
|
864
870
|
* @public
|
|
871
|
+
* @page employee/types
|
|
865
872
|
*/
|
|
866
873
|
export declare const I9_FORM_NAME = "US_I-9";
|
|
867
874
|
/**
|
|
@@ -869,6 +876,7 @@ export declare const I9_FORM_NAME = "US_I-9";
|
|
|
869
876
|
* in state selection controls.
|
|
870
877
|
*
|
|
871
878
|
* @public
|
|
879
|
+
* @page employee/types
|
|
872
880
|
*/
|
|
873
881
|
export declare const STATES_ABBR: readonly ["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"];
|
|
874
882
|
/**
|
|
@@ -876,6 +884,7 @@ export declare const STATES_ABBR: readonly ["AL", "AK", "AZ", "AR", "CA", "CO",
|
|
|
876
884
|
* {@link STATES_ABBR}.
|
|
877
885
|
*
|
|
878
886
|
* @public
|
|
887
|
+
* @page employee/types
|
|
879
888
|
*/
|
|
880
889
|
export type StateAbbreviation = (typeof STATES_ABBR)[number];
|
|
881
890
|
/** @internal */
|
|
@@ -892,6 +901,7 @@ export declare const SIGNATORY_TITLES: {
|
|
|
892
901
|
* Pay period unit values for the `paymentUnit` field on a compensation, describing the unit a pay rate is expressed against.
|
|
893
902
|
*
|
|
894
903
|
* @public
|
|
904
|
+
* @page employee/types
|
|
895
905
|
*/
|
|
896
906
|
export declare const PAY_PERIODS: {
|
|
897
907
|
readonly HOUR: "Hour";
|