@nypl/design-system-react-components 0.25.2 → 0.25.6

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 (238) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +47 -11
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
  4. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
  5. package/dist/components/Button/Button.d.ts +9 -8
  6. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  7. package/dist/components/Card/Card.d.ts +36 -52
  8. package/dist/components/Card/CardTypes.d.ts +0 -15
  9. package/dist/components/Checkbox/Checkbox.d.ts +8 -9
  10. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
  11. package/dist/components/DatePicker/DatePicker.d.ts +36 -36
  12. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  13. package/dist/components/HelperErrorText/HelperErrorText.d.ts +4 -0
  14. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -3
  15. package/dist/components/Icons/Icon.d.ts +4 -0
  16. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  17. package/dist/components/Icons/IconTypes.d.ts +11 -0
  18. package/dist/components/Image/Image.d.ts +19 -9
  19. package/dist/components/Image/ImageTypes.d.ts +20 -0
  20. package/dist/components/Link/Link.d.ts +4 -0
  21. package/dist/components/List/List.d.ts +7 -1
  22. package/dist/components/Notification/Notification.d.ts +6 -4
  23. package/dist/components/Pagination/Pagination.d.ts +16 -13
  24. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  25. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  26. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  27. package/dist/components/RadioGroup/RadioGroup.d.ts +2 -2
  28. package/dist/components/SearchBar/SearchBar.d.ts +3 -3
  29. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  30. package/dist/components/Slider/Slider.d.ts +57 -0
  31. package/dist/components/Tabs/Tabs.d.ts +1 -1
  32. package/dist/components/TextInput/TextInput.d.ts +10 -0
  33. package/dist/design-system-react-components.cjs.development.js +3058 -936
  34. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  35. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  36. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  37. package/dist/design-system-react-components.esm.js +3049 -921
  38. package/dist/design-system-react-components.esm.js.map +1 -1
  39. package/dist/index.d.ts +12 -6
  40. package/dist/resources.scss +180 -170
  41. package/dist/styles.css +1 -1
  42. package/dist/theme/components/breadcrumb.d.ts +9 -0
  43. package/dist/theme/components/button.d.ts +22 -8
  44. package/dist/theme/components/card.d.ts +168 -0
  45. package/dist/theme/components/checkbox.d.ts +5 -1
  46. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  47. package/dist/theme/components/datePicker.d.ts +16 -0
  48. package/dist/theme/components/fieldset.d.ts +27 -0
  49. package/dist/theme/components/global.d.ts +23 -13
  50. package/dist/theme/components/globalMixins.d.ts +9 -1
  51. package/dist/theme/components/heading.d.ts +5 -0
  52. package/dist/theme/components/image.d.ts +31 -0
  53. package/dist/theme/components/label.d.ts +5 -3
  54. package/dist/theme/components/link.d.ts +4 -0
  55. package/dist/theme/components/list.d.ts +5 -1
  56. package/dist/theme/components/notification.d.ts +4 -14
  57. package/dist/theme/components/pagination.d.ts +19 -0
  58. package/dist/theme/components/progressIndicator.d.ts +50 -0
  59. package/dist/theme/components/radioGroup.d.ts +12 -0
  60. package/dist/theme/components/select.d.ts +11 -2
  61. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  62. package/dist/theme/components/slider.d.ts +51 -0
  63. package/dist/theme/components/textInput.d.ts +8 -0
  64. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  65. package/dist/theme/foundations/global.d.ts +6 -1
  66. package/package.json +72 -84
  67. package/src/__tests__/setup.ts +2 -2
  68. package/src/components/Accordion/Accordion.stories.mdx +39 -42
  69. package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
  70. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -0
  71. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  72. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +24 -8
  73. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +33 -0
  74. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
  75. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
  76. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -1
  77. package/src/components/Button/Button.stories.mdx +15 -10
  78. package/src/components/Button/Button.test.tsx +21 -7
  79. package/src/components/Button/Button.tsx +18 -33
  80. package/src/components/Button/ButtonTypes.tsx +1 -0
  81. package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
  82. package/src/components/Card/Card.stories.mdx +296 -259
  83. package/src/components/Card/Card.test.tsx +156 -84
  84. package/src/components/Card/Card.tsx +195 -145
  85. package/src/components/Card/CardTypes.tsx +0 -17
  86. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  87. package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
  88. package/src/components/CardEdition/_CardEdition.scss +22 -23
  89. package/src/components/Chakra/Box.stories.mdx +14 -15
  90. package/src/components/Chakra/Center.stories.mdx +15 -8
  91. package/src/components/Chakra/Grid.stories.mdx +16 -7
  92. package/src/components/Chakra/Stack.stories.mdx +35 -18
  93. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  94. package/src/components/Checkbox/Checkbox.test.tsx +30 -3
  95. package/src/components/Checkbox/Checkbox.tsx +27 -27
  96. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
  97. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
  98. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +1 -1
  99. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -15
  100. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +44 -80
  101. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  102. package/src/components/DatePicker/DatePicker.test.tsx +248 -65
  103. package/src/components/DatePicker/DatePicker.tsx +158 -130
  104. package/src/components/DatePicker/_DatePicker.scss +33 -67
  105. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  106. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  107. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  108. package/src/components/Fieldset/Fieldset.tsx +52 -0
  109. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  110. package/src/components/Form/Form.stories.mdx +4 -5
  111. package/src/components/Form/Form.tsx +1 -0
  112. package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
  113. package/src/components/Grid/SimpleGrid.test.tsx +4 -4
  114. package/src/components/Heading/Heading.stories.mdx +3 -4
  115. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +1 -1
  116. package/src/components/HelperErrorText/HelperErrorText.tsx +5 -1
  117. package/src/components/Hero/HeroTypes.tsx +1 -0
  118. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
  119. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -5
  120. package/src/components/HorizontalRule/HorizontalRule.test.tsx +17 -0
  121. package/src/components/HorizontalRule/HorizontalRule.tsx +21 -4
  122. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +5 -5
  123. package/src/components/Icons/Icon.stories.mdx +11 -3
  124. package/src/components/Icons/Icon.test.tsx +18 -0
  125. package/src/components/Icons/Icon.tsx +6 -0
  126. package/src/components/Icons/IconSvgs.tsx +22 -0
  127. package/src/components/Icons/IconTypes.tsx +11 -0
  128. package/src/components/Image/Image.stories.mdx +220 -0
  129. package/src/components/Image/Image.test.tsx +131 -29
  130. package/src/components/Image/Image.tsx +84 -56
  131. package/src/components/Image/ImageTypes.ts +22 -0
  132. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  133. package/src/components/Input/Input.stories.tsx +20 -64
  134. package/src/components/Input/_Input.scss +23 -14
  135. package/src/components/Link/Link.tsx +4 -1
  136. package/src/components/List/List.stories.mdx +1 -1
  137. package/src/components/List/List.tsx +11 -4
  138. package/src/components/Modal/Modal.stories.mdx +3 -3
  139. package/src/components/Modal/_Modal.scss +2 -2
  140. package/src/components/Notification/Notification.stories.mdx +1 -3
  141. package/src/components/Notification/Notification.tsx +24 -9
  142. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +2 -0
  143. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  144. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  145. package/src/components/Pagination/Pagination.test.tsx +276 -146
  146. package/src/components/Pagination/Pagination.tsx +174 -154
  147. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  148. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  149. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  150. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  151. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  152. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  153. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  154. package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
  155. package/src/components/RadioGroup/RadioGroup.tsx +11 -16
  156. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +39 -71
  157. package/src/components/SearchBar/SearchBar.Test.tsx +66 -21
  158. package/src/components/SearchBar/SearchBar.stories.mdx +114 -10
  159. package/src/components/SearchBar/SearchBar.tsx +15 -5
  160. package/src/components/Select/SelectTypes.tsx +1 -0
  161. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
  162. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  163. package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
  164. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  165. package/src/components/Slider/Slider.stories.mdx +529 -0
  166. package/src/components/Slider/Slider.test.tsx +653 -0
  167. package/src/components/Slider/Slider.tsx +303 -0
  168. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  169. package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
  170. package/src/components/StyleGuide/Breakpoints.stories.mdx +21 -7
  171. package/src/components/StyleGuide/Buttons.stories.mdx +69 -15
  172. package/src/components/StyleGuide/ColorCard.tsx +0 -1
  173. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  174. package/src/components/StyleGuide/Iconography.stories.mdx +51 -62
  175. package/src/components/Tabs/Tabs.tsx +5 -5
  176. package/src/components/Template/Template.stories.mdx +11 -16
  177. package/src/components/TextInput/TextInput.stories.mdx +1 -1
  178. package/src/components/TextInput/TextInput.tsx +23 -6
  179. package/src/components/TextInput/TextInputTypes.tsx +2 -0
  180. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -3
  181. package/src/docs/Chakra.stories.mdx +2 -2
  182. package/src/index.ts +20 -12
  183. package/src/resources.scss +5 -5
  184. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  185. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  186. package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
  187. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  188. package/src/styles/base/_place-holder.scss +14 -3
  189. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  190. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  191. package/src/styles/space/_space-stack.scss +116 -0
  192. package/src/styles.scss +13 -55
  193. package/src/theme/components/breadcrumb.ts +10 -0
  194. package/src/theme/components/button.ts +18 -12
  195. package/src/theme/components/card.ts +174 -0
  196. package/src/theme/components/checkbox.ts +7 -2
  197. package/src/theme/components/checkboxGroup.ts +8 -0
  198. package/src/theme/components/datePicker.ts +17 -0
  199. package/src/theme/components/fieldset.ts +18 -0
  200. package/src/theme/components/global.ts +26 -15
  201. package/src/theme/components/globalMixins.ts +9 -1
  202. package/src/theme/components/heading.ts +5 -0
  203. package/src/theme/components/image.ts +116 -0
  204. package/src/theme/components/label.ts +3 -10
  205. package/src/theme/components/link.ts +4 -0
  206. package/src/theme/components/list.ts +6 -3
  207. package/src/theme/components/notification.ts +12 -14
  208. package/src/theme/components/pagination.ts +20 -0
  209. package/src/theme/components/progressIndicator.ts +62 -0
  210. package/src/theme/components/radioGroup.ts +8 -0
  211. package/src/theme/components/select.ts +5 -2
  212. package/src/theme/components/skeletonLoader.ts +107 -0
  213. package/src/theme/components/slider.ts +79 -0
  214. package/src/theme/components/textInput.ts +2 -0
  215. package/src/theme/foundations/breakpoints.ts +8 -8
  216. package/src/theme/foundations/global.ts +6 -1
  217. package/src/theme/index.ts +22 -4
  218. package/src/utils/componentCategories.ts +4 -3
  219. package/dist/components/Image/Image.stories.d.ts +0 -18
  220. package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
  221. package/dist/theme/components/customRadioGroup.d.ts +0 -18
  222. package/src/components/Button/_Button.scss +0 -32
  223. package/src/components/Card/_Card.scss +0 -308
  224. package/src/components/Image/Image.stories.tsx +0 -54
  225. package/src/components/Image/_Image.scss +0 -38
  226. package/src/components/Pagination/_Pagination.scss +0 -40
  227. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  228. package/src/styles/01-colors/_colors-brand.scss +0 -62
  229. package/src/styles/01-colors/_colors-utility.scss +0 -67
  230. package/src/styles/02-typography/_type-scale.css +0 -11
  231. package/src/styles/02-typography/_type-weight.css +0 -7
  232. package/src/styles/02-typography/_typefaces.css +0 -4
  233. package/src/styles/03-space/_space-stack.scss +0 -116
  234. package/src/styles/03-space/_space.css +0 -30
  235. package/src/styles/base/_card-grid.scss +0 -77
  236. package/src/styles/base/_typography.scss +0 -11
  237. package/src/theme/components/customCheckboxGroup.ts +0 -12
  238. package/src/theme/components/customRadioGroup.ts +0 -12
