UNPKG

@payfit/unity-components

Version:

93 lines (92 loc) 3.46 kB
import { ForwardedRef, ReactNode } from 'react'; import { LabelProps } from '../label/Label.js'; import { TanstackMultiSelectProps } from '../multi-select/TanstackMultiSelect.js'; export type TanstackMultiSelectFieldProps<TItems = undefined> = TanstackMultiSelectProps<TItems> & Pick<LabelProps, 'isRequired' | 'requiredVariant'> & { /** The label for the multi-select field. */ label: string; /** Helper text to display below the multi-select field. */ helperText?: ReactNode; /** A contextual link to display below the multi-select field. */ contextualLink?: ReactNode; }; type TanstackMultiSelectFieldComponent = <TItems = undefined>(props: TanstackMultiSelectFieldProps<TItems> & { ref?: ForwardedRef<HTMLButtonElement>; }) => React.JSX.Element; /** * The `TanstackMultiSelectField` component renders a full field (label, multi-select, feedback) * wired to the TanStack Form context. It manages state and accessibility via the * context provided by `useTanstackUnityForm` and `<form.AppField name="…">`. @example * ```tsx * import { TanstackMultiSelectField } from "@/components/multi-select-field/TanstackMultiSelectField" * import { useTanstackUnityForm } from "@/hooks/use-tanstack-form" * import { MultiSelectOption } from "@/components/multi-select/parts/MultiSelectOption" * * function Example() { * const schema = z.object({ * fruits: z.set(z.string()).min(1, 'Select at least one fruit'), * }) * * const form = useTanstackUnityForm({ validators: { * onBlur: schema, * } }) * return ( * <form> * <form.AppField name="fruits"> * {() => ( * <TanstackMultiSelectField * label="Favorite Fruits" * helperText="Choose your favorites" * placeholder="Select fruits..." * > * <MultiSelectOption value="apple">Apple</MultiSelectOption> * <MultiSelectOption value="banana">Banana</MultiSelectOption> * <MultiSelectOption value="orange">Orange</MultiSelectOption> * </TanstackMultiSelectField> * )} * </form.AppField> * </form> * ) * } * ``` * @example * ```tsx * interface Fruit { id: string; name: string } * const fruits = new Set<Fruit>([...]) * * function Example() { * const schema = z.object({ * fruits: z.set(z.string()).min(1, 'Select at least one fruit'), * }) * * const form = useTanstackUnityForm({ validators: { * onBlur: schema, * } }) * return ( * <form> * <form.AppField name="fruits"> * {() => ( * <TanstackMultiSelectField * label="Favorite Fruits" * items={fruits} * getItemValue={fruit => fruit.id} * renderValue={items => Array.from(items).map(i => i.name).join(', ')} * > * {fruit => ( * <MultiSelectOption value={fruit.id}>{fruit.name}</MultiSelectOption> * )} * </TanstackMultiSelectField> * )} * </form.AppField> * </form> * ) * } * ``` * @remarks Migration from `MultiSelectField` (non‑TanStack): * - Do not pass a `name` prop to the field: use `<form.AppField name="…">`. * - `value`, `defaultValue`, `onChange`, and `isInvalid` are derived from the TanStack form context. */ export declare const TanstackMultiSelectField: TanstackMultiSelectFieldComponent & { displayName: string; }; export {};