@nypl/design-system-react-components 0.25.8 → 0.25.11
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 +110 -1
- package/README.md +1 -1
- package/dist/components/Button/Button.d.ts +6 -6
- package/dist/components/Button/ButtonTypes.d.ts +0 -1
- package/dist/components/Card/Card.d.ts +6 -4
- package/dist/components/Checkbox/Checkbox.d.ts +3 -2
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
- package/dist/components/DatePicker/DatePicker.d.ts +4 -3
- package/dist/components/Fieldset/Fieldset.d.ts +1 -3
- package/dist/components/Form/Form.d.ts +15 -14
- package/dist/components/Form/FormTypes.d.ts +2 -2
- package/dist/components/Heading/Heading.d.ts +7 -3
- package/dist/components/Heading/HeadingTypes.d.ts +6 -6
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +3 -3
- package/dist/components/Icons/Icon.d.ts +4 -4
- package/dist/components/Icons/IconSvgs.d.ts +0 -21
- package/dist/components/Icons/IconTypes.d.ts +0 -23
- package/dist/components/Image/Image.d.ts +11 -3
- package/dist/components/List/List.d.ts +1 -1
- package/dist/components/Logo/Logo.d.ts +28 -0
- package/dist/components/Logo/LogoSvgs.d.ts +34 -0
- package/dist/components/Logo/LogoTypes.d.ts +46 -0
- package/dist/components/Modal/Modal.d.ts +0 -4
- package/dist/components/Notification/Notification.d.ts +4 -2
- package/dist/components/Placeholder/Placeholder.d.ts +3 -5
- package/dist/components/Radio/Radio.d.ts +6 -5
- package/dist/components/RadioGroup/RadioGroup.d.ts +6 -5
- package/dist/components/SearchBar/SearchBar.d.ts +15 -7
- package/dist/components/Select/Select.d.ts +7 -2
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
- package/dist/components/Slider/Slider.d.ts +3 -2
- package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
- package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
- package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
- package/dist/components/Table/Table.d.ts +29 -0
- package/dist/components/Template/Template.d.ts +30 -6
- package/dist/components/Text/Text.d.ts +2 -2
- package/dist/components/TextInput/TextInput.d.ts +4 -3
- package/dist/components/Toggle/Toggle.d.ts +3 -2
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +14 -5
- package/dist/design-system-react-components.cjs.development.js +6721 -5777
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +6774 -5839
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/resources.scss +0 -2
- package/dist/styles.css +2 -2
- package/dist/theme/components/breadcrumb.d.ts +1 -1
- package/dist/theme/components/button.d.ts +0 -12
- package/dist/theme/components/card.d.ts +14 -2
- package/dist/theme/components/customTable.d.ts +56 -0
- package/dist/theme/components/fieldset.d.ts +2 -2
- package/dist/theme/components/global.d.ts +1 -1
- package/dist/theme/components/heading.d.ts +4 -0
- package/dist/theme/components/label.d.ts +1 -1
- package/dist/theme/components/link.d.ts +14 -1
- package/dist/theme/components/list.d.ts +0 -2
- package/dist/theme/components/logo.d.ts +4 -0
- package/dist/theme/components/notification.d.ts +13 -4
- package/dist/theme/components/searchBar.d.ts +9 -11
- package/dist/theme/components/select.d.ts +1 -0
- package/dist/theme/components/structuredContent.d.ts +33 -0
- package/dist/theme/components/template.d.ts +10 -10
- package/dist/theme/components/textInput.d.ts +4 -0
- package/dist/theme/components/toggle.d.ts +8 -5
- package/dist/utils/utils.d.ts +10 -0
- package/package.json +40 -37
- package/src/__tests__/utils/utils.test.ts +23 -1
- package/src/components/Accordion/Accordion.stories.mdx +15 -13
- package/src/components/Accordion/Accordion.test.tsx +45 -1
- package/src/components/Accordion/Accordion.tsx +20 -8
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
- package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
- package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
- package/src/components/Autosuggest/_Autosuggest.scss +2 -6
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +43 -13
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +15 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +5 -5
- package/src/components/Button/Button.stories.mdx +93 -48
- package/src/components/Button/Button.test.tsx +0 -12
- package/src/components/Button/Button.tsx +7 -7
- package/src/components/Button/ButtonTypes.tsx +0 -1
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
- package/src/components/Card/Card.stories.mdx +186 -71
- package/src/components/Card/Card.test.tsx +45 -22
- package/src/components/Card/Card.tsx +21 -6
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +9 -3
- package/src/components/Chakra/Box.stories.mdx +3 -3
- package/src/components/Chakra/Center.stories.mdx +5 -5
- package/src/components/Chakra/Flex.stories.mdx +113 -0
- package/src/components/Chakra/Grid.stories.mdx +3 -3
- package/src/components/Chakra/Stack.stories.mdx +2 -2
- package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
- package/src/components/Checkbox/Checkbox.tsx +13 -8
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
- package/src/components/DatePicker/DatePicker.test.tsx +6 -6
- package/src/components/DatePicker/DatePicker.tsx +17 -11
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +50 -24
- package/src/components/Fieldset/Fieldset.stories.mdx +20 -9
- package/src/components/Fieldset/Fieldset.tsx +2 -4
- package/src/components/Form/Form.stories.mdx +75 -49
- package/src/components/Form/Form.test.tsx +92 -3
- package/src/components/Form/Form.tsx +28 -23
- package/src/components/Form/FormTypes.tsx +2 -2
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
- package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
- package/src/components/Heading/Heading.stories.mdx +59 -23
- package/src/components/Heading/Heading.test.tsx +82 -18
- package/src/components/Heading/Heading.tsx +31 -31
- package/src/components/Heading/HeadingTypes.tsx +6 -6
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
- package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
- package/src/components/Hero/Hero.stories.mdx +72 -53
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +11 -9
- package/src/components/HorizontalRule/HorizontalRule.tsx +4 -6
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
- package/src/components/Icons/Icon.stories.mdx +78 -77
- package/src/components/Icons/Icon.test.tsx +1 -1
- package/src/components/Icons/Icon.tsx +5 -6
- package/src/components/Icons/IconSvgs.tsx +0 -42
- package/src/components/Icons/IconTypes.tsx +0 -24
- package/src/components/Image/Image.stories.mdx +66 -18
- package/src/components/Image/Image.tsx +21 -10
- package/src/components/Label/Label.stories.mdx +20 -19
- package/src/components/Link/Link.stories.mdx +102 -51
- package/src/components/Link/Link.test.tsx +38 -8
- package/src/components/Link/Link.tsx +19 -12
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +60 -0
- package/src/components/List/List.stories.mdx +60 -29
- package/src/components/List/List.test.tsx +1 -1
- package/src/components/List/List.tsx +2 -2
- package/src/components/List/__snapshots__/List.test.tsx.snap +3 -1
- package/src/components/Logo/Logo.stories.mdx +222 -0
- package/src/components/Logo/Logo.test.tsx +98 -0
- package/src/components/Logo/Logo.tsx +97 -0
- package/src/components/Logo/LogoSvgs.tsx +66 -0
- package/src/components/Logo/LogoTypes.tsx +48 -0
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
- package/src/components/Modal/Modal.stories.mdx +20 -5
- package/src/components/Modal/Modal.tsx +2 -8
- package/src/components/Notification/Notification.stories.mdx +128 -38
- package/src/components/Notification/Notification.test.tsx +49 -1
- package/src/components/Notification/Notification.tsx +25 -12
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +4 -0
- package/src/components/Pagination/Pagination.stories.mdx +18 -7
- package/src/components/Pagination/Pagination.tsx +3 -3
- package/src/components/Placeholder/Placeholder.tsx +7 -14
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +72 -43
- package/src/components/Radio/Radio.stories.mdx +39 -19
- package/src/components/Radio/Radio.tsx +13 -9
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
- package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
- package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
- package/src/components/RadioGroup/RadioGroup.tsx +97 -94
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +24 -21
- package/src/components/SearchBar/SearchBar.Test.tsx +160 -34
- package/src/components/SearchBar/SearchBar.stories.mdx +115 -33
- package/src/components/SearchBar/SearchBar.tsx +72 -51
- package/src/components/Select/Select.stories.mdx +48 -14
- package/src/components/Select/Select.test.tsx +89 -0
- package/src/components/Select/Select.tsx +27 -12
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
- package/src/components/Slider/Slider.stories.mdx +72 -22
- package/src/components/Slider/Slider.tsx +15 -10
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +67 -30
- package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
- package/src/components/StatusBadge/StatusBadge.tsx +2 -1
- package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
- package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
- package/src/components/StructuredContent/StructuredContent.tsx +153 -0
- package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
- package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
- package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
- package/src/components/StyleGuide/ColorCard.tsx +1 -2
- package/src/components/StyleGuide/Colors.stories.mdx +3 -11
- package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
- package/src/components/StyleGuide/Forms.stories.mdx +2 -10
- package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
- package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
- package/src/components/StyleGuide/Typography.stories.mdx +64 -76
- package/src/components/Table/Table.stories.mdx +165 -0
- package/src/components/Table/Table.test.tsx +137 -0
- package/src/components/Table/Table.tsx +126 -0
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
- package/src/components/Tabs/Tabs.stories.mdx +20 -14
- package/src/components/Tabs/Tabs.test.tsx +21 -5
- package/src/components/Tabs/Tabs.tsx +35 -20
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
- package/src/components/Template/Template.stories.mdx +132 -48
- package/src/components/Template/Template.test.tsx +128 -6
- package/src/components/Template/Template.tsx +93 -13
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +169 -0
- package/src/components/Text/Text.stories.mdx +33 -11
- package/src/components/Text/Text.tsx +2 -2
- package/src/components/TextInput/TextInput.stories.mdx +84 -17
- package/src/components/TextInput/TextInput.test.tsx +96 -0
- package/src/components/TextInput/TextInput.tsx +12 -8
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
- package/src/components/Toggle/Toggle.stories.mdx +33 -9
- package/src/components/Toggle/Toggle.tsx +14 -9
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +4 -4
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +64 -14
- package/src/components/VideoPlayer/VideoPlayer.tsx +17 -7
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +12 -6
- package/src/docs/Chakra.stories.mdx +5 -8
- package/src/docs/Intro.stories.mdx +2 -2
- package/src/index.ts +13 -6
- package/src/styles/base/_03-base.scss +1 -1
- package/src/styles/base/_place-holder.scss +7 -7
- package/src/styles.scss +1 -5
- package/src/theme/components/breadcrumb.ts +4 -4
- package/src/theme/components/button.ts +5 -12
- package/src/theme/components/card.ts +5 -2
- package/src/theme/components/checkbox.ts +1 -1
- package/src/theme/components/customTable.ts +63 -0
- package/src/theme/components/datePicker.ts +1 -1
- package/src/theme/components/global.ts +7 -7
- package/src/theme/components/heading.ts +13 -11
- package/src/theme/components/helperErrorText.ts +1 -1
- package/src/theme/components/image.ts +1 -1
- package/src/theme/components/link.ts +17 -5
- package/src/theme/components/list.ts +3 -5
- package/src/theme/components/logo.ts +54 -0
- package/src/theme/components/notification.ts +19 -9
- package/src/theme/components/searchBar.ts +11 -13
- package/src/theme/components/select.ts +1 -0
- package/src/theme/components/statusBadge.ts +1 -1
- package/src/theme/components/structuredContent.ts +74 -0
- package/src/theme/components/template.ts +10 -10
- package/src/theme/components/text.ts +6 -6
- package/src/theme/components/textInput.ts +2 -0
- package/src/theme/components/toggle.ts +10 -6
- package/src/theme/components/videoPlayer.ts +0 -2
- package/src/theme/foundations/global.ts +2 -2
- package/src/theme/foundations/typography.ts +84 -12
- package/src/theme/index.ts +6 -0
- package/src/utils/componentCategories.ts +2 -1
- package/src/utils/utils.ts +17 -0
- package/dist/__tests__/utils/bem.test.d.ts +0 -1
- package/dist/components/CardEdition/CardEdition.d.ts +0 -21
- package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
- package/dist/components/Input/Input.d.ts +0 -36
- package/dist/components/Input/Input.stories.d.ts +0 -29
- package/dist/components/Input/InputTypes.d.ts +0 -6
- package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
- package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
- package/dist/helpers/getCSSVariable.d.ts +0 -1
- package/dist/interfaces.d.ts +0 -3
- package/dist/utils/bem.d.ts +0 -1
- package/src/__tests__/utils/bem.test.ts +0 -37
- package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
- package/src/components/CardEdition/CardEdition.test.tsx +0 -395
- package/src/components/CardEdition/CardEdition.tsx +0 -60
- package/src/components/CardEdition/_CardEdition.scss +0 -137
- package/src/components/Input/Input.stories.tsx +0 -133
- package/src/components/Input/Input.test.tsx +0 -266
- package/src/components/Input/Input.tsx +0 -81
- package/src/components/Input/InputTypes.tsx +0 -8
- package/src/components/Input/_Input.scss +0 -78
- package/src/components/StyleGuide/UIDocCard.tsx +0 -36
- package/src/helpers/CSSVariablesHelper.tsx +0 -34
- package/src/helpers/getCSSVariable.tsx +0 -5
- package/src/interfaces.ts +0 -3
- package/src/utils/bem.ts +0 -44
|
@@ -9,7 +9,7 @@ import { DatePickerTypes } from "./DatePickerTypes";
|
|
|
9
9
|
import { TextInputRefType } from "../TextInput/TextInput";
|
|
10
10
|
|
|
11
11
|
/** This adds a "0" padding for date values under "10". */
|
|
12
|
-
const
|
|
12
|
+
const strPad = (n) => String("0" + n).slice(-2);
|
|
13
13
|
const monthArray = [
|
|
14
14
|
"January",
|
|
15
15
|
"February",
|
|
@@ -49,8 +49,8 @@ describe("DatePicker", () => {
|
|
|
49
49
|
/** Returns today's year, month, and day values. */
|
|
50
50
|
const getTodaysValues = () => {
|
|
51
51
|
const year = todaysDate.getFullYear();
|
|
52
|
-
const month =
|
|
53
|
-
const day =
|
|
52
|
+
const month = strPad(todaysDate.getMonth() + 1);
|
|
53
|
+
const day = strPad(todaysDate.getDate());
|
|
54
54
|
return [year, month, day];
|
|
55
55
|
};
|
|
56
56
|
/** Returns today's date in string format based on the DatePicker type. */
|
|
@@ -328,9 +328,9 @@ describe("DatePicker", () => {
|
|
|
328
328
|
expect(screen.getByDisplayValue(newDayValue)).toBeInTheDocument();
|
|
329
329
|
|
|
330
330
|
const { startDate } = dateObject;
|
|
331
|
-
const valueFromOnChange = `${startDate.getFullYear()}-${
|
|
331
|
+
const valueFromOnChange = `${startDate.getFullYear()}-${strPad(
|
|
332
332
|
startDate.getMonth() + 1
|
|
333
|
-
)}-${
|
|
333
|
+
)}-${strPad(startDate.getDate())}`;
|
|
334
334
|
expect(newDayValue).toEqual(valueFromOnChange);
|
|
335
335
|
});
|
|
336
336
|
|
|
@@ -724,7 +724,7 @@ describe("DatePicker", () => {
|
|
|
724
724
|
// We are two months ahead but still selecting the midmonth day.
|
|
725
725
|
userEvent.click(screen.getByText(midMonthDay));
|
|
726
726
|
// So only the month should change accordingly.
|
|
727
|
-
const newMonthValue = `${newDayValue.substr(0, 5)}${
|
|
727
|
+
const newMonthValue = `${newDayValue.substr(0, 5)}${strPad(
|
|
728
728
|
"10"
|
|
729
729
|
)}${newDayValue.substr(7)}`;
|
|
730
730
|
expect(screen.getByDisplayValue(newMonthValue)).toBeInTheDocument();
|
|
@@ -4,18 +4,20 @@ import ReactDatePicker from "react-datepicker";
|
|
|
4
4
|
import { DatePickerTypes } from "./DatePickerTypes";
|
|
5
5
|
import Fieldset from "../Fieldset/Fieldset";
|
|
6
6
|
import { FormRow, FormField } from "../Form/Form";
|
|
7
|
-
import {
|
|
8
|
-
import HelperErrorText
|
|
7
|
+
import { FormGaps } from "../Form/FormTypes";
|
|
8
|
+
import HelperErrorText, {
|
|
9
|
+
HelperErrorTextType,
|
|
10
|
+
} from "../HelperErrorText/HelperErrorText";
|
|
11
|
+
import { helperTextMargin } from "../../theme/components/global";
|
|
9
12
|
import TextInput, {
|
|
10
13
|
InputProps,
|
|
11
14
|
TextInputRefType,
|
|
12
15
|
} from "../TextInput/TextInput";
|
|
13
16
|
import generateUUID from "../../helpers/generateUUID";
|
|
14
|
-
import { useMultiStyleConfig } from "@chakra-ui/
|
|
17
|
+
import { Box, useMultiStyleConfig } from "@chakra-ui/react";
|
|
15
18
|
|
|
16
19
|
// The object shape for the DatePicker's start and end date state values.
|
|
17
|
-
|
|
18
|
-
interface FullDateType {
|
|
20
|
+
export interface FullDateType {
|
|
19
21
|
/** Date object that gets returned for the onChange
|
|
20
22
|
* function only for date ranges. */
|
|
21
23
|
endDate?: Date;
|
|
@@ -74,7 +76,7 @@ export interface DatePickerProps extends DatePickerWrapperProps {
|
|
|
74
76
|
/** DatePicker date types that can be rendered. */
|
|
75
77
|
dateType?: DatePickerTypes;
|
|
76
78
|
/** Populates the `HelperErrorText` component in this component. */
|
|
77
|
-
helperText?:
|
|
79
|
+
helperText?: HelperErrorTextType;
|
|
78
80
|
/** Populates the `HelperErrorText` component in the "From" `TextInput` component. */
|
|
79
81
|
helperTextFrom?: string;
|
|
80
82
|
/** Populates the `HelperErrorText` component in the "To" `TextInput` component. */
|
|
@@ -86,7 +88,7 @@ export interface DatePickerProps extends DatePickerWrapperProps {
|
|
|
86
88
|
initialDateTo?: string;
|
|
87
89
|
/** Populates the `HelperErrorText` error state for both "From"
|
|
88
90
|
* and "To" input components. */
|
|
89
|
-
invalidText?:
|
|
91
|
+
invalidText?: HelperErrorTextType;
|
|
90
92
|
/** Adds the 'disabled' property to the input element(s). */
|
|
91
93
|
isDisabled?: boolean;
|
|
92
94
|
/** Adds 'isInvalid' styling. */
|
|
@@ -215,7 +217,7 @@ const DateRangeRow: React.FC<DateRangeRowProps> = ({
|
|
|
215
217
|
children,
|
|
216
218
|
}) =>
|
|
217
219
|
isDateRange ? (
|
|
218
|
-
<FormRow id={`${id}-form-row`} gap={
|
|
220
|
+
<FormRow id={`${id}-form-row`} gap={FormGaps.ExtraSmall}>
|
|
219
221
|
{children}
|
|
220
222
|
</FormRow>
|
|
221
223
|
) : (
|
|
@@ -415,9 +417,13 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
|
|
|
415
417
|
)}
|
|
416
418
|
</DateRangeRow>
|
|
417
419
|
{helperText && isDateRange && showHelperInvalidText && (
|
|
418
|
-
<
|
|
419
|
-
|
|
420
|
-
|
|
420
|
+
<Box __css={helperTextMargin}>
|
|
421
|
+
<HelperErrorText
|
|
422
|
+
id={`${id}-helper-text`}
|
|
423
|
+
isInvalid={false}
|
|
424
|
+
text={helperText}
|
|
425
|
+
/>
|
|
426
|
+
</Box>
|
|
421
427
|
)}
|
|
422
428
|
</DatePickerWrapper>
|
|
423
429
|
);
|
|
@@ -363,11 +363,14 @@ exports[`DatePicker Date Range renders the UI snapshot correctly 4`] = `
|
|
|
363
363
|
aria-atomic={true}
|
|
364
364
|
aria-live="polite"
|
|
365
365
|
className=" css-0"
|
|
366
|
+
dangerouslySetInnerHTML={
|
|
367
|
+
Object {
|
|
368
|
+
"__html": "Please select a valid date.",
|
|
369
|
+
}
|
|
370
|
+
}
|
|
366
371
|
data-isinvalid={true}
|
|
367
372
|
id="invalid-start-helperText"
|
|
368
|
-
|
|
369
|
-
Please select a valid date.
|
|
370
|
-
</div>
|
|
373
|
+
/>
|
|
371
374
|
</div>
|
|
372
375
|
</div>
|
|
373
376
|
</div>
|
|
@@ -415,11 +418,14 @@ exports[`DatePicker Date Range renders the UI snapshot correctly 4`] = `
|
|
|
415
418
|
aria-atomic={true}
|
|
416
419
|
aria-live="polite"
|
|
417
420
|
className=" css-0"
|
|
421
|
+
dangerouslySetInnerHTML={
|
|
422
|
+
Object {
|
|
423
|
+
"__html": "Please select a valid date.",
|
|
424
|
+
}
|
|
425
|
+
}
|
|
418
426
|
data-isinvalid={true}
|
|
419
427
|
id="invalid-end-helperText"
|
|
420
|
-
|
|
421
|
-
Please select a valid date.
|
|
422
|
-
</div>
|
|
428
|
+
/>
|
|
423
429
|
</div>
|
|
424
430
|
</div>
|
|
425
431
|
</div>
|
|
@@ -427,13 +433,20 @@ exports[`DatePicker Date Range renders the UI snapshot correctly 4`] = `
|
|
|
427
433
|
</div>
|
|
428
434
|
</div>
|
|
429
435
|
<div
|
|
430
|
-
|
|
431
|
-
aria-live="off"
|
|
432
|
-
className=" css-0"
|
|
433
|
-
data-isinvalid={false}
|
|
434
|
-
id="invalid-helper-text"
|
|
436
|
+
className="css-fjhuh4"
|
|
435
437
|
>
|
|
436
|
-
|
|
438
|
+
<div
|
|
439
|
+
aria-atomic={true}
|
|
440
|
+
aria-live="off"
|
|
441
|
+
className=" css-0"
|
|
442
|
+
dangerouslySetInnerHTML={
|
|
443
|
+
Object {
|
|
444
|
+
"__html": "Note that the Library may be closed on Sundays.",
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
data-isinvalid={false}
|
|
448
|
+
id="invalid-helper-text"
|
|
449
|
+
/>
|
|
437
450
|
</div>
|
|
438
451
|
</fieldset>
|
|
439
452
|
</div>
|
|
@@ -536,13 +549,20 @@ exports[`DatePicker Date Range renders the UI snapshot correctly 5`] = `
|
|
|
536
549
|
</div>
|
|
537
550
|
</div>
|
|
538
551
|
<div
|
|
539
|
-
|
|
540
|
-
aria-live="off"
|
|
541
|
-
className=" css-0"
|
|
542
|
-
data-isinvalid={false}
|
|
543
|
-
id="disabled-helper-text"
|
|
552
|
+
className="css-fjhuh4"
|
|
544
553
|
>
|
|
545
|
-
|
|
554
|
+
<div
|
|
555
|
+
aria-atomic={true}
|
|
556
|
+
aria-live="off"
|
|
557
|
+
className=" css-0"
|
|
558
|
+
dangerouslySetInnerHTML={
|
|
559
|
+
Object {
|
|
560
|
+
"__html": "Note that the Library may be closed on Sundays.",
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
data-isinvalid={false}
|
|
564
|
+
id="disabled-helper-text"
|
|
565
|
+
/>
|
|
546
566
|
</div>
|
|
547
567
|
</fieldset>
|
|
548
568
|
</div>
|
|
@@ -740,11 +760,14 @@ exports[`DatePicker Single input renders the UI snapshot correctly 4`] = `
|
|
|
740
760
|
aria-atomic={true}
|
|
741
761
|
aria-live="polite"
|
|
742
762
|
className=" css-0"
|
|
763
|
+
dangerouslySetInnerHTML={
|
|
764
|
+
Object {
|
|
765
|
+
"__html": "Please select a valid date.",
|
|
766
|
+
}
|
|
767
|
+
}
|
|
743
768
|
data-isinvalid={true}
|
|
744
769
|
id="invalid-start-helperText"
|
|
745
|
-
|
|
746
|
-
Please select a valid date.
|
|
747
|
-
</div>
|
|
770
|
+
/>
|
|
748
771
|
</div>
|
|
749
772
|
</div>
|
|
750
773
|
</div>
|
|
@@ -805,11 +828,14 @@ exports[`DatePicker Single input renders the UI snapshot correctly 5`] = `
|
|
|
805
828
|
aria-atomic={true}
|
|
806
829
|
aria-live="off"
|
|
807
830
|
className=" css-0"
|
|
831
|
+
dangerouslySetInnerHTML={
|
|
832
|
+
Object {
|
|
833
|
+
"__html": "Note that the Library may be closed on Sundays.",
|
|
834
|
+
}
|
|
835
|
+
}
|
|
808
836
|
data-isinvalid={false}
|
|
809
837
|
id="disabled-start-helperText"
|
|
810
|
-
|
|
811
|
-
Note that the Library may be closed on Sundays.
|
|
812
|
-
</div>
|
|
838
|
+
/>
|
|
813
839
|
</div>
|
|
814
840
|
</div>
|
|
815
841
|
</div>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Meta,
|
|
3
|
-
Story,
|
|
4
|
-
Canvas,
|
|
5
2
|
ArgsTable,
|
|
3
|
+
Canvas,
|
|
6
4
|
Description,
|
|
7
|
-
|
|
5
|
+
Meta,
|
|
6
|
+
Story,
|
|
7
|
+
} from "@storybook/addon-docs";
|
|
8
8
|
import { withDesign } from "storybook-addon-designs";
|
|
9
9
|
|
|
10
10
|
import Fieldset from "./Fieldset";
|
|
@@ -20,8 +20,17 @@ import DSProvider from "../../theme/provider";
|
|
|
20
20
|
}}
|
|
21
21
|
argTypes={{
|
|
22
22
|
children: { table: { disable: true } },
|
|
23
|
-
className: {
|
|
24
|
-
id: {
|
|
23
|
+
className: { control: false },
|
|
24
|
+
id: { control: false },
|
|
25
|
+
isLegendHidden: {
|
|
26
|
+
table: { defaultValue: { summary: false } },
|
|
27
|
+
},
|
|
28
|
+
isRequired: {
|
|
29
|
+
table: { defaultValue: { summary: false } },
|
|
30
|
+
},
|
|
31
|
+
optReqFlag: {
|
|
32
|
+
table: { defaultValue: { summary: false } },
|
|
33
|
+
},
|
|
25
34
|
}}
|
|
26
35
|
/>
|
|
27
36
|
|
|
@@ -30,14 +39,16 @@ import DSProvider from "../../theme/provider";
|
|
|
30
39
|
| Component Version | DS Version |
|
|
31
40
|
| ----------------- | ---------- |
|
|
32
41
|
| Added | `0.25.3` |
|
|
33
|
-
| Latest | `0.25.
|
|
42
|
+
| Latest | `0.25.10` |
|
|
34
43
|
|
|
35
44
|
<Description of={Fieldset} />
|
|
36
45
|
|
|
37
46
|
<Canvas withToolbar>
|
|
38
47
|
<Story
|
|
39
|
-
name="
|
|
48
|
+
name="Fieldset"
|
|
40
49
|
args={{
|
|
50
|
+
className: undefined,
|
|
51
|
+
id: "fieldset-id",
|
|
41
52
|
isLegendHidden: false,
|
|
42
53
|
isRequired: false,
|
|
43
54
|
legendText: "This is the legend text",
|
|
@@ -52,4 +63,4 @@ import DSProvider from "../../theme/provider";
|
|
|
52
63
|
</Story>
|
|
53
64
|
</Canvas>
|
|
54
65
|
|
|
55
|
-
<ArgsTable story="
|
|
66
|
+
<ArgsTable story="Fieldset" />
|
|
@@ -2,8 +2,6 @@ import React from "react";
|
|
|
2
2
|
import { Box, useMultiStyleConfig } from "@chakra-ui/react";
|
|
3
3
|
|
|
4
4
|
interface FieldsetProps {
|
|
5
|
-
/** Children to render. Typically form-related components are used. */
|
|
6
|
-
children: React.ReactNode;
|
|
7
5
|
/** Additional class name to add. */
|
|
8
6
|
className?: string;
|
|
9
7
|
/** ID that other components can cross reference for accessibility purposes */
|
|
@@ -24,7 +22,7 @@ interface FieldsetProps {
|
|
|
24
22
|
* A wrapper component that renders a `fieldset` element along with a `legend`
|
|
25
23
|
* element as its first child. Commonly used to wrap form components.
|
|
26
24
|
*/
|
|
27
|
-
const Fieldset
|
|
25
|
+
const Fieldset = ({
|
|
28
26
|
children,
|
|
29
27
|
className,
|
|
30
28
|
id,
|
|
@@ -32,7 +30,7 @@ const Fieldset: React.FC<FieldsetProps> = ({
|
|
|
32
30
|
isRequired = false,
|
|
33
31
|
legendText,
|
|
34
32
|
optReqFlag = true,
|
|
35
|
-
}) => {
|
|
33
|
+
}: React.PropsWithChildren<FieldsetProps>) => {
|
|
36
34
|
const styles = useMultiStyleConfig("Fieldset", { isLegendHidden });
|
|
37
35
|
return (
|
|
38
36
|
<Box as="fieldset" id={id} __css={styles} className={className}>
|
|
@@ -1,31 +1,33 @@
|
|
|
1
|
+
import { action } from "@storybook/addon-actions";
|
|
1
2
|
import {
|
|
2
|
-
Meta,
|
|
3
|
-
Story,
|
|
4
|
-
Canvas,
|
|
5
3
|
ArgsTable,
|
|
4
|
+
Canvas,
|
|
6
5
|
Description,
|
|
7
|
-
|
|
6
|
+
Meta,
|
|
7
|
+
Story,
|
|
8
|
+
} from "@storybook/addon-docs";
|
|
8
9
|
import { withDesign } from "storybook-addon-designs";
|
|
9
|
-
import { getCategory } from "../../utils/componentCategories";
|
|
10
10
|
|
|
11
|
-
import
|
|
12
|
-
import { FormSpacing } from "./FormTypes";
|
|
13
|
-
import TextInput from "../TextInput/TextInput";
|
|
14
|
-
import Radio from "../Radio/Radio";
|
|
15
|
-
import RadioGroup from "../RadioGroup/RadioGroup";
|
|
11
|
+
import Button from "../Button/Button";
|
|
16
12
|
import Checkbox from "../Checkbox/Checkbox";
|
|
17
13
|
import CheckboxGroup from "../CheckboxGroup/CheckboxGroup";
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
14
|
+
import DatePicker from "../DatePicker/DatePicker";
|
|
15
|
+
import { DatePickerTypes } from "../DatePicker/DatePickerTypes";
|
|
16
|
+
import Form, { FormRow, FormField } from "./Form";
|
|
17
|
+
import { FormGaps } from "./FormTypes";
|
|
21
18
|
import Heading from "../Heading/Heading";
|
|
22
19
|
import { HeadingLevels } from "../Heading/HeadingTypes";
|
|
23
20
|
import HorizontalRule from "../HorizontalRule/HorizontalRule";
|
|
24
|
-
import
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
-
|
|
21
|
+
import Label from "../Label/Label";
|
|
22
|
+
import Radio from "../Radio/Radio";
|
|
23
|
+
import RadioGroup from "../RadioGroup/RadioGroup";
|
|
24
|
+
import Select from "../Select/Select";
|
|
25
|
+
import TextInput from "../TextInput/TextInput";
|
|
26
|
+
import { getCategory } from "../../utils/componentCategories";
|
|
28
27
|
import SimpleGrid from "../Grid/SimpleGrid";
|
|
28
|
+
import { getStorybookEnumValues } from "../../utils/utils";
|
|
29
|
+
|
|
30
|
+
export const enumValues = getStorybookEnumValues(FormGaps, "FormGaps");
|
|
29
31
|
|
|
30
32
|
<Meta
|
|
31
33
|
title={getCategory("Form")}
|
|
@@ -34,11 +36,23 @@ import SimpleGrid from "../Grid/SimpleGrid";
|
|
|
34
36
|
parameters={{
|
|
35
37
|
design: {
|
|
36
38
|
type: "figma",
|
|
37
|
-
url:
|
|
38
|
-
"https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=11895%3A547",
|
|
39
|
+
url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=11895%3A547",
|
|
39
40
|
},
|
|
40
41
|
jest: ["Form.test.tsx"],
|
|
41
42
|
}}
|
|
43
|
+
argTypes={{
|
|
44
|
+
action: { control: false },
|
|
45
|
+
id: { control: false },
|
|
46
|
+
method: {
|
|
47
|
+
control: { type: "radio" },
|
|
48
|
+
options: ["get", "post"],
|
|
49
|
+
},
|
|
50
|
+
gap: {
|
|
51
|
+
control: { type: "select" },
|
|
52
|
+
table: { defaultValue: { summary: "FormGaps.Large" } },
|
|
53
|
+
options: enumValues.options,
|
|
54
|
+
},
|
|
55
|
+
}}
|
|
42
56
|
/>
|
|
43
57
|
|
|
44
58
|
# Form
|
|
@@ -46,35 +60,45 @@ import SimpleGrid from "../Grid/SimpleGrid";
|
|
|
46
60
|
| Component Version | DS Version |
|
|
47
61
|
| ----------------- | ---------- |
|
|
48
62
|
| Added | `0.23.2` |
|
|
49
|
-
| Latest | `0.25.
|
|
63
|
+
| Latest | `0.25.10` |
|
|
50
64
|
|
|
51
65
|
<Description of={Form} />
|
|
52
66
|
|
|
53
|
-
The `Form` component renders a standard `<form>` element and should be used to
|
|
67
|
+
The `Form` component renders a standard `<form>` element and should be used to
|
|
68
|
+
handle layout and spacing for child input fields. `FormRow` and `FormField`
|
|
69
|
+
components should be used to build the `<form>` structure and to arrange input
|
|
70
|
+
fields as needed.
|
|
54
71
|
|
|
55
|
-
|
|
72
|
+
```jsx
|
|
73
|
+
<Form>
|
|
74
|
+
<FormRow>
|
|
75
|
+
<FormField>{/* ... */}</FormField>
|
|
76
|
+
</FormRow>
|
|
77
|
+
<FormRow>
|
|
78
|
+
<FormField>{/* ... */}</FormField>
|
|
79
|
+
</FormRow>
|
|
80
|
+
</Form>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`FormField` should be used as a parent for all input components from the DS
|
|
84
|
+
(`Button`, `Select`, `TextInput`, etc.).
|
|
56
85
|
|
|
57
|
-
`FormRow` should be used as a parent of multiple `FormField` components when you
|
|
86
|
+
`FormRow` should be used as a parent of multiple `FormField` components when you
|
|
87
|
+
need to render multiple input components in a horizontal row.
|
|
58
88
|
|
|
59
89
|
<Canvas withToolbar>
|
|
60
90
|
<Story
|
|
61
|
-
name="Form"
|
|
91
|
+
name="Form with Controls"
|
|
62
92
|
args={{
|
|
63
93
|
action: "/end/point",
|
|
64
|
-
|
|
94
|
+
className: undefined,
|
|
95
|
+
id: "form-id",
|
|
65
96
|
method: "get",
|
|
66
|
-
|
|
67
|
-
argTypes={{
|
|
68
|
-
method: {
|
|
69
|
-
control: {
|
|
70
|
-
type: "radio",
|
|
71
|
-
options: ["get", "post"],
|
|
72
|
-
},
|
|
73
|
-
},
|
|
97
|
+
gap: "FormGaps.Large",
|
|
74
98
|
}}
|
|
75
99
|
>
|
|
76
100
|
{(args) => (
|
|
77
|
-
<Form {...args}>
|
|
101
|
+
<Form {...args} gap={enumValues.getValue(args.gap)}>
|
|
78
102
|
<FormRow>
|
|
79
103
|
<FormField>
|
|
80
104
|
<TextInput
|
|
@@ -95,15 +119,15 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
95
119
|
id="date-range"
|
|
96
120
|
dateType={DatePickerTypes.Full}
|
|
97
121
|
dateFormat="yyyy-MM-dd"
|
|
98
|
-
dateRange={true}
|
|
99
|
-
minDate="1/1/2021"
|
|
100
|
-
maxDate="1/1/2022"
|
|
101
|
-
labelText="Select the date range you want to visit NYPL"
|
|
102
|
-
nameFrom="visit-dates"
|
|
103
122
|
helperTextFrom="From this date."
|
|
104
123
|
helperTextTo="To this date."
|
|
105
124
|
helperText="Select a valid date range."
|
|
106
125
|
invalidText="Please select a valid date range."
|
|
126
|
+
isDateRange
|
|
127
|
+
labelText="Select the date range you want to visit NYPL"
|
|
128
|
+
minDate="1/1/2021"
|
|
129
|
+
maxDate="1/1/2022"
|
|
130
|
+
nameFrom="visit-dates"
|
|
107
131
|
showLabel={false}
|
|
108
132
|
/>
|
|
109
133
|
</FormField>
|
|
@@ -188,16 +212,16 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
188
212
|
</Story>
|
|
189
213
|
</Canvas>
|
|
190
214
|
|
|
191
|
-
<ArgsTable story="Form" />
|
|
215
|
+
<ArgsTable story="Form with Controls" />
|
|
192
216
|
|
|
193
217
|
## Spacing Variants
|
|
194
218
|
|
|
195
|
-
export const formRow = (size) => {
|
|
196
|
-
const labelText = `Size: ${size}`;
|
|
219
|
+
export const formRow = (nameString, size) => {
|
|
220
|
+
const labelText = `Size: ${nameString} (${size})`;
|
|
197
221
|
return (
|
|
198
|
-
<li>
|
|
222
|
+
<li key={size}>
|
|
199
223
|
<Heading level={HeadingLevels.Three}>{labelText}</Heading>
|
|
200
|
-
<Form
|
|
224
|
+
<Form gap={size}>
|
|
201
225
|
<FormRow>
|
|
202
226
|
<FormField>
|
|
203
227
|
<Select
|
|
@@ -242,16 +266,18 @@ export const formRow = (size) => {
|
|
|
242
266
|
);
|
|
243
267
|
};
|
|
244
268
|
export const sizes = [];
|
|
245
|
-
for (const
|
|
246
|
-
sizes.push(formRow(
|
|
269
|
+
for (const FormGaps in FormGaps) {
|
|
270
|
+
sizes.push(formRow(`FormGaps.${FormGaps}`, FormGaps[FormGaps]));
|
|
247
271
|
}
|
|
248
272
|
export const getForms = (list) => <ul style={{ listStyle: "none" }}>{list}</ul>;
|
|
249
273
|
|
|
250
|
-
By default, the `Form` component will handle the NYPL spacing around form input
|
|
274
|
+
By default, the `Form` component will handle the NYPL spacing around form input
|
|
275
|
+
elements. The default spacing value is `large`, which corresponds to the CSS
|
|
276
|
+
variable `--nypl-space-l` (2rem / 32px).
|
|
251
277
|
|
|
252
278
|
**IMPORTANT:** The default spacing should not be overwritten without a very good reason.
|
|
253
279
|
|
|
254
|
-
Below are the spacing variants available with the `
|
|
280
|
+
Below are the spacing variants available with the `FormGaps` enum.
|
|
255
281
|
|
|
256
282
|
<Canvas>
|
|
257
283
|
<Story
|
|
@@ -269,7 +295,7 @@ Below are the spacing variants available with the `FormSpacing` enum.
|
|
|
269
295
|
<Story name="Example Code" />
|
|
270
296
|
|
|
271
297
|
```jsx
|
|
272
|
-
<Form action="/end/point" method="get">
|
|
298
|
+
<Form action="/end/point" method="get" gap={FormGaps.Large}>
|
|
273
299
|
<FormField>
|
|
274
300
|
<TextInput
|
|
275
301
|
labelText="Username"
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { render, screen } from "@testing-library/react";
|
|
2
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
3
|
import { axe } from "jest-axe";
|
|
4
4
|
import renderer from "react-test-renderer";
|
|
5
5
|
|
|
6
6
|
import Form, { FormRow, FormField } from "./Form";
|
|
7
|
-
// import {
|
|
7
|
+
// import { FormGaps } from "./FormTypes";
|
|
8
8
|
import TextInput from "../TextInput/TextInput";
|
|
9
9
|
|
|
10
10
|
describe("Form Accessibility", () => {
|
|
@@ -12,6 +12,19 @@ describe("Form Accessibility", () => {
|
|
|
12
12
|
const { container } = render(<Form />);
|
|
13
13
|
expect(await axe(container)).toHaveNoViolations();
|
|
14
14
|
});
|
|
15
|
+
|
|
16
|
+
it("passes axe accessibility test for the full hierachy", async () => {
|
|
17
|
+
const { container } = render(
|
|
18
|
+
<Form>
|
|
19
|
+
<FormRow>
|
|
20
|
+
<FormField>Form Field 1</FormField>
|
|
21
|
+
<FormField>Form Field 2</FormField>
|
|
22
|
+
<FormField>Form Field 3</FormField>
|
|
23
|
+
</FormRow>
|
|
24
|
+
</Form>
|
|
25
|
+
);
|
|
26
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
27
|
+
});
|
|
15
28
|
});
|
|
16
29
|
|
|
17
30
|
describe("Form Snapshot", () => {
|
|
@@ -101,11 +114,87 @@ describe("Form", () => {
|
|
|
101
114
|
expect(form).toHaveAttribute("method", "get");
|
|
102
115
|
});
|
|
103
116
|
|
|
117
|
+
it("passes down the `Form`'s id down to its children", () => {
|
|
118
|
+
const { container } = render(
|
|
119
|
+
<Form id="formId">
|
|
120
|
+
<FormRow>
|
|
121
|
+
<FormField>
|
|
122
|
+
<TextInput labelText="Input Field" />
|
|
123
|
+
</FormField>
|
|
124
|
+
<FormField>
|
|
125
|
+
<TextInput labelText="Input Field" />
|
|
126
|
+
</FormField>
|
|
127
|
+
</FormRow>
|
|
128
|
+
<FormRow>
|
|
129
|
+
<FormField>
|
|
130
|
+
<TextInput labelText="Input Field" />
|
|
131
|
+
</FormField>
|
|
132
|
+
<FormField>
|
|
133
|
+
<TextInput labelText="Input Field" />
|
|
134
|
+
</FormField>
|
|
135
|
+
</FormRow>
|
|
136
|
+
</Form>
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
expect(container.querySelector("#formId")).toBeInTheDocument();
|
|
140
|
+
// The first `FormRow` adds "child0" to its id
|
|
141
|
+
expect(container.querySelector("#formId-child0")).toBeInTheDocument();
|
|
142
|
+
// The first `FormRow`'s first `FormField` adds "grandchild0" to its id
|
|
143
|
+
expect(
|
|
144
|
+
container.querySelector("#formId-child0-grandchild0")
|
|
145
|
+
).toBeInTheDocument();
|
|
146
|
+
// The first `FormRow`'s second `FormField` adds "grandchild1" to its id
|
|
147
|
+
expect(
|
|
148
|
+
container.querySelector("#formId-child0-grandchild1")
|
|
149
|
+
).toBeInTheDocument();
|
|
150
|
+
// The second `FormRow` adds "child1" to its id
|
|
151
|
+
expect(container.querySelector("#formId-child1")).toBeInTheDocument();
|
|
152
|
+
// The second `FormRow`'s first `FormField` adds "grandchild0" to its id
|
|
153
|
+
expect(
|
|
154
|
+
container.querySelector("#formId-child1-grandchild0")
|
|
155
|
+
).toBeInTheDocument();
|
|
156
|
+
// The second `FormRow`'s second `FormField` adds "grandchild1" to its id
|
|
157
|
+
expect(
|
|
158
|
+
container.querySelector("#formId-child1-grandchild1")
|
|
159
|
+
).toBeInTheDocument();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("logs a warning if a child of `FormRow` is not a `FormField`", () => {
|
|
163
|
+
const warn = jest.spyOn(console, "warn");
|
|
164
|
+
render(
|
|
165
|
+
<Form>
|
|
166
|
+
<FormRow>
|
|
167
|
+
<div>Not a FormField</div>
|
|
168
|
+
</FormRow>
|
|
169
|
+
</Form>
|
|
170
|
+
);
|
|
171
|
+
expect(warn).toHaveBeenCalledWith(
|
|
172
|
+
"FormRow children must be `FormField` components."
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("calls the onSubmit function", () => {
|
|
177
|
+
const onSubmit = jest.fn();
|
|
178
|
+
render(
|
|
179
|
+
<Form onSubmit={onSubmit}>
|
|
180
|
+
<FormRow>
|
|
181
|
+
<FormField>
|
|
182
|
+
<TextInput labelText="Input Field" />
|
|
183
|
+
</FormField>
|
|
184
|
+
</FormRow>
|
|
185
|
+
</Form>
|
|
186
|
+
);
|
|
187
|
+
const form = screen.getByRole("form");
|
|
188
|
+
expect(onSubmit).toHaveBeenCalledTimes(0);
|
|
189
|
+
fireEvent.submit(form);
|
|
190
|
+
expect(onSubmit).toHaveBeenCalledTimes(1);
|
|
191
|
+
});
|
|
192
|
+
|
|
104
193
|
// TO DO: There's somethign weird about checking for the "grid-gap" style.
|
|
105
194
|
// Other styles can be validated, but "grid-gap" is being ellusive.
|
|
106
195
|
// it("Renders a <form> element with spacing variant applied", () => {
|
|
107
196
|
// render(
|
|
108
|
-
// <Form
|
|
197
|
+
// <Form gap={FormGaps.ExtraSmall}>
|
|
109
198
|
// <FormRow />
|
|
110
199
|
// </Form>
|
|
111
200
|
// );
|