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