@@ -2,6 +2,7 @@ import * as React from "react";
2
2
  import { render, screen } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
4
  import userEvent from "@testing-library/user-event";
5
+ import renderer from "react-test-renderer";
5
6
 
6
7
  import DatePicker from "./DatePicker";
7
8
  import { DatePickerTypes } from "./DatePickerTypes";
@@ -36,7 +37,7 @@ describe("DatePicker Accessibility", () => {
36
37
  const { container } = render(
37
38
  <DatePicker
38
39
  labelText="Select the date range you want to visit NYPL"
39
- dateRange={true}
40
+ isDateRange
40
41
  />
41
42
  );
42
43
  expect(await axe(container)).toHaveNoViolations();
@@ -207,21 +208,37 @@ describe("DatePicker", () => {
207
208
  ).toBeInTheDocument();
208
209
  });
209
210
 
210
- // TODO: this should also be for the invalid text.
211
- it("should not render the helper text when 'showHelperInvalidText' is false", () => {
212
- render(
211
+ it("should not render the helper text or invalid text when 'showHelperInvalidText' is false", () => {
212
+ const { rerender } = render(
213
213
  <DatePicker
214
214
  labelText="Select the date you want to visit NYPL"
215
215
  helperText="Note that the Library may be closed on Sundays."
216
216
  invalidText="Please select a valid date."
217
217
  showHelperInvalidText={false}
218
- isInvalid
219
218
  />
220
219
  );
220
+ expect(
221
+ screen.queryByText("Note that the Library may be closed on Sundays.")
222
+ ).not.toBeInTheDocument();
223
+ expect(
224
+ screen.queryByText("Please select a valid date.")
225
+ ).not.toBeInTheDocument();
221
226
 
227
+ rerender(
228
+ <DatePicker
229
+ labelText="Select the date you want to visit NYPL"
230
+ helperText="Note that the Library may be closed on Sundays."
231
+ invalidText="Please select a valid date."
232
+ showHelperInvalidText={false}
233
+ isInvalid
234
+ />
235
+ );
222
236
  expect(
223
237
  screen.queryByText("Note that the Library may be closed on Sundays.")
224
238
  ).not.toBeInTheDocument();
239
+ expect(
240
+ screen.queryByText("Please select a valid date.")
241
+ ).not.toBeInTheDocument();
225
242
  });
226
243
 
227
244
  it("should render a disabled input field", () => {
@@ -229,7 +246,7 @@ describe("DatePicker", () => {
229
246
  <DatePicker
230
247
  labelText="Select the date you want to visit NYPL"
231
248
  helperText="Note that the Library may be closed on Sundays."
232
- isDisabled={true}
249
+ isDisabled
233
250
  />
234
251
  );
235
252
 
@@ -243,13 +260,45 @@ describe("DatePicker", () => {
243
260
  <DatePicker
244
261
  labelText="Select the date you want to visit NYPL"
245
262
  helperText="Note that the Library may be closed on Sundays."
246
- required={true}
263
+ isRequired
247
264
  />
248
265
  );
249
266
 
250
267
  expect(screen.getByText(/required/i)).toBeInTheDocument();
251
268
  });
252
269
 
270
+ it("should hide the Optional/Required text in the label with `showOptReqLabel`", () => {
271
+ const { rerender } = render(
272
+ <DatePicker labelText="Select the date you want to visit NYPL" />
273
+ );
274
+ expect(screen.getByText(/Optional/i)).toBeInTheDocument();
275
+
276
+ rerender(
277
+ <DatePicker
278
+ labelText="Select the date you want to visit NYPL"
279
+ showOptReqLabel={false}
280
+ />
281
+ );
282
+ expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
283
+
284
+ rerender(
285
+ <DatePicker
286
+ labelText="Select the date you want to visit NYPL"
287
+ isRequired
288
+ />
289
+ );
290
+ expect(screen.getByText(/Required/i)).toBeInTheDocument();
291
+
292
+ rerender(
293
+ <DatePicker
294
+ labelText="Select the date you want to visit NYPL"
295
+ showOptReqLabel={false}
296
+ isRequired
297
+ />
298
+ );
299
+ expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
300
+ });
301
+
253
302
  it("should pass the value to the `onChange` function", () => {
254
303
  let dateObject: any = {};
255
304
  const onChange = (data) => {
@@ -259,8 +308,8 @@ describe("DatePicker", () => {
259
308
  <DatePicker
260
309
  labelText="Select the date you want to visit NYPL"
261
310
  helperText="Note that the Library may be closed on Sundays."
262
- required={true}
263
311
  onChange={onChange}
312
+ isRequired
264
313
  />
265
314
  );
266
315
 
@@ -316,17 +365,68 @@ describe("DatePicker", () => {
316
365
  );
317
366
  });
318
367
 
319
- it("should not render a required label if the 'showOptReqLabel' flag is false", () => {
320
- render(
321
- <DatePicker
322
- labelText="Select the date you want to visit NYPL"
323
- helperText="Note that the Library may be closed on Sundays."
324
- required={true}
325
- showOptReqLabel={false}
326
- />
327
- );
328
-
329
- expect(screen.queryByText(/required/i)).not.toBeInTheDocument();
368
+ // Note: Have to add an initial date so that the snapshot tests always
369
+ // pass. Otherwise, it'll use the _current_ date which changes
370
+ // based on the day it is tested and is not what we want.
371
+ it.skip("renders the UI snapshot correctly", () => {
372
+ const basic = renderer
373
+ .create(
374
+ <DatePicker
375
+ id="basic"
376
+ labelText="Select the full date you want to visit NYPL"
377
+ initialDate="1/2/1988"
378
+ />
379
+ )
380
+ .toJSON();
381
+ const withoutLabel = renderer
382
+ .create(
383
+ <DatePicker
384
+ id="no-label"
385
+ labelText="Select the date you want to visit NYPL"
386
+ initialDate="1/2/1988"
387
+ showLabel={false}
388
+ />
389
+ )
390
+ .toJSON();
391
+ const withCustomFormat = renderer
392
+ .create(
393
+ <DatePicker
394
+ id="custom-format"
395
+ labelText="Select the date you want to visit NYPL"
396
+ dateFormat="yyyy/dd/MM"
397
+ initialDate="1/2/1988"
398
+ />
399
+ )
400
+ .toJSON();
401
+ const invalid = renderer
402
+ .create(
403
+ <DatePicker
404
+ id="invalid"
405
+ labelText="Select the date you want to visit NYPL"
406
+ helperText="Note that the Library may be closed on Sundays."
407
+ invalidText="Please select a valid date."
408
+ initialDate="1/2/1988"
409
+ isInvalid
410
+ />
411
+ )
412
+ .toJSON();
413
+ const disabled = renderer
414
+ .create(
415
+ <DatePicker
416
+ id="disabled"
417
+ labelText="Select the date you want to visit NYPL"
418
+ helperText="Note that the Library may be closed on Sundays."
419
+ invalidText="Please select a valid date."
420
+ initialDate="1/2/1988"
421
+ isDisabled
422
+ />
423
+ )
424
+ .toJSON();
425
+ expect(basic).toMatchSnapshot();
426
+ expect(withoutLabel).toMatchSnapshot();
427
+ expect(withCustomFormat).toMatchSnapshot();
428
+ expect(invalid).toMatchSnapshot();
429
+ expect(disabled).toMatchSnapshot();
330
430
  });
331
431
  });
332
432
 
@@ -334,8 +434,8 @@ describe("DatePicker", () => {
334
434
  it("should render the date range with two input fields", () => {
335
435
  render(
336
436
  <DatePicker
337
- dateRange={true}
338
437
  labelText="Select the date range you want to visit NYPL"
438
+ isDateRange
339
439
  />
340
440
  );
341
441
  const [year, month, day] = getTodaysValues();
@@ -354,7 +454,7 @@ describe("DatePicker", () => {
354
454
  render(
355
455
  <DatePicker
356
456
  labelText="Select the full date you want to visit NYPL"
357
- dateRange={true}
457
+ isDateRange
358
458
  initialDate="1/2/1988"
359
459
  initialDateTo="3/4/1990"
360
460
  />
@@ -369,12 +469,12 @@ describe("DatePicker", () => {
369
469
  it("should render two input labels and three separate helper text", () => {
370
470
  render(
371
471
  <DatePicker
372
- dateRange={true}
373
472
  labelText="Select the date range you want to visit NYPL"
374
473
  helperText="Note that the Library may be closed on Sundays."
375
474
  helperTextFrom="Note for the 'from' field."
376
475
  helperTextTo="Note for the 'to' field."
377
476
  invalidText="Please select a valid date range."
477
+ isDateRange
378
478
  />
379
479
  );
380
480
  // There are two labels for each input.
@@ -392,95 +492,169 @@ describe("DatePicker", () => {
392
492
  expect(screen.getByText(/Note for the 'to' field./i)).toBeInTheDocument();
393
493
  });
394
494
 
395
- it("should render based on other props", () => {
495
+ it("should render different states based on respective props", () => {
396
496
  const { rerender } = render(
397
497
  <DatePicker
398
- dateRange
399
498
  labelText="Select the date range you want to visit NYPL"
400
499
  helperText="Note that the Library may be closed on Sundays."
401
500
  helperTextTo="Note for the 'to' field."
402
501
  invalidText="Please select a valid date range."
502
+ isDateRange
403
503
  isInvalid
404
504
  />
405
505
  );
406
506
 
507
+ // The invalid text displays under each input field.
407
508
  expect(
408
509
  screen.getAllByText("Please select a valid date range.")
409
510
  ).toHaveLength(2);
410
511
 
411
512
  rerender(
412
513
  <DatePicker
413
- dateRange
414
514
  labelText="Select the date range you want to visit NYPL"
415
515
  helperText="Note that the Library may be closed on Sundays."
416
516
  helperTextTo="Note for the 'to' field."
417
517
  invalidText="Please select a valid date range."
418
518
  isDisabled
519
+ isDateRange
419
520
  />
420
521
  );
421
-
522
+ // Both input fields are disabled.
422
523
  expect(screen.getByLabelText(/From/i)).toHaveAttribute("disabled");
423
524
  expect(screen.getByLabelText(/To/i)).toHaveAttribute("disabled");
424
525
 
425
526
  rerender(
426
527
  <DatePicker
427
- dateRange
428
528
  labelText="Select the date range you want to visit NYPL"
429
529
  helperText="Note that the Library may be closed on Sundays."
430
530
  helperTextTo="Note for the 'to' field."
431
531
  invalidText="Please select a valid date range."
432
- required
532
+ isRequired
533
+ isDateRange
433
534
  />
434
535
  );
536
+ // Both input fields are required.
537
+ // The "Required" text is only displayed once in the `legend`.
538
+ expect(screen.getAllByText(/required/i)).toHaveLength(1);
539
+ expect(screen.getByLabelText(/From/i)).toHaveAttribute("required");
540
+ expect(screen.getByLabelText(/To/i)).toHaveAttribute("required");
541
+ });
435
542
 
436
- expect(screen.getAllByText(/required/i)).toHaveLength(2);
543
+ // Note: Have to add initial dates so that the snapshot tests always
544
+ // pass. Otherwise, it'll use the _current_ date which changes
545
+ // based on the day it is tested and is not what we want.
546
+ it("renders the UI snapshot correctly", () => {
547
+ const basic = renderer
548
+ .create(
549
+ <DatePicker
550
+ id="basic"
551
+ labelText="Select the full date you want to visit NYPL"
552
+ initialDate="1/2/1988"
553
+ initialDateTo="2/2/1988"
554
+ isDateRange
555
+ />
556
+ )
557
+ .toJSON();
558
+ const withoutLabel = renderer
559
+ .create(
560
+ <DatePicker
561
+ id="no-label"
562
+ labelText="Select the date you want to visit NYPL"
563
+ showLabel={false}
564
+ initialDate="1/2/1988"
565
+ initialDateTo="2/2/1988"
566
+ isDateRange
567
+ />
568
+ )
569
+ .toJSON();
570
+ const withCustomFormat = renderer
571
+ .create(
572
+ <DatePicker
573
+ id="custom-format"
574
+ labelText="Select the date you want to visit NYPL"
575
+ dateFormat="yyyy/dd/MM"
576
+ initialDate="1/2/1988"
577
+ initialDateTo="2/2/1988"
578
+ isDateRange
579
+ />
580
+ )
581
+ .toJSON();
582
+ const invalid = renderer
583
+ .create(
584
+ <DatePicker
585
+ id="invalid"
586
+ labelText="Select the date you want to visit NYPL"
587
+ helperText="Note that the Library may be closed on Sundays."
588
+ invalidText="Please select a valid date."
589
+ initialDate="1/2/1988"
590
+ initialDateTo="2/2/1988"
591
+ isInvalid
592
+ isDateRange
593
+ />
594
+ )
595
+ .toJSON();
596
+ const disabled = renderer
597
+ .create(
598
+ <DatePicker
599
+ id="disabled"
600
+ labelText="Select the date you want to visit NYPL"
601
+ helperText="Note that the Library may be closed on Sundays."
602
+ invalidText="Please select a valid date."
603
+ initialDate="1/2/1988"
604
+ initialDateTo="2/2/1988"
605
+ isDisabled
606
+ isDateRange
607
+ />
608
+ )
609
+ .toJSON();
610
+ expect(basic).toMatchSnapshot();
611
+ expect(withoutLabel).toMatchSnapshot();
612
+ expect(withCustomFormat).toMatchSnapshot();
613
+ expect(invalid).toMatchSnapshot();
614
+ expect(disabled).toMatchSnapshot();
437
615
  });
438
616
 
439
- /* // REVISIT THIS TEST
440
617
  it("should select two new dates", () => {
441
618
  render(
442
619
  <DatePicker
443
- dateRange={true}
620
+ initialDate="3/2/1988"
621
+ initialDateTo="3/28/1988"
622
+ isDateRange
444
623
  labelText="Select the date range you want to visit NYPL"
445
624
  />
446
625
  );
447
626
  const fromInput = screen.getByLabelText(/From/i);
448
627
  const toInput = screen.getByLabelText(/To/i);
449
- const date = getTodaysDateDisplay();
450
628
 
451
- expect(screen.getAllByDisplayValue(date)).toHaveLength(2);
629
+ expect(fromInput).toHaveValue("1988-03-02");
630
+ expect(toInput).toHaveValue("1988-03-28");
631
+ // expect(screen.getAllByDisplayValue(date)).toHaveLength(2);
452
632
 
453
633
  // Let's select a new day.
454
634
  userEvent.click(fromInput);
455
635
  // The popup displays. Select a new day.
456
- const newDateFrom =
457
- todaysDate.getDate() > 28 ? 1 : todaysDate.getDate() + 1;
458
- const newDateTo =
459
- todaysDate.getDate() > 28 ? 18 : todaysDate.getDate() + 5;
460
- const newDateToSelect = str_pad(newDateFrom);
461
- userEvent.click(screen.getAllByText(newDateFrom)[0]);
636
+ const newDateFrom = 5;
637
+ const newDateTo = 25;
638
+ userEvent.click(screen.getByText(newDateFrom));
462
639
 
463
- // We selected a new day but kept everything else the same. So we just
464
- // need to remove the older day with the new "2" selected date.
465
- // Example: 2021-08-01 -> 2 is selected -> 2021-08-02
466
- const newFromValue = `${date.slice(0, -2)}${newDateToSelect}`;
467
- expect(screen.getByDisplayValue(newFromValue)).toBeInTheDocument();
640
+ // We selected a new day but kept everything else the same.
641
+ // Example: 2021-03-02 -> 5 is selected -> 2021-03-05
642
+ expect(screen.getByDisplayValue("1988-03-05")).toBeInTheDocument();
468
643
  // The "To" input should only have the older value now.
469
- expect(screen.getAllByDisplayValue(date)).toHaveLength(1);
644
+ // expect(screen.getAllByDisplayValue(date)).toHaveLength(1);
470
645
 
471
646
  // Now select the "To" date.
472
647
  userEvent.click(toInput);
473
648
  // The popup displays.
474
649
  userEvent.click(screen.getByText(newDateTo));
475
650
 
476
- const newToValue = `${date.slice(0, -2)}${newDateTo}`;
477
- expect(screen.getByDisplayValue(newToValue)).toBeInTheDocument();
478
- // The original date value is no longer in display.
479
- expect(screen.queryAllByDisplayValue(date)).toHaveLength(0);
651
+ expect(screen.getByDisplayValue("1988-03-25")).toBeInTheDocument();
652
+ // The original date values are no longer in display.
653
+ expect(screen.queryByDisplayValue("1988-03-02")).not.toBeInTheDocument();
654
+ expect(screen.queryByDisplayValue("1988-03-28")).not.toBeInTheDocument();
480
655
  // The "From" date value wasn't affected by this!
481
- expect(screen.getByDisplayValue(newFromValue)).toBeInTheDocument();
656
+ expect(screen.getByDisplayValue("1988-03-05")).toBeInTheDocument();
482
657
  });
483
- */
484
658
  });
485
659
 
486
660
  describe("Popup Calendar", () => {
@@ -513,11 +687,16 @@ describe("DatePicker", () => {
513
687
  });
514
688
 
515
689
  it("should select a new date from the calendar", () => {
516
- render(<DatePicker labelText="Select the date you want to visit NYPL" />);
690
+ render(
691
+ <DatePicker
692
+ labelText="Select the date you want to visit NYPL"
693
+ initialDate="08/01/2021"
694
+ />
695
+ );
517
696
  const input = screen.getByLabelText(
518
697
  /Select the date you want to visit NYPL/i
519
698
  );
520
- const date = getTodaysDateDisplay();
699
+ const date = "2021-08-01";
521
700
  const midMonthDay = "15";
522
701
 
523
702
  expect(screen.getByDisplayValue(date)).toBeInTheDocument();
@@ -535,19 +714,18 @@ describe("DatePicker", () => {
535
714
 
536
715
  // Let's select a new month
537
716
  userEvent.click(input);
538
- // The popup displays.
717
+ // The popup displays. We are currently on 08/15/2021.
539
718
  expect(
540
- screen.getByText(monthArray[todaysDate.getMonth()], { exact: false })
719
+ screen.getByText(monthArray["7"], { exact: false })
541
720
  ).toBeInTheDocument();
542
721
  userEvent.click(screen.getByLabelText("Next Month"));
543
722
  userEvent.click(screen.getByLabelText("Next Month"));
544
723
 
545
724
  // We are two months ahead but still selecting the midmonth day.
546
725
  userEvent.click(screen.getByText(midMonthDay));
547
- // So only the month should change accordingly. The month value from JS'
548
- // Date object is 0-index so we have to add 3.
726
+ // So only the month should change accordingly.
549
727
  const newMonthValue = `${newDayValue.substr(0, 5)}${str_pad(
550
- todaysDate.getMonth() + 3
728
+ "10"
551
729
  )}${newDayValue.substr(7)}`;
552
730
  expect(screen.getByDisplayValue(newMonthValue)).toBeInTheDocument();
553
731
  });
@@ -582,33 +760,38 @@ describe("DatePicker", () => {
582
760
  render(
583
761
  <DatePicker
584
762
  dateType={DatePickerTypes.Month}
763
+ initialDate="4/1/1988"
585
764
  labelText="Select the month you want to visit NYPL"
586
765
  />
587
766
  );
588
767
  const input = screen.getByLabelText(
589
768
  /Select the month you want to visit NYPL/i
590
769
  );
591
- const date = getTodaysDateDisplay(DatePickerTypes.Month);
592
- let currentMonthSelected = monthArray[todaysDate.getMonth() + 1];
770
+ // In the "month" format.
771
+ const date = "04-1988";
772
+ // Let's select May as the new month.
773
+ let currentMonthSelected = monthArray[4];
593
774
  let currentMonthSelectedDisplay = currentMonthSelected.slice(0, 3);
594
775
 
776
+ // We start off with April being displayed as "4-1988".
595
777
  expect(screen.getByDisplayValue(date)).toBeInTheDocument();
596
778
  expect(
597
779
  screen.queryByText(currentMonthSelectedDisplay)
598
780
  ).not.toBeInTheDocument();
599
781
 
600
- // Let's select a new day.
782
+ // Let's select a new day by first clicking on the input to open
783
+ // the calendar popup.
601
784
  userEvent.click(input);
602
- // The popup displays.
603
785
 
786
+ // Now "May" appears as the next month in the calendar popup.
604
787
  expect(screen.getByText(currentMonthSelectedDisplay)).toBeInTheDocument();
605
788
 
606
- userEvent.click(screen.getByText("Jan"));
789
+ userEvent.click(screen.getByText(currentMonthSelectedDisplay));
607
790
 
608
791
  // We selected a new month but kept the year the same.
609
- // Example: 08-2021 -> "Jan" -> 01-2021
792
+ // Example: 04-2021 -> "May" -> 05-2021
610
793
  expect(
611
- screen.getByDisplayValue(`01-${date.substr(3)}`)
794
+ screen.getByDisplayValue(`05-${date.substr(3)}`)
612
795
  ).toBeInTheDocument();
613
796
  });
614
797