@nypl/design-system-react-components 1.0.2 → 1.0.3-beta
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/README.md +0 -2
- package/dist/components/Slider/Slider.d.ts +1 -2
- package/dist/components/TextInput/TextInput.d.ts +2 -1
- package/dist/design-system-react-components.cjs.development.js +33 -10
- 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 +33 -10
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/hooks/{tests → __tests__}/useCarouselStyles.test.d.ts +0 -0
- package/dist/theme/components/global.d.ts +1 -1
- package/dist/theme/components/radio.d.ts +8 -0
- package/dist/theme/components/template.d.ts +4 -1
- package/package.json +2 -3
- package/CHANGELOG.md +0 -1430
- package/src/__tests__/fileMock.ts +0 -6
- package/src/__tests__/setup.ts +0 -27
- package/src/__tests__/utils/utils.test.ts +0 -18
- package/src/components/AccessibilityGuide/SkipNavigation.stories.mdx +0 -42
- package/src/components/Accordion/Accordion.stories.mdx +0 -333
- package/src/components/Accordion/Accordion.test.tsx +0 -237
- package/src/components/Accordion/Accordion.tsx +0 -137
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +0 -734
- package/src/components/Autosuggest/Autosuggest.stories.mdx +0 -75
- package/src/components/Autosuggest/Autosuggest.stories.tsx +0 -211
- package/src/components/Autosuggest/_Autosuggest.scss +0 -51
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +0 -231
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +0 -144
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +0 -98
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +0 -695
- package/src/components/Button/Button.stories.mdx +0 -320
- package/src/components/Button/Button.test.tsx +0 -184
- package/src/components/Button/Button.tsx +0 -95
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -106
- package/src/components/ButtonGroup/ButtonGroup.stories.mdx +0 -178
- package/src/components/ButtonGroup/ButtonGroup.test.tsx +0 -141
- package/src/components/ButtonGroup/ButtonGroup.tsx +0 -100
- package/src/components/ButtonGroup/__snapshots__/ButtonGroup.test.tsx.snap +0 -117
- package/src/components/Card/Card.stories.mdx +0 -1041
- package/src/components/Card/Card.test.tsx +0 -388
- package/src/components/Card/Card.tsx +0 -346
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +0 -568
- package/src/components/Chakra/Box.stories.mdx +0 -52
- package/src/components/Chakra/Center.stories.mdx +0 -96
- package/src/components/Chakra/Flex.stories.mdx +0 -111
- package/src/components/Chakra/Grid.stories.mdx +0 -89
- package/src/components/Chakra/Stack.stories.mdx +0 -109
- package/src/components/Checkbox/Checkbox.stories.mdx +0 -243
- package/src/components/Checkbox/Checkbox.test.tsx +0 -350
- package/src/components/Checkbox/Checkbox.tsx +0 -152
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +0 -661
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +0 -462
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +0 -492
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +0 -173
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +0 -1842
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +0 -163
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +0 -76
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +0 -103
- package/src/components/DatePicker/DatePicker.stories.mdx +0 -452
- package/src/components/DatePicker/DatePicker.test.tsx +0 -940
- package/src/components/DatePicker/DatePicker.tsx +0 -450
- package/src/components/DatePicker/_DatePicker.scss +0 -100
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +0 -908
- package/src/components/Fieldset/Fieldset.stories.mdx +0 -96
- package/src/components/Fieldset/Fieldset.test.tsx +0 -155
- package/src/components/Fieldset/Fieldset.tsx +0 -55
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +0 -89
- package/src/components/Form/Form.stories.mdx +0 -426
- package/src/components/Form/Form.test.tsx +0 -234
- package/src/components/Form/Form.tsx +0 -124
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -115
- package/src/components/Grid/SimpleGrid.stories.mdx +0 -336
- package/src/components/Grid/SimpleGrid.test.tsx +0 -79
- package/src/components/Grid/SimpleGrid.tsx +0 -49
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +0 -23
- package/src/components/Heading/Heading.stories.mdx +0 -187
- package/src/components/Heading/Heading.test.tsx +0 -171
- package/src/components/Heading/Heading.tsx +0 -104
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +0 -90
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +0 -172
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +0 -114
- package/src/components/HelperErrorText/HelperErrorText.tsx +0 -62
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +0 -93
- package/src/components/Hero/Hero.stories.mdx +0 -378
- package/src/components/Hero/Hero.test.tsx +0 -611
- package/src/components/Hero/Hero.tsx +0 -203
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +0 -379
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +0 -73
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +0 -54
- package/src/components/HorizontalRule/HorizontalRule.tsx +0 -27
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +0 -44
- package/src/components/Icons/Icon.stories.mdx +0 -413
- package/src/components/Icons/Icon.test.tsx +0 -120
- package/src/components/Icons/Icon.tsx +0 -187
- package/src/components/Icons/IconSvgs.tsx +0 -64
- package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +0 -129
- package/src/components/Image/Image.stories.mdx +0 -332
- package/src/components/Image/Image.test.tsx +0 -155
- package/src/components/Image/Image.tsx +0 -171
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +0 -269
- package/src/components/Label/Label.stories.mdx +0 -100
- package/src/components/Label/Label.test.tsx +0 -116
- package/src/components/Label/Label.tsx +0 -55
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +0 -45
- package/src/components/Link/Link.stories.mdx +0 -249
- package/src/components/Link/Link.test.tsx +0 -224
- package/src/components/Link/Link.tsx +0 -178
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +0 -286
- package/src/components/List/List.stories.mdx +0 -393
- package/src/components/List/List.test.tsx +0 -265
- package/src/components/List/List.tsx +0 -156
- package/src/components/List/__snapshots__/List.test.tsx.snap +0 -213
- package/src/components/Logo/Logo.stories.mdx +0 -295
- package/src/components/Logo/Logo.test.tsx +0 -116
- package/src/components/Logo/Logo.tsx +0 -151
- package/src/components/Logo/LogoSvgs.tsx +0 -90
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +0 -142
- package/src/components/Modal/Modal.stories.mdx +0 -294
- package/src/components/Modal/Modal.test.tsx +0 -157
- package/src/components/Modal/Modal.tsx +0 -154
- package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +0 -25
- package/src/components/Notification/Notification.stories.mdx +0 -358
- package/src/components/Notification/Notification.test.tsx +0 -279
- package/src/components/Notification/Notification.tsx +0 -224
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +0 -525
- package/src/components/Pagination/Pagination.stories.mdx +0 -184
- package/src/components/Pagination/Pagination.test.tsx +0 -419
- package/src/components/Pagination/Pagination.tsx +0 -269
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +0 -544
- package/src/components/Placeholder/Placeholder.tsx +0 -19
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +0 -360
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +0 -298
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +0 -132
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +0 -434
- package/src/components/Radio/Radio.stories.mdx +0 -216
- package/src/components/Radio/Radio.test.tsx +0 -247
- package/src/components/Radio/Radio.tsx +0 -119
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +0 -451
- package/src/components/RadioGroup/RadioGroup.stories.mdx +0 -479
- package/src/components/RadioGroup/RadioGroup.test.tsx +0 -471
- package/src/components/RadioGroup/RadioGroup.tsx +0 -171
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +0 -1550
- package/src/components/SearchBar/SearchBar.stories.mdx +0 -518
- package/src/components/SearchBar/SearchBar.test.tsx +0 -435
- package/src/components/SearchBar/SearchBar.tsx +0 -210
- package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +0 -1049
- package/src/components/Select/Select.stories.mdx +0 -439
- package/src/components/Select/Select.test.tsx +0 -358
- package/src/components/Select/Select.tsx +0 -183
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +0 -895
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +0 -142
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +0 -116
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +0 -123
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +0 -898
- package/src/components/SkipNavigation/SkipNavigation.stories.mdx +0 -90
- package/src/components/SkipNavigation/SkipNavigation.test.tsx +0 -63
- package/src/components/SkipNavigation/SkipNavigation.tsx +0 -51
- package/src/components/SkipNavigation/__snapshots__/SkipNavigation.test.tsx.snap +0 -130
- package/src/components/Slider/Slider.stories.mdx +0 -628
- package/src/components/Slider/Slider.test.tsx +0 -736
- package/src/components/Slider/Slider.tsx +0 -322
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +0 -2186
- package/src/components/StatusBadge/StatusBadge.stories.mdx +0 -109
- package/src/components/StatusBadge/StatusBadge.test.tsx +0 -70
- package/src/components/StatusBadge/StatusBadge.tsx +0 -35
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +0 -47
- package/src/components/StructuredContent/StructuredContent.stories.mdx +0 -567
- package/src/components/StructuredContent/StructuredContent.test.tsx +0 -435
- package/src/components/StructuredContent/StructuredContent.tsx +0 -139
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +0 -368
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +0 -206
- package/src/components/StyleGuide/Breakpoints.stories.mdx +0 -55
- package/src/components/StyleGuide/Buttons.stories.mdx +0 -194
- package/src/components/StyleGuide/ColorCard.tsx +0 -43
- package/src/components/StyleGuide/Colors.stories.mdx +0 -201
- package/src/components/StyleGuide/DesignTokens.stories.mdx +0 -193
- package/src/components/StyleGuide/Forms.stories.mdx +0 -94
- package/src/components/StyleGuide/Iconography.stories.mdx +0 -142
- package/src/components/StyleGuide/Spacing.stories.mdx +0 -116
- package/src/components/StyleGuide/Typography.stories.mdx +0 -419
- package/src/components/Table/Table.stories.mdx +0 -272
- package/src/components/Table/Table.test.tsx +0 -241
- package/src/components/Table/Table.tsx +0 -152
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +0 -1703
- package/src/components/Tabs/Tabs.stories.mdx +0 -338
- package/src/components/Tabs/Tabs.test.tsx +0 -298
- package/src/components/Tabs/Tabs.tsx +0 -264
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +0 -584
- package/src/components/Template/Template.stories.mdx +0 -695
- package/src/components/Template/Template.test.tsx +0 -309
- package/src/components/Template/Template.tsx +0 -326
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +0 -342
- package/src/components/Text/Text.stories.mdx +0 -103
- package/src/components/Text/Text.test.tsx +0 -63
- package/src/components/Text/Text.tsx +0 -50
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +0 -50
- package/src/components/TextInput/TextInput.stories.mdx +0 -268
- package/src/components/TextInput/TextInput.test.tsx +0 -451
- package/src/components/TextInput/TextInput.tsx +0 -240
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +0 -274
- package/src/components/Toggle/Toggle.stories.mdx +0 -237
- package/src/components/Toggle/Toggle.test.tsx +0 -170
- package/src/components/Toggle/Toggle.tsx +0 -128
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +0 -470
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +0 -212
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +0 -308
- package/src/components/VideoPlayer/VideoPlayer.tsx +0 -188
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +0 -192
- package/src/docs/Chakra.stories.mdx +0 -563
- package/src/docs/Welcome.stories.mdx +0 -148
- package/src/helpers/types.ts +0 -1
- package/src/hooks/tests/useCarouselStyles.test.ts +0 -140
- package/src/hooks/tests/useNYPLTheme.test.tsx +0 -36
- package/src/hooks/useCarouselStyles.stories.mdx +0 -30
- package/src/hooks/useCarouselStyles.ts +0 -35
- package/src/hooks/useNYPLTheme.stories.mdx +0 -98
- package/src/hooks/useNYPLTheme.ts +0 -91
- package/src/hooks/useWindowSize.stories.mdx +0 -23
- package/src/hooks/useWindowSize.ts +0 -40
- package/src/index.ts +0 -136
- package/src/resources.scss +0 -6
- package/src/styles/base/_01-breakpoints.scss +0 -27
- package/src/styles/base/_02-mixins.scss +0 -103
- package/src/styles/base/_place-holder.scss +0 -33
- package/src/styles/space/_space-inline.scss +0 -79
- package/src/styles/space/_space-inset.scss +0 -57
- package/src/styles/space/_space-stack.scss +0 -116
- package/src/styles.scss +0 -23
- package/src/theme/components/accordion.ts +0 -25
- package/src/theme/components/breadcrumb.ts +0 -94
- package/src/theme/components/button.ts +0 -133
- package/src/theme/components/buttonGroup.ts +0 -10
- package/src/theme/components/card.ts +0 -237
- package/src/theme/components/checkbox.ts +0 -110
- package/src/theme/components/checkboxGroup.ts +0 -10
- package/src/theme/components/componentWrapper.ts +0 -14
- package/src/theme/components/customTable.ts +0 -77
- package/src/theme/components/datePicker.ts +0 -17
- package/src/theme/components/fieldset.ts +0 -23
- package/src/theme/components/global.ts +0 -91
- package/src/theme/components/globalMixins.ts +0 -24
- package/src/theme/components/heading.ts +0 -79
- package/src/theme/components/helperErrorText.ts +0 -14
- package/src/theme/components/hero.ts +0 -238
- package/src/theme/components/horizontalRule.ts +0 -17
- package/src/theme/components/icon.ts +0 -88
- package/src/theme/components/image.ts +0 -136
- package/src/theme/components/label.ts +0 -15
- package/src/theme/components/link.ts +0 -63
- package/src/theme/components/list.ts +0 -88
- package/src/theme/components/logo.ts +0 -58
- package/src/theme/components/notification.ts +0 -132
- package/src/theme/components/pagination.ts +0 -17
- package/src/theme/components/progressIndicator.ts +0 -67
- package/src/theme/components/radio.ts +0 -103
- package/src/theme/components/radioGroup.ts +0 -10
- package/src/theme/components/searchBar.ts +0 -19
- package/src/theme/components/select.ts +0 -72
- package/src/theme/components/skeletonLoader.ts +0 -113
- package/src/theme/components/skipNavigation.ts +0 -29
- package/src/theme/components/slider.ts +0 -95
- package/src/theme/components/statusBadge.ts +0 -26
- package/src/theme/components/structuredContent.ts +0 -149
- package/src/theme/components/tabs.ts +0 -109
- package/src/theme/components/template.ts +0 -114
- package/src/theme/components/text.ts +0 -38
- package/src/theme/components/textInput.ts +0 -65
- package/src/theme/components/toggle.ts +0 -109
- package/src/theme/components/videoPlayer.ts +0 -47
- package/src/theme/foundations/breakpoints.ts +0 -24
- package/src/theme/foundations/colors.ts +0 -212
- package/src/theme/foundations/global.ts +0 -43
- package/src/theme/foundations/radii.ts +0 -7
- package/src/theme/foundations/shadows.ts +0 -5
- package/src/theme/foundations/spacing.ts +0 -136
- package/src/theme/foundations/typography.ts +0 -107
- package/src/theme/index.ts +0 -131
- package/src/theme/provider.tsx +0 -9
- package/src/theme/types.ts +0 -1
- package/src/utils/componentCategories.ts +0 -152
- package/src/utils/interfaces.ts +0 -5
- package/src/utils/utils.ts +0 -84
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { render, screen, fireEvent } from "@testing-library/react";
|
|
3
|
-
import { axe } from "jest-axe";
|
|
4
|
-
import renderer from "react-test-renderer";
|
|
5
|
-
|
|
6
|
-
import Select from "./Select";
|
|
7
|
-
|
|
8
|
-
const baseProps = {
|
|
9
|
-
helperText: "This is the helper text.",
|
|
10
|
-
id: "select",
|
|
11
|
-
labelText: "What is your favorite color?",
|
|
12
|
-
name: "color",
|
|
13
|
-
};
|
|
14
|
-
const baseOptions = (
|
|
15
|
-
<>
|
|
16
|
-
<option value="red">Red</option>
|
|
17
|
-
<option value="green">Green</option>
|
|
18
|
-
<option value="blue">Blue</option>
|
|
19
|
-
<option value="black">Black</option>
|
|
20
|
-
<option value="white">White</option>
|
|
21
|
-
</>
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
describe("Select Accessibility", () => {
|
|
25
|
-
it("passes axe accessibility test", async () => {
|
|
26
|
-
const { container } = render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
27
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe("Select", () => {
|
|
32
|
-
it("renders a label, select, option, and helper text DOM elements", () => {
|
|
33
|
-
render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
34
|
-
|
|
35
|
-
expect(
|
|
36
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
37
|
-
).toBeInTheDocument();
|
|
38
|
-
expect(screen.getByRole("combobox")).toBeInTheDocument();
|
|
39
|
-
expect(screen.getAllByRole("option")).toHaveLength(5);
|
|
40
|
-
expect(screen.getByText(/This is the helper text/i)).toBeInTheDocument();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it("renders a name attribute to use in forms", () => {
|
|
44
|
-
render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
45
|
-
expect(
|
|
46
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
47
|
-
).toHaveAttribute("name", "color");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("renders an aria-label attribute when `showLabel` is false", () => {
|
|
51
|
-
const { rerender } = render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
52
|
-
|
|
53
|
-
expect(
|
|
54
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
55
|
-
).not.toHaveAttribute("aria-label");
|
|
56
|
-
|
|
57
|
-
rerender(
|
|
58
|
-
<Select {...baseProps} showLabel={false}>
|
|
59
|
-
{baseOptions}
|
|
60
|
-
</Select>
|
|
61
|
-
);
|
|
62
|
-
expect(
|
|
63
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
64
|
-
).toHaveAttribute(
|
|
65
|
-
"aria-label",
|
|
66
|
-
"What is your favorite color? - This is the helper text."
|
|
67
|
-
);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("renders aria-describedby when helperText prop is passed", () => {
|
|
71
|
-
const id = "test-describe";
|
|
72
|
-
render(
|
|
73
|
-
<Select {...baseProps} id={id}>
|
|
74
|
-
{baseOptions}
|
|
75
|
-
</Select>
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
expect(
|
|
79
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
80
|
-
).toHaveAttribute("aria-describedby", `${id}-helperText`);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("renders '(Required)' text in the label", () => {
|
|
84
|
-
const { rerender } = render(
|
|
85
|
-
<Select {...baseProps} isRequired>
|
|
86
|
-
{baseOptions}
|
|
87
|
-
</Select>
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
expect(screen.getByText(/Required/i)).toBeInTheDocument();
|
|
91
|
-
|
|
92
|
-
rerender(
|
|
93
|
-
<Select {...baseProps} isRequired showRequiredLabel={false}>
|
|
94
|
-
{baseOptions}
|
|
95
|
-
</Select>
|
|
96
|
-
);
|
|
97
|
-
expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it("renders required and aria-required attributes when 'showLabel' is false", () => {
|
|
101
|
-
render(
|
|
102
|
-
<Select {...baseProps} isRequired showLabel={false}>
|
|
103
|
-
{baseOptions}
|
|
104
|
-
</Select>
|
|
105
|
-
);
|
|
106
|
-
expect(screen.queryByText(/equired/i)).not.toBeInTheDocument();
|
|
107
|
-
expect(
|
|
108
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
109
|
-
).toHaveAttribute("aria-required");
|
|
110
|
-
expect(
|
|
111
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
112
|
-
).toHaveAttribute("required");
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("should not render a required label if 'showRequiredLabel' flag is false, but still render the label", () => {
|
|
116
|
-
render(
|
|
117
|
-
<Select {...baseProps} isRequired showRequiredLabel={false}>
|
|
118
|
-
{baseOptions}
|
|
119
|
-
</Select>
|
|
120
|
-
);
|
|
121
|
-
expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
|
|
122
|
-
expect(
|
|
123
|
-
screen.getByLabelText(/What is your favorite color/i)
|
|
124
|
-
).toBeInTheDocument();
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it("renders helper text when helperText prop is passed", () => {
|
|
128
|
-
render(<Select {...baseProps}>{baseOptions}</Select>);
|
|
129
|
-
|
|
130
|
-
expect(screen.getByText("This is the helper text.")).toBeInTheDocument();
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("renders default error text when 'invalidText' prop is not passed and 'isInvalid' prop is set to true", () => {
|
|
134
|
-
render(
|
|
135
|
-
<Select {...baseProps} isInvalid>
|
|
136
|
-
{baseOptions}
|
|
137
|
-
</Select>
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
expect(
|
|
141
|
-
screen.getByText("There is an error related to this field.")
|
|
142
|
-
).toBeInTheDocument();
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it("does not render the error text when 'isInvalid' is true and 'showHelperInvalidText' is false", () => {
|
|
146
|
-
render(
|
|
147
|
-
<Select {...baseProps} showHelperInvalidText={false} isInvalid>
|
|
148
|
-
{baseOptions}
|
|
149
|
-
</Select>
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
expect(
|
|
153
|
-
screen.queryByText("There is an error related to this field.")
|
|
154
|
-
).not.toBeInTheDocument();
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("renders custom error text when 'invalidText' prop is passed and 'isInvalid' prop is set to true", () => {
|
|
158
|
-
render(
|
|
159
|
-
<Select
|
|
160
|
-
{...baseProps}
|
|
161
|
-
invalidText="This is a custom error text!"
|
|
162
|
-
isInvalid
|
|
163
|
-
>
|
|
164
|
-
{baseOptions}
|
|
165
|
-
</Select>
|
|
166
|
-
);
|
|
167
|
-
expect(
|
|
168
|
-
screen.getByText("This is a custom error text!")
|
|
169
|
-
).toBeInTheDocument();
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it("updates the value through a ref", () => {
|
|
173
|
-
const selectRef = React.createRef<HTMLSelectElement>();
|
|
174
|
-
render(
|
|
175
|
-
<Select {...baseProps} ref={selectRef}>
|
|
176
|
-
{baseOptions}
|
|
177
|
-
</Select>
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
expect(selectRef.current?.value).toEqual("red");
|
|
181
|
-
|
|
182
|
-
fireEvent.change(screen.getByRole("combobox"), {
|
|
183
|
-
target: { value: "blue" },
|
|
184
|
-
});
|
|
185
|
-
expect(selectRef.current?.value).toEqual("blue");
|
|
186
|
-
|
|
187
|
-
fireEvent.change(screen.getByRole("combobox"), {
|
|
188
|
-
target: { value: "white" },
|
|
189
|
-
});
|
|
190
|
-
expect(selectRef.current?.value).toEqual("white");
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it("calls the onChange callback function", () => {
|
|
194
|
-
let value = "";
|
|
195
|
-
const changeCallback = (e: React.FormEvent) => {
|
|
196
|
-
value = (e.target as HTMLInputElement).value;
|
|
197
|
-
};
|
|
198
|
-
render(
|
|
199
|
-
<Select {...baseProps} onChange={changeCallback} value={value}>
|
|
200
|
-
{baseOptions}
|
|
201
|
-
</Select>
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
expect(value).toEqual("");
|
|
205
|
-
|
|
206
|
-
fireEvent.change(screen.getByRole("combobox"), {
|
|
207
|
-
target: { value: "blue" },
|
|
208
|
-
});
|
|
209
|
-
expect(value).toEqual("blue");
|
|
210
|
-
|
|
211
|
-
fireEvent.change(screen.getByRole("combobox"), {
|
|
212
|
-
target: { value: "white" },
|
|
213
|
-
});
|
|
214
|
-
expect(value).toEqual("white");
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
it("logs a warning when there is no `id` passed", () => {
|
|
218
|
-
const warn = jest.spyOn(console, "warn");
|
|
219
|
-
render(
|
|
220
|
-
// @ts-ignore: Typescript complains when a required prop is not passed, but
|
|
221
|
-
// here we don't want to pass the required prop to make sure the warning appears.
|
|
222
|
-
<Select labelText="What is your favorite color?" name="color">
|
|
223
|
-
{baseOptions}
|
|
224
|
-
</Select>
|
|
225
|
-
);
|
|
226
|
-
expect(warn).toHaveBeenCalledWith(
|
|
227
|
-
"NYPL Reservoir Select: This component's required `id` prop was not passed."
|
|
228
|
-
);
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it("Renders the UI snapshot correctly", () => {
|
|
232
|
-
const siblings = ["Kendall", "Shiv", "Connor", "Roman", "Tom"];
|
|
233
|
-
const options = siblings.map((sibling) => (
|
|
234
|
-
<option key={sibling}>{sibling}</option>
|
|
235
|
-
));
|
|
236
|
-
|
|
237
|
-
const primary = renderer
|
|
238
|
-
.create(
|
|
239
|
-
<Select
|
|
240
|
-
id="select"
|
|
241
|
-
labelText="Which Succession sibling are you?"
|
|
242
|
-
name="succession-sibling"
|
|
243
|
-
>
|
|
244
|
-
{options}
|
|
245
|
-
</Select>
|
|
246
|
-
)
|
|
247
|
-
.toJSON();
|
|
248
|
-
const disabled = renderer
|
|
249
|
-
.create(
|
|
250
|
-
<Select
|
|
251
|
-
id="select"
|
|
252
|
-
isDisabled
|
|
253
|
-
labelText="Which Succession sibling are you?"
|
|
254
|
-
name="succession-sibling"
|
|
255
|
-
>
|
|
256
|
-
{options}
|
|
257
|
-
</Select>
|
|
258
|
-
)
|
|
259
|
-
.toJSON();
|
|
260
|
-
const withInvalidText = renderer
|
|
261
|
-
.create(
|
|
262
|
-
<Select
|
|
263
|
-
id="select"
|
|
264
|
-
invalidText="Tom doesn't count as a sibling :(."
|
|
265
|
-
isInvalid
|
|
266
|
-
labelText="Which Succession sibling are you?"
|
|
267
|
-
name="succession-sibling"
|
|
268
|
-
>
|
|
269
|
-
{options}
|
|
270
|
-
</Select>
|
|
271
|
-
)
|
|
272
|
-
.toJSON();
|
|
273
|
-
const withHelperText = renderer
|
|
274
|
-
.create(
|
|
275
|
-
<Select
|
|
276
|
-
helperText="Remember, Logan will judge you no matter who you pick."
|
|
277
|
-
id="select"
|
|
278
|
-
labelText="Which Succession sibling are you?"
|
|
279
|
-
name="succession-sibling"
|
|
280
|
-
>
|
|
281
|
-
{options}
|
|
282
|
-
</Select>
|
|
283
|
-
)
|
|
284
|
-
.toJSON();
|
|
285
|
-
const required = renderer
|
|
286
|
-
.create(
|
|
287
|
-
<Select
|
|
288
|
-
id="select"
|
|
289
|
-
isRequired
|
|
290
|
-
labelText="Which Succession sibling are you?"
|
|
291
|
-
name="succession-sibling"
|
|
292
|
-
>
|
|
293
|
-
{options}
|
|
294
|
-
</Select>
|
|
295
|
-
)
|
|
296
|
-
.toJSON();
|
|
297
|
-
const withLabelInline = renderer
|
|
298
|
-
.create(
|
|
299
|
-
<Select
|
|
300
|
-
id="select"
|
|
301
|
-
isRequired
|
|
302
|
-
labelPosition="inline"
|
|
303
|
-
labelText="Which Succession sibling are you?"
|
|
304
|
-
name="succession-sibling"
|
|
305
|
-
>
|
|
306
|
-
{options}
|
|
307
|
-
</Select>
|
|
308
|
-
)
|
|
309
|
-
.toJSON();
|
|
310
|
-
const hasOnChange = renderer
|
|
311
|
-
.create(
|
|
312
|
-
<Select
|
|
313
|
-
id="select"
|
|
314
|
-
labelText="Which Succession sibling are you?"
|
|
315
|
-
name="succession-sibling"
|
|
316
|
-
onChange={jest.fn()}
|
|
317
|
-
>
|
|
318
|
-
{options}
|
|
319
|
-
</Select>
|
|
320
|
-
)
|
|
321
|
-
.toJSON();
|
|
322
|
-
const withChakraProps = renderer
|
|
323
|
-
.create(
|
|
324
|
-
<Select
|
|
325
|
-
id="chakra"
|
|
326
|
-
labelText="Which Succession sibling are you?"
|
|
327
|
-
name="succession-sibling"
|
|
328
|
-
p="20px"
|
|
329
|
-
color="ui.error.primary"
|
|
330
|
-
>
|
|
331
|
-
{options}
|
|
332
|
-
</Select>
|
|
333
|
-
)
|
|
334
|
-
.toJSON();
|
|
335
|
-
const withOtherProps = renderer
|
|
336
|
-
.create(
|
|
337
|
-
<Select
|
|
338
|
-
id="props"
|
|
339
|
-
labelText="Which Succession sibling are you?"
|
|
340
|
-
name="succession-sibling"
|
|
341
|
-
data-testid="props"
|
|
342
|
-
>
|
|
343
|
-
{options}
|
|
344
|
-
</Select>
|
|
345
|
-
)
|
|
346
|
-
.toJSON();
|
|
347
|
-
|
|
348
|
-
expect(primary).toMatchSnapshot();
|
|
349
|
-
expect(disabled).toMatchSnapshot();
|
|
350
|
-
expect(withInvalidText).toMatchSnapshot();
|
|
351
|
-
expect(withHelperText).toMatchSnapshot();
|
|
352
|
-
expect(required).toMatchSnapshot();
|
|
353
|
-
expect(withLabelInline).toMatchSnapshot();
|
|
354
|
-
expect(hasOnChange).toMatchSnapshot();
|
|
355
|
-
expect(withChakraProps).toMatchSnapshot();
|
|
356
|
-
expect(withOtherProps).toMatchSnapshot();
|
|
357
|
-
});
|
|
358
|
-
});
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Box,
|
|
3
|
-
chakra,
|
|
4
|
-
Select as ChakraSelect,
|
|
5
|
-
useMultiStyleConfig,
|
|
6
|
-
} from "@chakra-ui/react";
|
|
7
|
-
import React, { useEffect, useState, useRef } from "react";
|
|
8
|
-
|
|
9
|
-
import ComponentWrapper from "../ComponentWrapper/ComponentWrapper";
|
|
10
|
-
import { HelperErrorTextType } from "../HelperErrorText/HelperErrorText";
|
|
11
|
-
import Icon from "../Icons/Icon";
|
|
12
|
-
import Label from "../Label/Label";
|
|
13
|
-
import { getAriaAttrs } from "../../utils/utils";
|
|
14
|
-
|
|
15
|
-
export type SelectTypes = "default" | "searchbar";
|
|
16
|
-
export type LabelPositions = "default" | "inline";
|
|
17
|
-
export interface SelectProps {
|
|
18
|
-
/** A class name for the `div` parent element. */
|
|
19
|
-
className?: string;
|
|
20
|
-
/** Optional string to populate the `HelperErrorText` for the standard state. */
|
|
21
|
-
helperText?: HelperErrorTextType;
|
|
22
|
-
/** ID that other components can cross reference for accessibility purposes */
|
|
23
|
-
id: string;
|
|
24
|
-
/** Optional string to populate the `HelperErrorText` for the error state
|
|
25
|
-
* when `isInvalid` is true. */
|
|
26
|
-
invalidText?: HelperErrorTextType;
|
|
27
|
-
/** Adds the `disabled` and `aria-disabled` attributes to the select when true */
|
|
28
|
-
isDisabled?: boolean;
|
|
29
|
-
/** Adds the `aria-invalid` attribute to the select when true. This also makes
|
|
30
|
-
* the color theme "NYPL error" red for the select and text. */
|
|
31
|
-
isInvalid?: boolean;
|
|
32
|
-
/** Adds the `required` and `aria-required` attributes to the input when true. */
|
|
33
|
-
isRequired?: boolean;
|
|
34
|
-
/** Optional value to render the label inline, rather than the default (on top)
|
|
35
|
-
* of the select element. */
|
|
36
|
-
labelPosition?: LabelPositions;
|
|
37
|
-
/** Provides text for a `Label` component if `showLabel` is set to `true`;
|
|
38
|
-
* populates an `aria-label` attribute on the select input if `showLabel` is
|
|
39
|
-
* set to `false`. */
|
|
40
|
-
labelText: string;
|
|
41
|
-
/** Used to reference the select element in forms. */
|
|
42
|
-
name: string;
|
|
43
|
-
/** The callback function to get the selected value.
|
|
44
|
-
* Should be passed along with `value` for controlled components. */
|
|
45
|
-
onChange?: (event: React.FormEvent) => void;
|
|
46
|
-
/** Placeholder text in the select element. */
|
|
47
|
-
placeholder?: string;
|
|
48
|
-
/** The variant to display. */
|
|
49
|
-
selectType?: SelectTypes;
|
|
50
|
-
/** Offers the ability to hide the helper/invalid text. */
|
|
51
|
-
showHelperInvalidText?: boolean;
|
|
52
|
-
/** Offers the ability to show the select's label onscreen or hide it. Refer
|
|
53
|
-
* to the `labelText` property for more information. */
|
|
54
|
-
showLabel?: boolean;
|
|
55
|
-
/** Whether or not to display the "(Required)" text in the label text.
|
|
56
|
-
* True by default. */
|
|
57
|
-
showRequiredLabel?: boolean;
|
|
58
|
-
/** The value of the selected option.
|
|
59
|
-
* Should be passed along with `onChange` for controlled components. */
|
|
60
|
-
value?: string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Component that renders Chakra's `Select` component along with an accessible
|
|
65
|
-
* `Label` and optional `HelperErrorText` component.
|
|
66
|
-
*/
|
|
67
|
-
export const Select = chakra(
|
|
68
|
-
React.forwardRef<HTMLSelectElement, React.PropsWithChildren<SelectProps>>(
|
|
69
|
-
(props: React.PropsWithChildren<SelectProps>, ref?) => {
|
|
70
|
-
const {
|
|
71
|
-
children,
|
|
72
|
-
className,
|
|
73
|
-
helperText,
|
|
74
|
-
id,
|
|
75
|
-
invalidText,
|
|
76
|
-
isDisabled = false,
|
|
77
|
-
isInvalid = false,
|
|
78
|
-
isRequired = false,
|
|
79
|
-
labelPosition = "default",
|
|
80
|
-
labelText,
|
|
81
|
-
name,
|
|
82
|
-
onChange,
|
|
83
|
-
placeholder,
|
|
84
|
-
selectType = "default",
|
|
85
|
-
showHelperInvalidText = true,
|
|
86
|
-
showLabel = true,
|
|
87
|
-
showRequiredLabel = true,
|
|
88
|
-
value = "",
|
|
89
|
-
...rest
|
|
90
|
-
} = props;
|
|
91
|
-
const [labelWidth, setLabelWidth] = useState<number>(0);
|
|
92
|
-
const labelRef = useRef<HTMLDivElement>(null);
|
|
93
|
-
const styles = useMultiStyleConfig("CustomSelect", {
|
|
94
|
-
variant: selectType,
|
|
95
|
-
labelPosition,
|
|
96
|
-
});
|
|
97
|
-
const finalInvalidText = invalidText
|
|
98
|
-
? invalidText
|
|
99
|
-
: "There is an error related to this field.";
|
|
100
|
-
const footnote = isInvalid ? finalInvalidText : helperText;
|
|
101
|
-
const ariaAttributes = getAriaAttrs({
|
|
102
|
-
footnote,
|
|
103
|
-
id,
|
|
104
|
-
labelText,
|
|
105
|
-
name: "Select",
|
|
106
|
-
showLabel,
|
|
107
|
-
});
|
|
108
|
-
// To control the `Select` component, both `onChange` and `value`
|
|
109
|
-
// must be passed.
|
|
110
|
-
const controlledProps = onChange ? { onChange, value } : {};
|
|
111
|
-
|
|
112
|
-
// The number of pixels between the label and select elements
|
|
113
|
-
// when the labelPosition is inline (equivalent to --nypl-space-xs).
|
|
114
|
-
const labelSelectGap = 8;
|
|
115
|
-
|
|
116
|
-
if (!id) {
|
|
117
|
-
console.warn(
|
|
118
|
-
"NYPL Reservoir Select: This component's required `id` prop was not passed."
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
useEffect(() => {
|
|
123
|
-
if (labelPosition === "inline") {
|
|
124
|
-
if (labelRef.current) {
|
|
125
|
-
const width = labelRef.current.clientWidth + labelSelectGap;
|
|
126
|
-
setLabelWidth(width);
|
|
127
|
-
}
|
|
128
|
-
} else {
|
|
129
|
-
setLabelWidth(0);
|
|
130
|
-
}
|
|
131
|
-
}, [labelPosition]);
|
|
132
|
-
|
|
133
|
-
return (
|
|
134
|
-
<ComponentWrapper
|
|
135
|
-
className={className}
|
|
136
|
-
helperText={helperText}
|
|
137
|
-
helperTextStyles={{
|
|
138
|
-
marginLeft: { sm: "auto", md: `${labelWidth}px` },
|
|
139
|
-
}}
|
|
140
|
-
id={id}
|
|
141
|
-
invalidText={finalInvalidText}
|
|
142
|
-
isInvalid={isInvalid}
|
|
143
|
-
showHelperInvalidText={showHelperInvalidText}
|
|
144
|
-
__css={styles}
|
|
145
|
-
{...rest}
|
|
146
|
-
>
|
|
147
|
-
<Box __css={labelPosition === "inline" && styles.inline}>
|
|
148
|
-
{showLabel && (
|
|
149
|
-
<Box ref={labelRef}>
|
|
150
|
-
<Label
|
|
151
|
-
htmlFor={id}
|
|
152
|
-
id={`${id}-label`}
|
|
153
|
-
isInlined
|
|
154
|
-
isRequired={showRequiredLabel && isRequired}
|
|
155
|
-
>
|
|
156
|
-
{labelText}
|
|
157
|
-
</Label>
|
|
158
|
-
</Box>
|
|
159
|
-
)}
|
|
160
|
-
<ChakraSelect
|
|
161
|
-
id={id}
|
|
162
|
-
variant="outline"
|
|
163
|
-
isRequired={isRequired}
|
|
164
|
-
isDisabled={isDisabled}
|
|
165
|
-
isInvalid={isInvalid}
|
|
166
|
-
name={name}
|
|
167
|
-
placeholder={placeholder}
|
|
168
|
-
ref={ref}
|
|
169
|
-
{...controlledProps}
|
|
170
|
-
{...ariaAttributes}
|
|
171
|
-
icon={<Icon id={`${id}-icon`} name="arrow" size="medium" />}
|
|
172
|
-
__css={styles.select}
|
|
173
|
-
>
|
|
174
|
-
{children}
|
|
175
|
-
</ChakraSelect>
|
|
176
|
-
</Box>
|
|
177
|
-
</ComponentWrapper>
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
)
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
export default Select;
|