@nypl/design-system-react-components 0.25.0 → 0.25.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 +30 -0
- package/dist/components/Accordion/Accordion.d.ts +14 -14
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
- package/dist/components/Button/ButtonTypes.d.ts +2 -1
- package/dist/components/Card/Card.d.ts +1 -1
- package/dist/components/Card/CardTypes.d.ts +2 -2
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
- package/dist/components/DatePicker/DatePicker.d.ts +3 -3
- package/dist/components/Form/Form.d.ts +13 -8
- package/dist/components/Form/FormTypes.d.ts +2 -8
- package/dist/components/Grid/GridTypes.d.ts +9 -0
- package/dist/components/Grid/SimpleGrid.d.ts +14 -0
- package/dist/components/Heading/Heading.d.ts +4 -4
- package/dist/components/Hero/Hero.d.ts +19 -14
- package/dist/components/Hero/HeroTypes.d.ts +10 -5
- package/dist/components/Icons/Icon.d.ts +13 -16
- package/dist/components/Icons/IconTypes.d.ts +78 -64
- package/dist/components/Label/Label.d.ts +5 -17
- package/dist/components/Link/Link.d.ts +8 -12
- package/dist/components/SearchBar/SearchBar.d.ts +45 -27
- package/dist/components/Select/Select.d.ts +32 -35
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
- package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
- package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
- package/dist/components/Template/Template.d.ts +91 -0
- package/dist/components/Text/Text.d.ts +16 -0
- package/dist/components/Text/TextTypes.d.ts +6 -0
- package/dist/components/TextInput/TextInput.d.ts +32 -31
- package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
- package/dist/design-system-react-components.cjs.development.js +2597 -1170
- 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 +2580 -1173
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +25 -0
- package/dist/theme/components/breadcrumb.d.ts +90 -0
- package/dist/theme/components/button.d.ts +17 -7
- package/dist/theme/components/checkbox.d.ts +7 -7
- package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
- package/dist/theme/components/customRadioGroup.d.ts +4 -3
- package/dist/theme/components/global.d.ts +55 -0
- package/dist/theme/components/globalMixins.d.ts +15 -0
- package/dist/theme/components/heading.d.ts +50 -20
- package/dist/theme/components/hero.d.ts +492 -0
- package/dist/theme/components/icon.d.ts +13 -0
- package/dist/theme/components/label.d.ts +16 -0
- package/dist/theme/components/link.d.ts +45 -0
- package/dist/theme/components/radio.d.ts +8 -7
- package/dist/theme/components/searchBar.d.ts +20 -0
- package/dist/theme/components/select.d.ts +58 -0
- package/dist/theme/components/statusBadge.d.ts +25 -0
- package/dist/theme/components/tabs.d.ts +9 -9
- package/dist/theme/components/template.d.ts +105 -0
- package/dist/theme/components/text.d.ts +20 -0
- package/dist/theme/components/textInput.d.ts +105 -0
- package/dist/theme/foundations/global.d.ts +3 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/utils/utils.d.ts +6 -0
- package/package.json +3 -2
- package/src/components/Accordion/Accordion.stories.mdx +227 -33
- package/src/components/Accordion/Accordion.test.tsx +135 -19
- package/src/components/Accordion/Accordion.tsx +81 -56
- package/src/components/Autosuggest/Autosuggest.stories.mdx +1 -1
- package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
- package/src/components/Autosuggest/_Autosuggest.scss +2 -2
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +46 -52
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
- package/src/components/Button/Button.stories.mdx +31 -27
- package/src/components/Button/Button.test.tsx +17 -5
- package/src/components/Button/ButtonTypes.tsx +1 -0
- package/src/components/Button/_Button.scss +3 -27
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +11 -0
- package/src/components/Card/Card.stories.mdx +24 -20
- package/src/components/Card/Card.test.tsx +13 -19
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Card/CardTypes.tsx +2 -2
- package/src/components/Card/_Card.scss +1 -1
- package/src/components/CardEdition/CardEdition.stories.tsx +11 -6
- package/src/components/CardEdition/CardEdition.test.tsx +23 -31
- package/src/components/CardEdition/_CardEdition.scss +2 -2
- package/src/components/Chakra/Center.stories.mdx +31 -14
- package/src/components/Chakra/Grid.stories.mdx +79 -0
- package/src/components/Chakra/Stack.stories.mdx +4 -4
- package/src/components/Checkbox/Checkbox.tsx +9 -12
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +2 -5
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
- package/src/components/DatePicker/DatePicker.test.tsx +4 -4
- package/src/components/DatePicker/DatePicker.tsx +13 -13
- package/src/components/DatePicker/_DatePicker.scss +1 -0
- package/src/components/Form/Form.stories.mdx +46 -21
- package/src/components/Form/Form.test.tsx +58 -45
- package/src/components/Form/Form.tsx +49 -21
- package/src/components/Form/FormTypes.tsx +3 -8
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
- package/src/components/Grid/GridTypes.tsx +9 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
- package/src/components/Grid/SimpleGrid.test.tsx +66 -0
- package/src/components/Grid/SimpleGrid.tsx +37 -0
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
- package/src/components/Heading/Heading.stories.mdx +1 -0
- package/src/components/Heading/Heading.tsx +12 -6
- package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
- package/src/components/Hero/Hero.stories.mdx +188 -121
- package/src/components/Hero/Hero.test.tsx +537 -107
- package/src/components/Hero/Hero.tsx +79 -92
- package/src/components/Hero/HeroTypes.tsx +17 -5
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
- package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
- package/src/components/Icons/Icon.stories.mdx +83 -74
- package/src/components/Icons/Icon.test.tsx +30 -22
- package/src/components/Icons/Icon.tsx +63 -61
- package/src/components/Icons/IconTypes.tsx +80 -64
- package/src/components/Input/_Input.scss +2 -2
- package/src/components/Label/Label.stories.mdx +28 -7
- package/src/components/Label/Label.test.tsx +43 -12
- package/src/components/Label/Label.tsx +21 -34
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
- package/src/components/Link/Link.stories.mdx +41 -41
- package/src/components/Link/Link.test.tsx +33 -44
- package/src/components/Link/Link.tsx +114 -100
- package/src/components/List/List.stories.mdx +0 -2
- package/src/components/List/List.stories.tsx +5 -5
- package/src/components/List/_List.scss +3 -3
- package/src/components/Modal/_Modal.scss +1 -1
- package/src/components/Notification/Notification.stories.mdx +12 -1
- package/src/components/Notification/Notification.test.tsx +3 -16
- package/src/components/Notification/Notification.tsx +9 -10
- package/src/components/Notification/_Notification.scss +4 -4
- package/src/components/Pagination/Pagination.test.tsx +16 -10
- package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
- package/src/components/RadioGroup/RadioGroup.tsx +2 -10
- package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
- package/src/components/SearchBar/SearchBar.stories.mdx +189 -219
- package/src/components/SearchBar/SearchBar.tsx +151 -46
- package/src/components/Select/Select.stories.mdx +188 -170
- package/src/components/Select/Select.test.tsx +125 -380
- package/src/components/Select/Select.tsx +118 -165
- package/src/components/Select/SelectTypes.tsx +4 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +13 -25
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
- package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
- package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
- package/src/components/StatusBadge/StatusBadge.tsx +24 -25
- package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +16 -16
- package/src/components/StyleGuide/Buttons.stories.mdx +15 -15
- package/src/components/StyleGuide/Colors.stories.mdx +336 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +88 -90
- package/src/components/StyleGuide/UIDocCard.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +7 -9
- package/src/components/Template/Template.stories.mdx +574 -0
- package/src/components/Template/Template.test.tsx +124 -0
- package/src/components/Template/Template.tsx +226 -0
- package/src/components/Text/Text.stories.mdx +70 -0
- package/src/components/Text/Text.test.tsx +63 -0
- package/src/components/Text/Text.tsx +55 -0
- package/src/components/Text/TextTypes.tsx +6 -0
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
- package/src/components/TextInput/TextInput.stories.mdx +89 -90
- package/src/components/TextInput/TextInput.test.tsx +65 -86
- package/src/components/TextInput/TextInput.tsx +101 -95
- package/src/components/TextInput/TextInputTypes.tsx +6 -0
- package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
- package/src/docs/Chakra.stories.mdx +4 -4
- package/src/docs/Intro.stories.mdx +15 -13
- package/src/index.ts +20 -0
- package/src/styles/01-colors/_colors-brand.scss +6 -0
- package/src/styles/01-colors/_colors-utility.scss +14 -12
- package/src/styles/base/_04-base.scss +2 -1
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/styles.scss +10 -12
- package/src/theme/components/accordion.ts +30 -0
- package/src/theme/components/breadcrumb.ts +77 -0
- package/src/theme/components/button.ts +77 -63
- package/src/theme/components/checkbox.ts +15 -27
- package/src/theme/components/customCheckboxGroup.ts +12 -0
- package/src/theme/components/customRadioGroup.ts +4 -10
- package/src/theme/components/global.ts +71 -0
- package/src/theme/components/globalMixins.ts +16 -0
- package/src/theme/components/heading.ts +15 -8
- package/src/theme/components/hero.ts +239 -0
- package/src/theme/components/icon.ts +79 -0
- package/src/theme/components/label.ts +17 -0
- package/src/theme/components/link.ts +47 -0
- package/src/theme/components/radio.ts +20 -31
- package/src/theme/components/searchBar.ts +21 -0
- package/src/theme/components/select.ts +50 -0
- package/src/theme/components/statusBadge.ts +27 -0
- package/src/theme/components/tabs.ts +72 -69
- package/src/theme/components/template.ts +114 -0
- package/src/theme/components/text.ts +31 -0
- package/src/theme/components/textInput.ts +61 -0
- package/src/theme/foundations/colors.ts +29 -13
- package/src/theme/foundations/global.ts +3 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/index.ts +37 -7
- package/src/utils/componentCategories.ts +8 -2
- package/src/utils/utils.ts +13 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
- package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
- package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
- package/dist/components/Template/Template.stories.d.ts +0 -30
- package/src/components/Accordion/Accordion.stories.tsx +0 -66
- package/src/components/Accordion/_Accordion.scss +0 -81
- package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
- package/src/components/Form/_Form.scss +0 -67
- package/src/components/Hero/_Hero.scss +0 -256
- package/src/components/Icons/_Icons.scss +0 -116
- package/src/components/Label/_Label.scss +0 -22
- package/src/components/Link/_Link.scss +0 -73
- package/src/components/SearchBar/_SearchBar.scss +0 -16
- package/src/components/Select/_Select.scss +0 -82
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
- package/src/components/StatusBadge/_StatusBadge.scss +0 -23
- package/src/components/StyleGuide/Colors.stories.tsx +0 -289
- package/src/components/Template/Template.stories.tsx +0 -86
- package/src/components/Template/_Template.scss +0 -63
- package/src/components/TextInput/_TextInput.scss +0 -59
|
@@ -1,250 +1,146 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { render, screen, fireEvent } from "@testing-library/react";
|
|
3
3
|
import { axe } from "jest-axe";
|
|
4
4
|
|
|
5
5
|
import Select from "./Select";
|
|
6
6
|
|
|
7
|
+
const baseProps = {
|
|
8
|
+
labelText: "What is your favorite color?",
|
|
9
|
+
helperText: "This is the helper text.",
|
|
10
|
+
name: "color",
|
|
11
|
+
};
|
|
12
|
+
const baseOptions = (
|
|
13
|
+
<>
|
|
14
|
+
<option value="red">Red</option>
|
|
15
|
+
<option value="green">Green</option>
|
|
16
|
+
<option value="blue">Blue</option>
|
|
17
|
+
<option value="black">Black</option>
|
|
18
|
+
<option value="white">White</option>
|
|
19
|
+
</>
|
|
20
|
+
);
|
|
21
|
+
|
|
7
22
|
describe("Select Accessibility", () => {
|
|
8
23
|
it("passes axe accessibility test", async () => {
|
|
9
|
-
const { container } = render(
|
|
10
|
-
<Select
|
|
11
|
-
labelText="Select Label"
|
|
12
|
-
onChange={jest.fn()}
|
|
13
|
-
onBlur={jest.fn()}
|
|
14
|
-
name="test"
|
|
15
|
-
>
|
|
16
|
-
<option aria-selected={true}>test1</option>
|
|
17
|
-
<option aria-selected={false}>test2</option>
|
|
18
|
-
</Select>
|
|
19
|
-
);
|
|
24
|
+
const { container } = render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
20
25
|
expect(await axe(container)).toHaveNoViolations();
|
|
21
26
|
});
|
|
22
27
|
});
|
|
23
28
|
|
|
24
29
|
describe("Select", () => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const blurCallback = jest.fn();
|
|
30
|
+
it("renders a label, select, option, and helper text DOM elements", () => {
|
|
31
|
+
render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
name="test"
|
|
36
|
-
>
|
|
37
|
-
<option aria-selected={true}>test1</option>
|
|
38
|
-
<option aria-selected={false}>test2</option>
|
|
39
|
-
</Select>
|
|
40
|
-
);
|
|
41
|
-
expect(utils.container.querySelector(".select")).toBeInTheDocument();
|
|
33
|
+
expect(
|
|
34
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
35
|
+
).toBeInTheDocument();
|
|
36
|
+
expect(screen.getByRole("combobox")).toBeInTheDocument();
|
|
37
|
+
expect(screen.getAllByRole("option")).toHaveLength(5);
|
|
38
|
+
expect(screen.getByText(/This is the helper text/i)).toBeInTheDocument();
|
|
42
39
|
});
|
|
43
40
|
|
|
44
|
-
it("
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
onBlur={blurCallback}
|
|
50
|
-
name="test2"
|
|
51
|
-
>
|
|
52
|
-
<option aria-selected={true}>test1</option>
|
|
53
|
-
<option aria-selected={false}>test2</option>
|
|
54
|
-
</Select>
|
|
55
|
-
);
|
|
56
|
-
expect(screen.getByLabelText("Select Label")).toHaveAttribute(
|
|
57
|
-
"name",
|
|
58
|
-
"test2"
|
|
59
|
-
);
|
|
41
|
+
it("renders a name attribute to use in forms", () => {
|
|
42
|
+
render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
43
|
+
expect(
|
|
44
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
45
|
+
).toHaveAttribute("name", "color");
|
|
60
46
|
});
|
|
61
47
|
|
|
62
|
-
it("
|
|
63
|
-
|
|
64
|
-
<Select
|
|
65
|
-
labelText="Select Label"
|
|
66
|
-
onChange={changeCallback}
|
|
67
|
-
onBlur={blurCallback}
|
|
68
|
-
showLabel={false}
|
|
69
|
-
name="test3"
|
|
70
|
-
>
|
|
71
|
-
<option aria-selected={true}>test1</option>
|
|
72
|
-
<option aria-selected={false}>test2</option>
|
|
73
|
-
</Select>
|
|
74
|
-
);
|
|
75
|
-
expect(screen.getByLabelText("Select Label")).toHaveAttribute(
|
|
76
|
-
"aria-label",
|
|
77
|
-
"Select Label"
|
|
78
|
-
);
|
|
79
|
-
});
|
|
48
|
+
it("renders an aria-label attribute when `showLabel` is false", () => {
|
|
49
|
+
const { rerender } = render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
80
50
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
showLabel={false}
|
|
89
|
-
name="test3"
|
|
90
|
-
>
|
|
91
|
-
<option aria-selected={true}>test1</option>
|
|
92
|
-
<option aria-selected={false}>test2</option>
|
|
51
|
+
expect(
|
|
52
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
53
|
+
).not.toHaveAttribute("aria-label");
|
|
54
|
+
|
|
55
|
+
rerender(
|
|
56
|
+
<Select {...baseProps} showLabel={false}>
|
|
57
|
+
{baseOptions}
|
|
93
58
|
</Select>
|
|
94
59
|
);
|
|
95
|
-
expect(
|
|
60
|
+
expect(
|
|
61
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
62
|
+
).toHaveAttribute(
|
|
96
63
|
"aria-label",
|
|
97
|
-
"
|
|
64
|
+
"What is your favorite color? - This is the helper text."
|
|
98
65
|
);
|
|
99
66
|
});
|
|
100
67
|
|
|
101
|
-
it("
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
labelText="Select Label"
|
|
107
|
-
onChange={changeCallback}
|
|
108
|
-
onBlur={blurCallback}
|
|
109
|
-
helperText="example helper text"
|
|
110
|
-
name="test4"
|
|
111
|
-
>
|
|
112
|
-
<option aria-selected={true}>test1</option>
|
|
113
|
-
<option aria-selected={false}>test2</option>
|
|
68
|
+
it("renders aria-describedby when helperText prop is passed", () => {
|
|
69
|
+
const id = "test-describe";
|
|
70
|
+
render(
|
|
71
|
+
<Select {...baseProps} id={id}>
|
|
72
|
+
{baseOptions}
|
|
114
73
|
</Select>
|
|
115
74
|
);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
);
|
|
75
|
+
|
|
76
|
+
expect(
|
|
77
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
78
|
+
).toHaveAttribute("aria-describedby", `${id}-helperText`);
|
|
120
79
|
});
|
|
121
80
|
|
|
122
|
-
it("
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
onBlur={blurCallback}
|
|
130
|
-
name="test4"
|
|
131
|
-
required
|
|
132
|
-
>
|
|
133
|
-
<option aria-selected={true}>test1</option>
|
|
134
|
-
<option aria-selected={false}>test2</option>
|
|
81
|
+
it("renders required or optional text in the label", () => {
|
|
82
|
+
const { rerender } = render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
83
|
+
expect(screen.getByText(/Optional/i)).toBeInTheDocument();
|
|
84
|
+
|
|
85
|
+
rerender(
|
|
86
|
+
<Select {...baseProps} isRequired>
|
|
87
|
+
{baseOptions}
|
|
135
88
|
</Select>
|
|
136
89
|
);
|
|
137
|
-
expect(screen.getByLabelText(/Select Label/i)).toBeInTheDocument();
|
|
138
90
|
expect(screen.getByText(/Required/i)).toBeInTheDocument();
|
|
139
|
-
expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
|
|
140
91
|
|
|
141
|
-
|
|
142
|
-
<Select
|
|
143
|
-
|
|
144
|
-
labelText="Select Label"
|
|
145
|
-
showLabel={true}
|
|
146
|
-
onChange={changeCallback}
|
|
147
|
-
onBlur={blurCallback}
|
|
148
|
-
name="test4"
|
|
149
|
-
required={false}
|
|
150
|
-
>
|
|
151
|
-
<option aria-selected={true}>test1</option>
|
|
152
|
-
<option aria-selected={false}>test2</option>
|
|
92
|
+
rerender(
|
|
93
|
+
<Select {...baseProps} showOptReqLabel={false}>
|
|
94
|
+
{baseOptions}
|
|
153
95
|
</Select>
|
|
154
96
|
);
|
|
97
|
+
expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
|
|
155
98
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("Renders required and aria-required attributes when 'showLabel' is false", () => {
|
|
162
|
-
render(
|
|
163
|
-
<Select
|
|
164
|
-
id="custom-select-id"
|
|
165
|
-
labelText="Select Label"
|
|
166
|
-
showLabel={false}
|
|
167
|
-
onChange={changeCallback}
|
|
168
|
-
onBlur={blurCallback}
|
|
169
|
-
name="test4"
|
|
170
|
-
required
|
|
171
|
-
>
|
|
172
|
-
<option aria-selected={true}>test1</option>
|
|
173
|
-
<option aria-selected={false}>test2</option>
|
|
99
|
+
rerender(
|
|
100
|
+
<Select {...baseProps} isRequired showOptReqLabel={false}>
|
|
101
|
+
{baseOptions}
|
|
174
102
|
</Select>
|
|
175
103
|
);
|
|
176
|
-
expect(screen.queryByText(/
|
|
177
|
-
expect(screen.getByLabelText("Select Label")).toHaveAttribute(
|
|
178
|
-
"aria-required"
|
|
179
|
-
);
|
|
180
|
-
expect(screen.getByLabelText("Select Label")).toHaveAttribute("required");
|
|
104
|
+
expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
|
|
181
105
|
});
|
|
182
106
|
|
|
183
|
-
it("
|
|
107
|
+
it("renders required and aria-required attributes when 'showLabel' is false", () => {
|
|
184
108
|
render(
|
|
185
|
-
<Select
|
|
186
|
-
|
|
187
|
-
labelText="Select Label"
|
|
188
|
-
onChange={changeCallback}
|
|
189
|
-
onBlur={blurCallback}
|
|
190
|
-
name="test4"
|
|
191
|
-
required
|
|
192
|
-
showOptReqLabel={false}
|
|
193
|
-
>
|
|
194
|
-
<option aria-selected={true}>test1</option>
|
|
195
|
-
<option aria-selected={false}>test2</option>
|
|
109
|
+
<Select {...baseProps} isRequired showLabel={false}>
|
|
110
|
+
{baseOptions}
|
|
196
111
|
</Select>
|
|
197
112
|
);
|
|
198
|
-
expect(screen.queryByText(/
|
|
199
|
-
expect(
|
|
113
|
+
expect(screen.queryByText(/equired/i)).not.toBeInTheDocument();
|
|
114
|
+
expect(
|
|
115
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
116
|
+
).toHaveAttribute("aria-required");
|
|
117
|
+
expect(
|
|
118
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
119
|
+
).toHaveAttribute("required");
|
|
200
120
|
});
|
|
201
121
|
|
|
202
|
-
it("
|
|
122
|
+
it("should not render a required label if 'showOptReqLabel' flag is false, but still render the label", () => {
|
|
203
123
|
render(
|
|
204
|
-
<Select
|
|
205
|
-
|
|
206
|
-
labelText="Select Label"
|
|
207
|
-
onChange={changeCallback}
|
|
208
|
-
onBlur={blurCallback}
|
|
209
|
-
name="test4"
|
|
210
|
-
isRequired
|
|
211
|
-
>
|
|
212
|
-
<option aria-selected={true}>test1</option>
|
|
213
|
-
<option aria-selected={false}>test2</option>
|
|
124
|
+
<Select {...baseProps} isRequired showOptReqLabel={false}>
|
|
125
|
+
{baseOptions}
|
|
214
126
|
</Select>
|
|
215
127
|
);
|
|
216
|
-
expect(screen.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
128
|
+
expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
|
|
129
|
+
expect(
|
|
130
|
+
screen.getByLabelText(/What is your favorite color/i)
|
|
131
|
+
).toBeInTheDocument();
|
|
220
132
|
});
|
|
221
133
|
|
|
222
|
-
it("
|
|
223
|
-
render(
|
|
224
|
-
<Select
|
|
225
|
-
id="custom-select-id"
|
|
226
|
-
labelText="Select Label"
|
|
227
|
-
helperText="The helper text."
|
|
228
|
-
name="test4"
|
|
229
|
-
>
|
|
230
|
-
<option aria-selected={true}>test1</option>
|
|
231
|
-
<option aria-selected={false}>test2</option>
|
|
232
|
-
</Select>
|
|
233
|
-
);
|
|
134
|
+
it("renders helper text when helperText prop is passed", () => {
|
|
135
|
+
render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
234
136
|
|
|
235
|
-
expect(screen.getByText("
|
|
137
|
+
expect(screen.getByText("This is the helper text.")).toBeInTheDocument();
|
|
236
138
|
});
|
|
237
139
|
|
|
238
|
-
it("
|
|
140
|
+
it("renders default error text when 'invalidText' prop is not passed and 'isInvalid' prop is set to true", () => {
|
|
239
141
|
render(
|
|
240
|
-
<Select
|
|
241
|
-
|
|
242
|
-
labelText="Select Label"
|
|
243
|
-
name="test4"
|
|
244
|
-
errored
|
|
245
|
-
>
|
|
246
|
-
<option aria-selected={true}>test1</option>
|
|
247
|
-
<option aria-selected={false}>test2</option>
|
|
142
|
+
<Select {...baseProps} isInvalid>
|
|
143
|
+
{baseOptions}
|
|
248
144
|
</Select>
|
|
249
145
|
);
|
|
250
146
|
|
|
@@ -253,216 +149,71 @@ describe("Select", () => {
|
|
|
253
149
|
).toBeInTheDocument();
|
|
254
150
|
});
|
|
255
151
|
|
|
256
|
-
it("
|
|
152
|
+
it("renders custom error text when 'invalidText' prop is passed and 'isInvalid' prop is set to true", () => {
|
|
257
153
|
render(
|
|
258
154
|
<Select
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
name="test4"
|
|
263
|
-
errored
|
|
155
|
+
{...baseProps}
|
|
156
|
+
invalidText="This is a custom error text!"
|
|
157
|
+
isInvalid
|
|
264
158
|
>
|
|
265
|
-
|
|
266
|
-
<option aria-selected={false}>test2</option>
|
|
159
|
+
{baseOptions}
|
|
267
160
|
</Select>
|
|
268
161
|
);
|
|
269
|
-
expect(
|
|
162
|
+
expect(
|
|
163
|
+
screen.getByText("This is a custom error text!")
|
|
164
|
+
).toBeInTheDocument();
|
|
270
165
|
});
|
|
271
166
|
|
|
272
|
-
it("
|
|
167
|
+
it("updates the value through a ref", () => {
|
|
168
|
+
const selectRef = React.createRef<HTMLSelectElement>();
|
|
273
169
|
render(
|
|
274
|
-
<Select
|
|
275
|
-
|
|
276
|
-
labelId="label"
|
|
277
|
-
isRequired={false}
|
|
278
|
-
id="hi"
|
|
279
|
-
onChange={changeCallback}
|
|
280
|
-
onBlur={blurCallback}
|
|
281
|
-
name="test5"
|
|
282
|
-
>
|
|
283
|
-
<option aria-selected={true}>test1</option>
|
|
284
|
-
<option aria-selected={false}>test2</option>
|
|
170
|
+
<Select {...baseProps} ref={selectRef}>
|
|
171
|
+
{baseOptions}
|
|
285
172
|
</Select>
|
|
286
173
|
);
|
|
287
174
|
|
|
288
|
-
expect(
|
|
289
|
-
fireEvent.change(screen.getByLabelText("Select Label"), {
|
|
290
|
-
target: { value: "test2" },
|
|
291
|
-
});
|
|
292
|
-
expect(changeCallback).toHaveBeenCalledTimes(1);
|
|
293
|
-
});
|
|
175
|
+
expect(selectRef.current.value).toEqual("red");
|
|
294
176
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const onChange = (event) => {
|
|
298
|
-
currentValue = event?.target?.value;
|
|
299
|
-
};
|
|
300
|
-
render(
|
|
301
|
-
<Select
|
|
302
|
-
labelText="Select Label"
|
|
303
|
-
labelId="label"
|
|
304
|
-
isRequired={false}
|
|
305
|
-
id="update-value"
|
|
306
|
-
onChange={onChange}
|
|
307
|
-
onBlur={blurCallback}
|
|
308
|
-
name="test6"
|
|
309
|
-
>
|
|
310
|
-
<option aria-selected={false}>value1</option>
|
|
311
|
-
<option aria-selected={false}>value2</option>
|
|
312
|
-
<option aria-selected={false}>value3</option>
|
|
313
|
-
</Select>
|
|
314
|
-
);
|
|
315
|
-
fireEvent.change(screen.getByLabelText("Select Label"), {
|
|
316
|
-
target: { value: "value2" },
|
|
317
|
-
});
|
|
318
|
-
expect(currentValue).toEqual("value2");
|
|
319
|
-
|
|
320
|
-
fireEvent.change(screen.getByLabelText("Select Label"), {
|
|
321
|
-
target: { value: "value3" },
|
|
177
|
+
fireEvent.change(screen.getByRole("combobox"), {
|
|
178
|
+
target: { value: "blue" },
|
|
322
179
|
});
|
|
323
|
-
expect(
|
|
180
|
+
expect(selectRef.current.value).toEqual("blue");
|
|
324
181
|
|
|
325
|
-
fireEvent.change(screen.
|
|
326
|
-
target: { value: "
|
|
182
|
+
fireEvent.change(screen.getByRole("combobox"), {
|
|
183
|
+
target: { value: "white" },
|
|
327
184
|
});
|
|
328
|
-
expect(
|
|
185
|
+
expect(selectRef.current.value).toEqual("white");
|
|
329
186
|
});
|
|
330
187
|
|
|
331
|
-
it("
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
id="hi"
|
|
336
|
-
labelId="label"
|
|
337
|
-
isRequired={false}
|
|
338
|
-
onChange={changeCallback}
|
|
339
|
-
onBlur={blurCallback}
|
|
340
|
-
name="test7"
|
|
341
|
-
>
|
|
342
|
-
<option aria-selected={true}>test1</option>
|
|
343
|
-
<option aria-selected={false}>test2</option>
|
|
344
|
-
</Select>
|
|
345
|
-
);
|
|
346
|
-
expect(blurCallback).toHaveBeenCalledTimes(0);
|
|
347
|
-
fireEvent.blur(screen.getByLabelText("Select Label"));
|
|
348
|
-
expect(blurCallback).toHaveBeenCalledTimes(1);
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
it("Calls the callback onBlur function with the updated value", () => {
|
|
352
|
-
let currentValue = "";
|
|
353
|
-
const onBlur = (event) => {
|
|
354
|
-
currentValue = event?.target?.value;
|
|
188
|
+
it("calls the onChange callback function", () => {
|
|
189
|
+
let value = "red";
|
|
190
|
+
const changeCallback = (e) => {
|
|
191
|
+
value = e.target.value;
|
|
355
192
|
};
|
|
356
193
|
render(
|
|
357
|
-
<Select
|
|
358
|
-
|
|
359
|
-
labelId="label"
|
|
360
|
-
isRequired={false}
|
|
361
|
-
id="update-value"
|
|
362
|
-
onChange={changeCallback}
|
|
363
|
-
onBlur={onBlur}
|
|
364
|
-
name="test8"
|
|
365
|
-
>
|
|
366
|
-
<option aria-selected={false}>value1</option>
|
|
367
|
-
<option aria-selected={false}>value2</option>
|
|
368
|
-
<option aria-selected={false}>value3</option>
|
|
194
|
+
<Select {...baseProps} onChange={changeCallback} value={value}>
|
|
195
|
+
{baseOptions}
|
|
369
196
|
</Select>
|
|
370
197
|
);
|
|
371
198
|
|
|
372
|
-
|
|
373
|
-
target: { value: "value2" },
|
|
374
|
-
});
|
|
375
|
-
expect(currentValue).toEqual("value2");
|
|
199
|
+
expect(value).toEqual("red");
|
|
376
200
|
|
|
377
|
-
fireEvent.
|
|
378
|
-
target: { value: "
|
|
201
|
+
fireEvent.change(screen.getByRole("combobox"), {
|
|
202
|
+
target: { value: "blue" },
|
|
379
203
|
});
|
|
380
|
-
expect(
|
|
204
|
+
expect(value).toEqual("blue");
|
|
381
205
|
|
|
382
|
-
fireEvent.
|
|
383
|
-
target: { value: "
|
|
206
|
+
fireEvent.change(screen.getByRole("combobox"), {
|
|
207
|
+
target: { value: "white" },
|
|
384
208
|
});
|
|
385
|
-
expect(
|
|
209
|
+
expect(value).toEqual("white");
|
|
386
210
|
});
|
|
387
211
|
|
|
388
|
-
it("Displays the selected option onLoad when passed selectedOption", () => {
|
|
389
|
-
render(
|
|
390
|
-
<Select
|
|
391
|
-
labelText="Select Label"
|
|
392
|
-
labelId="label"
|
|
393
|
-
isRequired={false}
|
|
394
|
-
id="hi"
|
|
395
|
-
selectedOption="test2"
|
|
396
|
-
onChange={changeCallback}
|
|
397
|
-
onBlur={blurCallback}
|
|
398
|
-
name="test9"
|
|
399
|
-
>
|
|
400
|
-
<option aria-selected={true}>test1</option>
|
|
401
|
-
<option aria-selected={false}>test2</option>
|
|
402
|
-
</Select>
|
|
403
|
-
);
|
|
404
|
-
expect(screen.getByText("test2")).toBeInTheDocument();
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
it("Calls the correct handlers when a new value is selected", () => {
|
|
408
|
-
render(
|
|
409
|
-
<Select
|
|
410
|
-
labelText="Select Label"
|
|
411
|
-
labelId="label"
|
|
412
|
-
isRequired={false}
|
|
413
|
-
id="state-change"
|
|
414
|
-
onChange={changeCallback}
|
|
415
|
-
onBlur={blurCallback}
|
|
416
|
-
selectedOption="value1"
|
|
417
|
-
name="test10"
|
|
418
|
-
>
|
|
419
|
-
<option aria-selected={false}>value1</option>
|
|
420
|
-
<option aria-selected={false}>value2</option>
|
|
421
|
-
<option aria-selected={false}>value3</option>
|
|
422
|
-
</Select>
|
|
423
|
-
);
|
|
424
|
-
|
|
425
|
-
fireEvent.change(screen.getByLabelText("Select Label"), {
|
|
426
|
-
target: { value: "value2" },
|
|
427
|
-
});
|
|
428
|
-
expect(changeCallback).toHaveBeenCalled();
|
|
429
|
-
|
|
430
|
-
fireEvent.blur(screen.getByLabelText("Select Label"), {
|
|
431
|
-
target: { value: "value3" },
|
|
432
|
-
});
|
|
433
|
-
expect(blurCallback).toHaveBeenCalled();
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
// TODO:
|
|
437
|
-
// it("Passes the ref to the select element", () => {
|
|
438
|
-
// const ref = React.createRef<HTMLSelectElement>();
|
|
439
|
-
// const container = render(
|
|
440
|
-
// <Select
|
|
441
|
-
// labelText="Select Label"
|
|
442
|
-
// labelId="label"
|
|
443
|
-
// isRequired={false}
|
|
444
|
-
// id="ref-test"
|
|
445
|
-
// name="test11"
|
|
446
|
-
// ref={ref}
|
|
447
|
-
// >
|
|
448
|
-
// <option aria-selected={false}>test1</option>
|
|
449
|
-
// <option aria-selected={false}>test2</option>
|
|
450
|
-
// </Select>
|
|
451
|
-
// );
|
|
452
|
-
// expect(container.find("select").instance()).toEqual(ref.current);
|
|
453
|
-
// });
|
|
454
|
-
|
|
455
212
|
it("should throw warning when fewer than 4 options", () => {
|
|
456
213
|
const warn = jest.spyOn(console, "warn");
|
|
457
214
|
render(
|
|
458
|
-
<Select
|
|
459
|
-
|
|
460
|
-
labelId="label"
|
|
461
|
-
isRequired={false}
|
|
462
|
-
id="ref-test"
|
|
463
|
-
name="test1"
|
|
464
|
-
>
|
|
465
|
-
<option aria-selected={false}>test1</option>
|
|
215
|
+
<Select {...baseProps}>
|
|
216
|
+
<option value="red">Red</option>
|
|
466
217
|
</Select>
|
|
467
218
|
);
|
|
468
219
|
expect(warn).toHaveBeenCalledWith(
|
|
@@ -473,13 +224,7 @@ describe("Select", () => {
|
|
|
473
224
|
it("should throw warning when there are more than 10 options", () => {
|
|
474
225
|
const warn = jest.spyOn(console, "warn");
|
|
475
226
|
render(
|
|
476
|
-
<Select
|
|
477
|
-
labelText="Select Label"
|
|
478
|
-
labelId="label"
|
|
479
|
-
isRequired={false}
|
|
480
|
-
id="ref-test"
|
|
481
|
-
name="test1"
|
|
482
|
-
>
|
|
227
|
+
<Select {...baseProps}>
|
|
483
228
|
<option aria-selected={false}>test1</option>
|
|
484
229
|
<option aria-selected={false}>test2</option>
|
|
485
230
|
<option aria-selected={false}>test3</option>
|