From ce4913e258331ccf96b367695447689752330b31 Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Fri, 13 Oct 2023 20:53:52 -0700 Subject: [PATCH 01/38] checkbox --- .../@react-aria/checkbox/src/useCheckbox.ts | 9 +- .../checkbox/src/useCheckboxGroup.ts | 28 +- .../checkbox/src/useCheckboxGroupItem.ts | 36 +- packages/@react-aria/checkbox/src/utils.ts | 11 +- packages/@react-aria/toggle/src/useToggle.ts | 19 +- packages/@react-aria/utils/src/index.ts | 1 + .../@react-aria/utils/src/useEffectEvent.ts | 9 +- .../utils/src/useFormValidation.ts | 272 +++++++++++ .../@react-spectrum/checkbox/src/Checkbox.tsx | 8 +- .../checkbox/src/CheckboxGroup.tsx | 8 +- .../checkbox/test/Checkbox.test.js | 132 ++++- .../checkbox/test/CheckboxGroup.test.js | 452 +++++++++++++++++- packages/@react-spectrum/form/src/Form.tsx | 19 +- .../form/stories/Form.stories.tsx | 46 +- packages/@react-spectrum/label/src/Field.tsx | 20 +- .../@react-spectrum/label/src/HelpText.tsx | 8 +- .../checkbox/src/useCheckboxGroupState.ts | 105 +++- packages/@react-types/checkbox/src/index.d.ts | 6 +- packages/@react-types/form/src/index.d.ts | 14 +- packages/@react-types/shared/src/inputs.d.ts | 38 +- packages/dev/test-utils/package.json | 1 + packages/dev/test-utils/src/index.ts | 1 + packages/dev/test-utils/src/validation.ts | 39 ++ 23 files changed, 1212 insertions(+), 70 deletions(-) create mode 100644 packages/@react-aria/utils/src/useFormValidation.ts create mode 100644 packages/dev/test-utils/src/validation.ts diff --git a/packages/@react-aria/checkbox/src/useCheckbox.ts b/packages/@react-aria/checkbox/src/useCheckbox.ts index 8bb9588509b..59140c54d01 100644 --- a/packages/@react-aria/checkbox/src/useCheckbox.ts +++ b/packages/@react-aria/checkbox/src/useCheckbox.ts @@ -14,8 +14,9 @@ import {AriaCheckboxProps} from '@react-types/checkbox'; import {InputHTMLAttributes, RefObject, useEffect} from 'react'; import {ToggleState} from '@react-stately/toggle'; import {useToggle} from '@react-aria/toggle'; +import {ValidationResult} from '@react-types/shared'; -export interface CheckboxAria { +export interface CheckboxAria extends ValidationResult { /** Props for the input element. */ inputProps: InputHTMLAttributes, /** Whether the checkbox is selected. */ @@ -39,7 +40,7 @@ export interface CheckboxAria { * @param inputRef - A ref for the HTML input element. */ export function useCheckbox(props: AriaCheckboxProps, state: ToggleState, inputRef: RefObject): CheckboxAria { - let {inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid} = useToggle(props, state, inputRef); + let {inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid, errors, validationDetails} = useToggle(props, state, inputRef); let {isIndeterminate} = props; useEffect(() => { @@ -59,6 +60,8 @@ export function useCheckbox(props: AriaCheckboxProps, state: ToggleState, inputR isPressed, isDisabled, isReadOnly, - isInvalid + isInvalid, + errors, + validationDetails }; } diff --git a/packages/@react-aria/checkbox/src/useCheckboxGroup.ts b/packages/@react-aria/checkbox/src/useCheckboxGroup.ts index 2d4cf119b2a..51c28fefbbc 100644 --- a/packages/@react-aria/checkbox/src/useCheckboxGroup.ts +++ b/packages/@react-aria/checkbox/src/useCheckboxGroup.ts @@ -11,13 +11,13 @@ */ import {AriaCheckboxGroupProps} from '@react-types/checkbox'; -import {checkboxGroupDescriptionIds, checkboxGroupErrorMessageIds, checkboxGroupNames} from './utils'; +import {checkboxGroupData} from './utils'; import {CheckboxGroupState} from '@react-stately/checkbox'; -import {DOMAttributes} from '@react-types/shared'; +import {DOMAttributes, ValidationResult} from '@react-types/shared'; import {filterDOMProps, mergeProps} from '@react-aria/utils'; import {useField} from '@react-aria/label'; -export interface CheckboxGroupAria { +export interface CheckboxGroupAria extends ValidationResult { /** Props for the checkbox group wrapper element. */ groupProps: DOMAttributes, /** Props for the checkbox group's visible label (if any). */ @@ -35,22 +35,25 @@ export interface CheckboxGroupAria { * @param state - State for the checkbox group, as returned by `useCheckboxGroupState`. */ export function useCheckboxGroup(props: AriaCheckboxGroupProps, state: CheckboxGroupState): CheckboxGroupAria { - let {isDisabled, name} = props; + let {isDisabled, name, validationBehavior} = props; let {labelProps, fieldProps, descriptionProps, errorMessageProps} = useField({ ...props, // Checkbox group is not an HTML input element so it // shouldn't be labeled by a