@kaizen/components 1.52.0 → 1.53.0

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 (220) hide show
  1. package/dist/cjs/DatePicker/DatePicker.cjs +8 -1
  2. package/dist/cjs/DatePicker/utils/getLocale.cjs +2 -0
  3. package/dist/cjs/DatePicker/utils/validateDate.cjs +28 -2
  4. package/dist/cjs/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.cjs +8 -1
  5. package/dist/cjs/Filter/FilterBar/subcomponents/ClearAllButton/ClearAllButton.cjs +14 -2
  6. package/dist/cjs/Filter/FilterBar/subcomponents/FilterBarDatePicker/FilterBarDatePicker.cjs +1 -0
  7. package/dist/cjs/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs +10 -1
  8. package/dist/cjs/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.cjs +8 -1
  9. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.cjs +5 -1
  10. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useEndDateValidation.cjs +1 -0
  11. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useStartDateValidation.cjs +1 -0
  12. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/validateEndDateBeforeStartDate.cjs +16 -1
  13. package/dist/cjs/__future__/Workflow/subcomponents/Header/Header.cjs +1 -1
  14. package/dist/esm/DatePicker/DatePicker.mjs +8 -1
  15. package/dist/esm/DatePicker/utils/getLocale.mjs +3 -1
  16. package/dist/esm/DatePicker/utils/validateDate.mjs +22 -2
  17. package/dist/esm/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.mjs +8 -1
  18. package/dist/esm/Filter/FilterBar/subcomponents/ClearAllButton/ClearAllButton.mjs +14 -2
  19. package/dist/esm/Filter/FilterBar/subcomponents/FilterBarDatePicker/FilterBarDatePicker.mjs +1 -0
  20. package/dist/esm/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs +10 -1
  21. package/dist/esm/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.mjs +8 -1
  22. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.mjs +5 -1
  23. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useEndDateValidation.mjs +1 -0
  24. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useStartDateValidation.mjs +1 -0
  25. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/validateEndDateBeforeStartDate.mjs +10 -1
  26. package/dist/esm/__future__/Workflow/subcomponents/Header/Header.mjs +1 -1
  27. package/dist/types/AvatarGroup/_docs/example-data.d.ts +8 -0
  28. package/dist/types/BrandMoment/_docs/ExampleHeaders.d.ts +3 -0
  29. package/dist/types/Calendar/_docs/controls/defaultMonthControls.d.ts +2 -0
  30. package/dist/types/Calendar/_docs/controls/weekStartsOnControls.d.ts +2 -0
  31. package/dist/types/Container/Container.d.ts +1 -1
  32. package/dist/types/Content/Content.d.ts +1 -1
  33. package/dist/types/DateInput/DateInput/DateInput.d.ts +1 -1
  34. package/dist/types/DatePicker/DatePicker.d.ts +1 -1
  35. package/dist/types/DatePicker/_docs/controls/datePickerLocaleControls.d.ts +2 -0
  36. package/dist/types/DatePicker/_docs/controls/disabledDayMatchersControls.d.ts +2 -0
  37. package/dist/types/DatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
  38. package/dist/types/DatePicker/types.d.ts +2 -1
  39. package/dist/types/DatePicker/utils/getLocale.d.ts +1 -1
  40. package/dist/types/Filter/FilterBar/context/types.d.ts +28 -0
  41. package/dist/types/Filter/FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.d.ts +1 -1
  42. package/dist/types/Filter/FilterDatePicker/_docs/controls/disabledDaysControls.d.ts +2 -0
  43. package/dist/types/Filter/FilterDatePicker/_docs/controls/validationControls.d.ts +2 -0
  44. package/dist/types/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
  45. package/dist/types/Filter/FilterDateRangePicker/_docs/controls/disabledDaysControls.d.ts +2 -0
  46. package/dist/types/Filter/FilterDateRangePicker/_docs/controls/validationControls.d.ts +2 -0
  47. package/dist/types/Filter/FilterMultiSelect/_docs/MockData.d.ts +10 -0
  48. package/dist/types/Filter/FilterSelect/_docs/mockData.d.ts +6 -0
  49. package/dist/types/Filter/_docs/controls/renderTriggerControls.d.ts +2 -0
  50. package/dist/types/Menu/_docs/MenuContentExample.d.ts +8 -0
  51. package/dist/types/Menu/_docs/examples.d.ts +11 -0
  52. package/dist/types/Modal/_docs/controls.d.ts +11 -0
  53. package/dist/types/MultiSelect/MultiSelect.d.ts +23 -0
  54. package/dist/types/MultiSelect/subcomponents/MultiSelectOptions/MultiSelectOptions.d.ts +13 -0
  55. package/dist/types/Select/Select.d.ts +3 -3
  56. package/dist/types/Workflow/_docs/controls/controls.d.ts +2 -0
  57. package/dist/types/Workflow/_docs/controls/index.d.ts +1 -0
  58. package/dist/types/__future__/Select/Select.d.ts +2 -2
  59. package/dist/types/__future__/Select/_docs/mockData.d.ts +6 -0
  60. package/dist/types/__future__/Select/subcomponents/SelectToggle/SelectToggle.d.ts +2 -2
  61. package/dist/types/__future__/Select/types.d.ts +22 -0
  62. package/dist/types/__future__/Workflow/_docs/controls/controls.d.ts +2 -0
  63. package/dist/types/__future__/Workflow/_docs/controls/index.d.ts +1 -0
  64. package/dist/types/__overlays__/Tooltip/v1/utils/isSemanticElement.d.ts +2 -2
  65. package/dist/types/utils/getNodeText.d.ts +2 -1
  66. package/locales/en.json +40 -0
  67. package/package.json +3 -3
  68. package/src/Avatar/_docs/Avatar.mdx +1 -1
  69. package/src/AvatarGroup/_docs/AvatarGroup.mdx +1 -1
  70. package/src/Badge/_docs/Badge.mdx +1 -1
  71. package/src/Brand/_docs/Brand.mdx +1 -1
  72. package/src/BrandMoment/_docs/BrandMoment.mdx +1 -1
  73. package/src/Button/Button/_docs/Button.mdx +1 -1
  74. package/src/Button/IconButton/_docs/IconButton.mdx +1 -1
  75. package/src/ButtonGroup/_docs/ButtonGroup.mdx +1 -1
  76. package/src/Calendar/CalendarRange/_docs/CalendarRange.mdx +1 -1
  77. package/src/Calendar/CalendarSingle/_docs/CalendarSingle.mdx +1 -1
  78. package/src/Card/_docs/Card.mdx +1 -1
  79. package/src/Checkbox/Checkbox/_docs/Checkbox.mdx +1 -1
  80. package/src/Checkbox/CheckboxField/_docs/CheckboxField.mdx +1 -1
  81. package/src/Checkbox/CheckboxGroup/_docs/CheckboxGroup.mdx +1 -1
  82. package/src/Collapsible/Collapsible/_docs/Collapsible.mdx +1 -1
  83. package/src/Collapsible/CollapsibleGroup/_docs/CollapsibleGroup.mdx +1 -1
  84. package/src/Collapsible/ExpertAdviceCollapsible/_docs/ExpertAdviceCollapsible.mdx +1 -1
  85. package/src/Container/_docs/Container.mdx +1 -1
  86. package/src/Content/_docs/Content.mdx +1 -1
  87. package/src/DateInput/DateInputDescription/DateInputDescription.spec.tsx +26 -18
  88. package/src/DatePicker/DatePicker.spec.tsx +100 -69
  89. package/src/DatePicker/DatePicker.tsx +13 -5
  90. package/src/DatePicker/_docs/DatePicker.mdx +1 -1
  91. package/src/DatePicker/_docs/DatePicker.stickersheet.stories.tsx +57 -21
  92. package/src/DatePicker/_docs/DatePicker.stories.tsx +2 -3
  93. package/src/DatePicker/_docs/controls/datePickerLocaleControls.ts +1 -1
  94. package/src/DatePicker/subcomponents/DateInputField/DateInputField.spec.tsx +49 -36
  95. package/src/DatePicker/types.ts +2 -1
  96. package/src/DatePicker/utils/getLocale.ts +6 -2
  97. package/src/DatePicker/utils/validateDate.spec.ts +40 -16
  98. package/src/DatePicker/utils/{validateDate.ts → validateDate.tsx} +24 -4
  99. package/src/DateRangePicker/_docs/DateRangePicker.mdx +1 -1
  100. package/src/Divider/_docs/Divider.mdx +1 -1
  101. package/src/EmptyState/_docs/EmptyState.mdx +1 -1
  102. package/src/ErrorPage/_docs/ErrorPage.mdx +1 -1
  103. package/src/FieldGroup/_docs/FieldGroup.mdx +1 -1
  104. package/src/FieldMessage/_docs/FieldMessage.mdx +1 -1
  105. package/src/Filter/Filter/_docs/Filter.mdx +1 -1
  106. package/src/Filter/FilterBar/FilterBar.spec.tsx +56 -25
  107. package/src/Filter/FilterBar/_docs/FilterBar.mdx +1 -1
  108. package/src/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.spec.tsx +21 -13
  109. package/src/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.tsx +11 -1
  110. package/src/Filter/FilterBar/subcomponents/ClearAllButton/ClearAllButton.tsx +17 -2
  111. package/src/Filter/FilterBar/subcomponents/FilterBarButton/FilterBarButton.spec.tsx +17 -8
  112. package/src/Filter/FilterBar/subcomponents/FilterBarDatePicker/FilterBarDatePicker.spec.tsx +37 -23
  113. package/src/Filter/FilterBar/subcomponents/FilterBarDateRangePicker/FilterBarDateRangePicker.spec.tsx +35 -23
  114. package/src/Filter/FilterBar/subcomponents/FilterBarMultiSelect/FilterBarMultiSelect.spec.tsx +42 -26
  115. package/src/Filter/FilterBar/subcomponents/FilterBarSelect/FilterBarSelect.spec.tsx +37 -24
  116. package/src/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.spec.tsx +12 -12
  117. package/src/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.tsx +15 -2
  118. package/src/Filter/FilterButton/_docs/filter-buttons.mdx +1 -1
  119. package/src/Filter/FilterDatePicker/FilterDatePicker.spec.tsx +21 -16
  120. package/src/Filter/FilterDatePicker/_docs/FilterDatePicker.mdx +1 -1
  121. package/src/Filter/FilterDatePicker/_docs/FilterDatePicker.stickersheet.stories.tsx +50 -1
  122. package/src/Filter/FilterDatePicker/hooks/useDateInputHandlers.spec.ts +3 -3
  123. package/src/Filter/FilterDatePicker/hooks/{useDateValidation.spec.tsx → useDateValidation.spec.ts} +13 -12
  124. package/src/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.tsx +10 -1
  125. package/src/Filter/FilterDatePicker/subcomponents/FilterDatePickerField/FilterDatePickerField.spec.tsx +57 -36
  126. package/src/Filter/FilterDatePicker/utils/validateDate.spec.ts +52 -28
  127. package/src/Filter/FilterDateRangePicker/FilterDateRangePicker.spec.tsx +3 -2
  128. package/src/Filter/FilterDateRangePicker/_docs/FilterDateRangePicker.mdx +1 -1
  129. package/src/Filter/FilterDateRangePicker/_docs/FilterDateRangePicker.stickersheet.stories.tsx +55 -24
  130. package/src/Filter/FilterDateRangePicker/subcomponents/DateRangeInputField/DateRangeInputField.spec.tsx +43 -28
  131. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.spec.tsx +82 -48
  132. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.tsx +6 -1
  133. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/{useEndDateValidation.spec.tsx → useEndDateValidation.spec.ts} +23 -20
  134. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/{useStartDateValidation.spec.tsx → useStartDateValidation.spec.ts} +13 -11
  135. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/validateEndDateBeforeStartDate.spec.ts +17 -6
  136. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/{validateEndDateBeforeStartDate.ts → validateEndDateBeforeStartDate.tsx} +9 -3
  137. package/src/Filter/FilterMultiSelect/FilterMultiSelect.spec.tsx +10 -14
  138. package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelect.mdx +1 -1
  139. package/src/Filter/FilterMultiSelect/context/SelectionProvider/SelectionProvider.spec.tsx +392 -372
  140. package/src/Filter/FilterMultiSelect/subcomponents/SearchInput/SearchInput.spec.tsx +9 -6
  141. package/src/Filter/FilterSelect/_docs/FilterSelect.mdx +1 -1
  142. package/src/GuidanceBlock/_docs/GuidanceBlock.mdx +1 -1
  143. package/src/Heading/_docs/Heading.mdx +1 -1
  144. package/src/Icon/_docs/Icon.mdx +1 -1
  145. package/src/Illustration/Scene/BrandMomentCaptureIntro/_docs/BrandMomentCaptureIntro.mdx +1 -1
  146. package/src/Illustration/Scene/_docs/Scene.mdx +1 -1
  147. package/src/Illustration/Spot/_docs/Spot.mdx +1 -1
  148. package/src/Input/Input/_docs/Input.mdx +1 -1
  149. package/src/Input/InputRange/_docs/InputRange.mdx +1 -1
  150. package/src/Input/InputSearch/InputSearch.spec.tsx +15 -14
  151. package/src/Input/InputSearch/_docs/InputSearch.mdx +1 -1
  152. package/src/Label/_docs/Label.mdx +1 -1
  153. package/src/LabelledMessage/_docs/LabelledMessage.mdx +1 -1
  154. package/src/LikertScaleLegacy/_docs/LikertScaleLegacy.mdx +1 -1
  155. package/src/Loading/LoadingGraphic/_docs/LoadingGraphic.mdx +1 -1
  156. package/src/Loading/LoadingHeading/_docs/LoadingHeading.mdx +1 -1
  157. package/src/Loading/LoadingInput/_docs/LoadingInput.mdx +1 -1
  158. package/src/Loading/LoadingParagraph/_docs/LoadingParagraph.mdx +1 -1
  159. package/src/Loading/LoadingSpinner/_docs/LoadingSpinner.mdx +1 -1
  160. package/src/Menu/_docs/Menu.mdx +1 -1
  161. package/src/Modal/ConfirmationModal/_docs/ConfirmationModal.mdx +1 -1
  162. package/src/Modal/ContextModal/_docs/ContextModal.mdx +1 -1
  163. package/src/Modal/GenericModal/_docs/GenericModal.mdx +1 -1
  164. package/src/Modal/InputEditModal/_docs/InputEditModal.mdx +1 -1
  165. package/src/MultiSelect/_docs/MultiSelect.mdx +1 -1
  166. package/src/Notification/GlobalNotification/_docs/GlobalNotification.mdx +1 -1
  167. package/src/Notification/InlineNotification/_docs/InlineNotification.mdx +1 -1
  168. package/src/Notification/ToastNotification/_docs/ToastNotification.mdx +1 -1
  169. package/src/Pagination/_docs/Pagination.mdx +1 -1
  170. package/src/Pagination/subcomponents/DirectionalLink/_docs/DirectionalLink.mdx +1 -1
  171. package/src/Pagination/subcomponents/PaginationLink/_docs/PaginationLink.mdx +1 -1
  172. package/src/Popover/_docs/Popover.mdx +1 -1
  173. package/src/ProgressBar/_docs/ProgressBar.mdx +1 -1
  174. package/src/Radio/Radio/_docs/Radio.mdx +1 -1
  175. package/src/Radio/RadioField/_docs/RadioField.mdx +1 -1
  176. package/src/Radio/RadioGroup/_docs/RadioGroup.mdx +1 -1
  177. package/src/RichTextEditor/EditableRichTextContent/_docs/EditableRichTextContent.mdx +1 -1
  178. package/src/RichTextEditor/RichTextContent/_docs/RichTextContent.mdx +1 -1
  179. package/src/RichTextEditor/RichTextEditor/_docs/RichTextEditor.mdx +1 -1
  180. package/src/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/_docs/ToggleIconButton.mdx +1 -1
  181. package/src/RichTextEditor/RichTextEditor/subcomponents/Toolbar/_docs/Toolbar.mdx +1 -1
  182. package/src/SearchField/_docs/SearchField.mdx +1 -1
  183. package/src/Select/_docs/Select.mdx +1 -1
  184. package/src/Skirt/_docs/Skirt.mdx +1 -1
  185. package/src/Slider/_docs/Slider.mdx +1 -1
  186. package/src/SplitButton/SplitButton.spec.tsx +11 -6
  187. package/src/SplitButton/_docs/SplitButton.mdx +1 -1
  188. package/src/SplitButton/subcomponents/DropdownButton/DropdownButton.spec.tsx +15 -10
  189. package/src/Table/_docs/Table.mdx +1 -1
  190. package/src/Tabs/_docs/Tabs.mdx +1 -1
  191. package/src/Tag/_docs/Tag.mdx +1 -1
  192. package/src/Text/_docs/Text.mdx +1 -1
  193. package/src/TextArea/_docs/TextArea.mdx +1 -1
  194. package/src/TextAreaField/_docs/TextAreaField.mdx +1 -1
  195. package/src/TextField/_docs/TextField.mdx +1 -1
  196. package/src/Tile/InformationTile/_docs/InformationTile.mdx +1 -1
  197. package/src/Tile/MultiActionTile/_docs/MultiActionTile.mdx +1 -1
  198. package/src/Tile/TileGrid/_docs/TileGrid.mdx +1 -1
  199. package/src/TimeField/_docs/TimeField.mdx +1 -1
  200. package/src/TitleBlockZen/_docs/TitleBlockZen.mdx +1 -1
  201. package/src/ToggleSwitch/ToggleSwitch/_docs/ToggleSwitch.mdx +1 -1
  202. package/src/ToggleSwitch/ToggleSwitchField/_docs/ToggleSwitchField.mdx +1 -1
  203. package/src/VisuallyHidden/_docs/VisuallyHidden.mdx +1 -1
  204. package/src/Well/_docs/Well.mdx +1 -1
  205. package/src/Workflow/_docs/ProgressStepper.mdx +1 -1
  206. package/src/Workflow/_docs/Workflow.mdx +1 -1
  207. package/src/Workflow/_docs/WorkflowFooter.mdx +1 -1
  208. package/src/Workflow/_docs/WorkflowHeader.mdx +1 -1
  209. package/src/__future__/Select/_docs/Select.mdx +1 -1
  210. package/src/__future__/Tag/Tag/_docs/Tag.mdx +1 -1
  211. package/src/__future__/Workflow/_docs/ProgressStepper.mdx +1 -1
  212. package/src/__future__/Workflow/_docs/Workflow.mdx +1 -1
  213. package/src/__future__/Workflow/_docs/WorkflowFooter.mdx +1 -1
  214. package/src/__future__/Workflow/_docs/WorkflowHeader.mdx +1 -1
  215. package/src/__future__/Workflow/subcomponents/Header/Header.tsx +1 -1
  216. package/src/__overlays__/Tooltip/v1/_docs/Tooltip.mdx +1 -1
  217. package/src/__overlays__/Tooltip/v3/_docs/ApiSpecification.mdx +0 -1
  218. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.docs.stories.tsx +52 -0
  219. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.mdx +40 -61
  220. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_spec.png +0 -0
@@ -1,43 +1,51 @@
1
1
  import React from "react"
2
- import { render } from "@testing-library/react"
2
+ import { waitFor } from "@testing-library/react"
3
3
  import { enUS } from "date-fns/locale"
4
+ import { renderWithIntl } from "~tests"
4
5
  import { DateInputDescription } from "./DateInputDescription"
5
6
 
6
7
  describe("DateInputDescription", () => {
7
- it("returns template string when description is undefined", () => {
8
- const { container } = render(<DateInputDescription locale={enUS} />)
9
- expect(container).toHaveTextContent("Input format:mm/dd/yyyy")
8
+ it("returns template string when description is undefined", async () => {
9
+ const { container } = renderWithIntl(<DateInputDescription locale={enUS} />)
10
+ await waitFor(() => {
11
+ expect(container).toHaveTextContent("Input format:mm/dd/yyyy")
12
+ })
10
13
  })
11
14
 
12
- it("returns template string when description is empty string", () => {
13
- const { container } = render(
15
+ it("returns template string when description is empty string", async () => {
16
+ const { container } = renderWithIntl(
14
17
  <DateInputDescription description="" locale={enUS} />
15
18
  )
16
- expect(container).toHaveTextContent("Input format:mm/dd/yyyy")
19
+ await waitFor(() => {
20
+ expect(container).toHaveTextContent("Input format:mm/dd/yyyy")
21
+ })
17
22
  })
18
23
 
19
- it("returns template string when description is a string", () => {
20
- const { container } = render(
24
+ it("returns template string when description is a string", async () => {
25
+ const { container } = renderWithIntl(
21
26
  <DateInputDescription
22
27
  description="Custom description here"
23
28
  locale={enUS}
24
29
  />
25
30
  )
26
- expect(container).toHaveTextContent(
27
- "Custom description here(Input format:mm/dd/yyyy)"
28
- )
31
+ await waitFor(() => {
32
+ expect(container).toHaveTextContent(
33
+ "Custom description here(Input format:mm/dd/yyyy)"
34
+ )
35
+ })
29
36
  })
30
37
 
31
- it("returns template string when description is an element", () => {
32
- const { container } = render(
38
+ it("returns template string when description is an element", async () => {
39
+ const { container } = renderWithIntl(
33
40
  <DateInputDescription
34
41
  description={<span>Custom description span</span>}
35
42
  locale={enUS}
36
43
  />
37
44
  )
38
-
39
- expect(container).toHaveTextContent(
40
- "Custom description span(Input format:mm/dd/yyyy)"
41
- )
45
+ await waitFor(() => {
46
+ expect(container).toHaveTextContent(
47
+ "Custom description span(Input format:mm/dd/yyyy)"
48
+ )
49
+ })
42
50
  })
43
51
  })
@@ -1,8 +1,8 @@
1
1
  import React, { useEffect, useState } from "react"
2
- import { render, screen, waitFor, within } from "@testing-library/react"
2
+ import { screen, waitFor, within } from "@testing-library/react"
3
3
  import userEvent from "@testing-library/user-event"
4
+ import { renderWithIntl } from "~tests"
4
5
  import { DatePicker } from "./DatePicker"
5
- import { ValidationResponse } from "./types"
6
6
  import { DatePickerProps } from "."
7
7
 
8
8
  const user = userEvent.setup()
@@ -26,20 +26,26 @@ const DatePickerWrapper = ({
26
26
  }
27
27
 
28
28
  describe("<DatePicker />", () => {
29
- it("should not show the calendar initially", () => {
30
- render(<DatePickerWrapper />)
31
- expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
29
+ it("should not show the calendar initially", async () => {
30
+ renderWithIntl(<DatePickerWrapper />)
31
+ await waitFor(() => {
32
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
33
+ })
32
34
  })
33
35
 
34
- it("should have an empty input value when a date is not provided", () => {
35
- render(<DatePickerWrapper />)
36
- const input = screen.getByLabelText("Input label", { selector: "input" })
37
- expect(input).toHaveValue("")
36
+ it("should have an empty input value when a date is not provided", async () => {
37
+ renderWithIntl(<DatePickerWrapper />)
38
+ await waitFor(() => {
39
+ const input = screen.getByLabelText("Input label", { selector: "input" })
40
+ expect(input).toHaveValue("")
41
+ })
38
42
  })
39
43
 
40
- it("should pre-fill the input when an initial date is provided", () => {
41
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
42
- expect(screen.getByDisplayValue("Mar 1, 2022")).toBeInTheDocument()
44
+ it("should pre-fill the input when an initial date is provided", async () => {
45
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
46
+ await waitFor(() => {
47
+ expect(screen.getByDisplayValue("Mar 1, 2022")).toBeInTheDocument()
48
+ })
43
49
  })
44
50
 
45
51
  it("re-renders the displayed input when an selectedDay is updated after initial render", async () => {
@@ -62,7 +68,7 @@ describe("<DatePicker />", () => {
62
68
  )
63
69
  }
64
70
 
65
- render(<DelayedSelectedDate />)
71
+ renderWithIntl(<DelayedSelectedDate />)
66
72
  expect(screen.getByRole("combobox")).toBeInTheDocument()
67
73
  expect(screen.getByRole("combobox")).toHaveValue("")
68
74
  await waitFor(() => {
@@ -71,7 +77,7 @@ describe("<DatePicker />", () => {
71
77
  })
72
78
 
73
79
  it("allows you to tab through input, button and calendar", async () => {
74
- render(<DatePickerWrapper />)
80
+ renderWithIntl(<DatePickerWrapper />)
75
81
  const input = screen.getByLabelText("Input label", { selector: "input" })
76
82
 
77
83
  await user.tab()
@@ -106,11 +112,9 @@ describe("<DatePicker />", () => {
106
112
  }, 6000)
107
113
 
108
114
  it("should validate and close the calendar when the user presses the Enter key while focus is in the input", async () => {
109
- render(<DatePickerWrapper disabledDates={[new Date("2022-05-01")]} />)
110
-
111
- expect(
112
- screen.queryByText("05/01/2022 is not available, try another date")
113
- ).not.toBeInTheDocument()
115
+ renderWithIntl(
116
+ <DatePickerWrapper disabledDates={[new Date("2022-05-01")]} />
117
+ )
114
118
 
115
119
  const input = screen.getByLabelText("Input label", { selector: "input" })
116
120
  await user.click(input)
@@ -135,7 +139,7 @@ describe("<DatePicker />", () => {
135
139
  describe("<DatePicker /> - Focus element", () => {
136
140
  describe("Click on input", () => {
137
141
  beforeEach(async () => {
138
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
142
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
139
143
 
140
144
  const input = screen.getByLabelText("Input label", { selector: "input" })
141
145
  await user.click(input)
@@ -176,11 +180,9 @@ describe("<DatePicker /> - Focus element", () => {
176
180
  })
177
181
 
178
182
  describe("Keydown arrow on input", () => {
179
- beforeEach(async () => {
180
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
181
- })
182
-
183
183
  it("shows focus within the calendar", async () => {
184
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
185
+
184
186
  const input = screen.getByLabelText("Input label", { selector: "input" })
185
187
  await user.tab()
186
188
  await waitFor(() => {
@@ -198,6 +200,8 @@ describe("<DatePicker /> - Focus element", () => {
198
200
  })
199
201
 
200
202
  it("returns focus to the input when the user escapes from the calendar", async () => {
203
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
204
+
201
205
  const input = screen.getByLabelText("Input label", { selector: "input" })
202
206
  await user.tab()
203
207
  await waitFor(() => {
@@ -218,7 +222,7 @@ describe("<DatePicker /> - Focus element", () => {
218
222
 
219
223
  describe("Click on calendar button", () => {
220
224
  beforeEach(async () => {
221
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
225
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
222
226
 
223
227
  const calendarButton = screen.getByRole("button", {
224
228
  name: "Change date, Mar 1, 2022",
@@ -254,7 +258,7 @@ describe("<DatePicker /> - Focus element", () => {
254
258
  let calendarButton: HTMLElement
255
259
 
256
260
  beforeEach(async () => {
257
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
261
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
258
262
 
259
263
  calendarButton = screen.getByRole("button", {
260
264
  name: "Change date, Mar 1, 2022",
@@ -301,7 +305,7 @@ describe("<DatePicker /> - Focus element", () => {
301
305
 
302
306
  describe("<DatePicker /> - Input format", () => {
303
307
  it("formats values when focus is on the input", async () => {
304
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
308
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
305
309
 
306
310
  const input = screen.getByLabelText("Input label", { selector: "input" })
307
311
  expect(input).toHaveValue("Mar 1, 2022")
@@ -314,7 +318,7 @@ describe("<DatePicker /> - Input format", () => {
314
318
  })
315
319
 
316
320
  it("formats values when the input loses focus - onBlur", async () => {
317
- render(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
321
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("2022-03-01")} />)
318
322
 
319
323
  const input = screen.getByLabelText("Input label", { selector: "input" })
320
324
  expect(input).toHaveValue("Mar 1, 2022")
@@ -335,75 +339,96 @@ describe("<DatePicker /> - Input format", () => {
335
339
 
336
340
  describe("<DatePicker /> - Validation", () => {
337
341
  describe("Custom Validation", () => {
338
- it("displays custom validation message when provided (overrides inbuilt validation)", () => {
339
- render(
342
+ it("displays custom validation message when provided (overrides inbuilt validation)", async () => {
343
+ renderWithIntl(
340
344
  <DatePickerWrapper
341
345
  status="error"
342
346
  validationMessage="Custom validation message"
343
347
  selectedDay={new Date("potato")}
344
348
  />
345
349
  )
346
- const icon = screen.getByLabelText("error message")
347
350
 
348
- expect(icon).toBeInTheDocument()
351
+ await waitFor(() => {
352
+ const icon = screen.getByLabelText("error message")
353
+ expect(icon).toBeInTheDocument()
354
+ })
355
+
349
356
  expect(screen.getByText("Custom validation message")).toBeVisible()
350
357
  expect(screen.queryByText("Date is invalid")).not.toBeInTheDocument()
351
358
  })
352
359
 
353
- it("does not show inbuilt validation message when onValidate is set", () => {
354
- const onValidate = jest.fn<void, [ValidationResponse]>()
355
- render(<DatePickerWrapper onValidate={onValidate} />)
360
+ it("does not show inbuilt validation message when onValidate is set", async () => {
361
+ const onValidate = jest.fn()
362
+ renderWithIntl(
363
+ <DatePickerWrapper
364
+ selectedDay={new Date("potato")}
365
+ onValidate={onValidate}
366
+ />
367
+ )
368
+
369
+ await waitFor(() => {
370
+ expect(
371
+ screen.getByLabelText("Input label", { selector: "input" })
372
+ ).toBeVisible()
373
+ })
374
+
356
375
  expect(screen.queryByTitle("error message")).not.toBeInTheDocument()
357
- expect(
358
- screen.queryByText("Custom validation message")
359
- ).not.toBeInTheDocument()
376
+ expect(screen.queryByText("Date is invalid")).not.toBeInTheDocument()
360
377
  })
361
378
 
362
- it("triggers validation when initial selected date is invalid", () => {
363
- const onValidate = jest.fn<void, [ValidationResponse]>()
364
- render(
379
+ it("triggers validation when initial selected date is invalid", async () => {
380
+ const onValidate = jest.fn()
381
+ renderWithIntl(
365
382
  <DatePickerWrapper
366
383
  onValidate={onValidate}
367
384
  selectedDay={new Date("potato")}
368
385
  />
369
386
  )
370
- expect(onValidate).toBeCalledTimes(1)
387
+ await waitFor(() => {
388
+ expect(onValidate).toHaveBeenCalledTimes(1)
389
+ })
371
390
  })
372
391
 
373
- it("triggers validation when initial selected date is disabled", () => {
374
- const onValidate = jest.fn<void, [ValidationResponse]>()
375
- render(
392
+ it("triggers validation when initial selected date is disabled", async () => {
393
+ const onValidate = jest.fn()
394
+ renderWithIntl(
376
395
  <DatePickerWrapper
377
396
  onValidate={onValidate}
378
397
  disabledBefore={new Date("2022-05-15")}
379
398
  selectedDay={new Date("2022-05-05")}
380
399
  />
381
400
  )
382
- expect(onValidate).toBeCalledTimes(1)
401
+ await waitFor(() => {
402
+ expect(onValidate).toHaveBeenCalledTimes(1)
403
+ })
383
404
  })
384
405
 
385
- it("does not trigger validation when initial selected date is empty", () => {
386
- const onValidate = jest.fn<void, [ValidationResponse]>()
387
- render(
406
+ it("does not trigger validation when initial selected date is empty", async () => {
407
+ const onValidate = jest.fn()
408
+ renderWithIntl(
388
409
  <DatePickerWrapper onValidate={onValidate} selectedDay={undefined} />
389
410
  )
390
- expect(onValidate).toBeCalledTimes(0)
411
+ await waitFor(() => {
412
+ expect(onValidate).not.toHaveBeenCalled()
413
+ })
391
414
  })
392
415
 
393
- it("does not trigger validation when initial selected date is valid", () => {
394
- const onValidate = jest.fn<void, [ValidationResponse]>()
395
- render(
416
+ it("does not trigger validation when initial selected date is valid", async () => {
417
+ const onValidate = jest.fn()
418
+ renderWithIntl(
396
419
  <DatePickerWrapper
397
420
  onValidate={onValidate}
398
421
  selectedDay={new Date("2022-05-05")}
399
422
  />
400
423
  )
401
- expect(onValidate).toBeCalledTimes(0)
424
+ await waitFor(() => {
425
+ expect(onValidate).not.toHaveBeenCalled()
426
+ })
402
427
  })
403
428
 
404
429
  it("triggers validation when selected date is updated to invalid", async () => {
405
- const onValidate = jest.fn<void, [ValidationResponse]>()
406
- render(
430
+ const onValidate = jest.fn()
431
+ renderWithIntl(
407
432
  <DatePickerWrapper
408
433
  onValidate={onValidate}
409
434
  defaultMonth={new Date("2022-03-01")}
@@ -419,35 +444,39 @@ describe("<DatePicker /> - Validation", () => {
419
444
  const dateToSelect = within(month).getByRole("gridcell", { name: "6" })
420
445
  await user.click(dateToSelect)
421
446
  await waitFor(() => {
422
- expect(onValidate).toBeCalledTimes(1)
447
+ expect(onValidate).toHaveBeenCalledTimes(1)
423
448
  })
424
449
  })
425
450
  })
426
451
 
427
452
  describe("Inbuilt Validation", () => {
428
- it("displays error message when selected day is invalid", () => {
429
- render(<DatePickerWrapper selectedDay={new Date("potato")} />)
430
- const icon = screen.getByLabelText("error message")
453
+ it("displays error message when selected day is invalid", async () => {
454
+ renderWithIntl(<DatePickerWrapper selectedDay={new Date("potato")} />)
431
455
 
432
- expect(screen.getByText("Date is invalid")).toBeVisible()
433
- expect(icon).toBeInTheDocument()
456
+ await waitFor(() => {
457
+ const icon = screen.getByLabelText("error message")
458
+ expect(screen.getByText("Date is invalid")).toBeVisible()
459
+ expect(icon).toBeInTheDocument()
460
+ })
434
461
  })
435
462
 
436
- it("displays error message when selected day is disabled", () => {
437
- render(
463
+ it("displays error message when selected day is disabled", async () => {
464
+ renderWithIntl(
438
465
  <DatePickerWrapper
439
466
  disabledBefore={new Date("2022-05-15")}
440
467
  selectedDay={new Date("2022-05-05")}
441
468
  />
442
469
  )
443
470
 
444
- expect(
445
- screen.getByText("05/05/2022 is not available, try another date")
446
- ).toBeVisible()
471
+ await waitFor(() => {
472
+ expect(
473
+ screen.getByText("05/05/2022 is not available, try another date")
474
+ ).toBeVisible()
475
+ })
447
476
  })
448
477
 
449
478
  it("displays error message when input date is invalid", async () => {
450
- render(<DatePickerWrapper />)
479
+ renderWithIntl(<DatePickerWrapper />)
451
480
 
452
481
  const input = screen.getByLabelText("Input label", { selector: "input" })
453
482
  await user.type(input, "05/05/2022Blah")
@@ -462,7 +491,9 @@ describe("<DatePicker /> - Validation", () => {
462
491
  })
463
492
 
464
493
  it("displays error message when input date is disabled", async () => {
465
- render(<DatePickerWrapper disabledBefore={new Date("2022-05-15")} />)
494
+ renderWithIntl(
495
+ <DatePickerWrapper disabledBefore={new Date("2022-05-15")} />
496
+ )
466
497
 
467
498
  const input = screen.getByLabelText("Input label", { selector: "input" })
468
499
  await user.type(input, "05/05/2022")
@@ -1,4 +1,5 @@
1
1
  import React, { RefObject, useEffect, useId, useRef, useState } from "react"
2
+ import { useIntl } from "@cultureamp/i18n-react-intl"
2
3
  import { DayClickEventHandler } from "react-day-picker"
3
4
  import { FocusOn } from "react-focus-on"
4
5
  import {
@@ -21,7 +22,7 @@ import {
21
22
  DateInputField,
22
23
  DateInputFieldProps,
23
24
  } from "./subcomponents/DateInputField"
24
- import { ValidationResponse } from "./types"
25
+ import type { ValidationResponse } from "./types"
25
26
  import { DatePickerSupportedLocales, getLocale } from "./utils/getLocale"
26
27
  import { validateDate } from "./utils/validateDate"
27
28
 
@@ -105,6 +106,14 @@ export const DatePicker = ({
105
106
  onValidate,
106
107
  ...restDateInputFieldProps
107
108
  }: DatePickerProps): JSX.Element => {
109
+ const { formatMessage } = useIntl()
110
+
111
+ const calendarLabelDesc = formatMessage({
112
+ id: "datePicker.calendarLabelDescription",
113
+ defaultMessage: "Select date from calendar for:",
114
+ description: "Label for the search input",
115
+ })
116
+
108
117
  const reactId = useId()
109
118
  const id = propsId ?? reactId
110
119
 
@@ -123,9 +132,8 @@ export const DatePicker = ({
123
132
  const [inbuiltStatus, setInbuiltStatus] = useState<
124
133
  DateInputFieldProps["status"] | undefined
125
134
  >()
126
- const [inbuiltValidationMessage, setInbuiltValidationMessage] = useState<
127
- string | undefined
128
- >()
135
+ const [inbuiltValidationMessage, setInbuiltValidationMessage] =
136
+ useState<ValidationResponse["validationMessage"]>()
129
137
 
130
138
  const shouldUseInbuiltValidation = onValidate === undefined
131
139
 
@@ -312,7 +320,7 @@ export const DatePicker = ({
312
320
  >
313
321
  <>
314
322
  <VisuallyHidden id={`${id}-calendar-label`}>
315
- Select date from calendar for:
323
+ {calendarLabelDesc}
316
324
  </VisuallyHidden>
317
325
  <CalendarSingle
318
326
  id={calendarId}
@@ -10,7 +10,7 @@ import * as DatePickerStories from "./DatePicker.stories"
10
10
  sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/DatePicker"
11
11
  figma="https://www.figma.com/file/eZKEE5kXbEMY3lx84oz8iN/%F0%9F%92%9C-UI-Kit%3A-Heart?type=design&node-id=10458%3A45652&mode=design&t=4Mycc044XjC1WLin-1"
12
12
  designGuidelines="https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3082061174/Date+Picker"
13
- className="!mb-8"
13
+
14
14
  />
15
15
 
16
16
  <KAIOInstallation exportNames="DatePicker" />
@@ -1,5 +1,7 @@
1
1
  import React, { useState } from "react"
2
+ import { StaticIntlProvider } from "@cultureamp/i18n-react-intl"
2
3
  import { Meta } from "@storybook/react"
4
+ import { expect, userEvent, within } from "@storybook/test"
3
5
  import { Text } from "~components/Text"
4
6
  import {
5
7
  StickerSheet,
@@ -134,27 +136,6 @@ const StickerSheetTemplate: StickerSheetStory = {
134
136
  </StickerSheet.Row>
135
137
  </StickerSheet.Body>
136
138
  </StickerSheet>
137
-
138
- <StickerSheet isReversed={isReversed} heading="Localisation">
139
- <StickerSheet.Header headings={["en-AU", "en-US"]} />
140
- <StickerSheet.Body>
141
- <StickerSheet.Row>
142
- <DatePicker
143
- labelText="Label"
144
- selectedDay={new Date("2022, 1, 5")}
145
- onDayChange={() => undefined}
146
- isReversed={isReversed}
147
- />
148
- <DatePicker
149
- labelText="Label"
150
- selectedDay={new Date("2022, 1, 5")}
151
- onDayChange={() => undefined}
152
- isReversed={isReversed}
153
- locale="en-US"
154
- />
155
- </StickerSheet.Row>
156
- </StickerSheet.Body>
157
- </StickerSheet>
158
139
  </>
159
140
  )
160
141
  },
@@ -199,3 +180,58 @@ export const StickerSheetRTL: StickerSheetStory = {
199
180
  textDirection: "rtl",
200
181
  },
201
182
  }
183
+
184
+ export const StickerSheetLocales: StickerSheetStory = {
185
+ name: "Sticker Sheet (Locales)",
186
+ render: () => (
187
+ <>
188
+ <StickerSheet heading="Localisation">
189
+ <StickerSheet.Header headings={["en-AU", "en-US"]} />
190
+ <StickerSheet.Body>
191
+ <StickerSheet.Row>
192
+ <DatePicker
193
+ labelText="Label"
194
+ selectedDay={new Date("2022, 1, 5")}
195
+ onDayChange={() => undefined}
196
+ />
197
+ <DatePicker
198
+ labelText="Label"
199
+ selectedDay={new Date("2022, 1, 5")}
200
+ onDayChange={() => undefined}
201
+ locale="en-US"
202
+ />
203
+ </StickerSheet.Row>
204
+ </StickerSheet.Body>
205
+ </StickerSheet>
206
+
207
+ <StickerSheet>
208
+ <StickerSheet.Header headings={["fr-CA"]} />
209
+ <StickerSheet.Body>
210
+ <StickerSheet.Row>
211
+ <StaticIntlProvider locale="fr-CA">
212
+ <DatePicker
213
+ labelText="Label"
214
+ selectedDay={new Date("2022, 1, 5")}
215
+ onDayChange={() => undefined}
216
+ locale="fr-CA"
217
+ data-testid="id--dp-fr-ca"
218
+ />
219
+ </StaticIntlProvider>
220
+ </StickerSheet.Row>
221
+ </StickerSheet.Body>
222
+ </StickerSheet>
223
+ </>
224
+ ),
225
+ decorators: [
226
+ Story => (
227
+ <div className="mb-[400px]">
228
+ <Story />
229
+ </div>
230
+ ),
231
+ ],
232
+ play: async ({ canvasElement }) => {
233
+ const canvas = within(canvasElement)
234
+ await userEvent.click(canvas.getByTestId("id--dp-fr-ca"))
235
+ await expect(canvas.getByText("janvier 2022")).toBeInTheDocument()
236
+ },
237
+ }
@@ -143,9 +143,8 @@ export const Validation: Story = {
143
143
  )
144
144
  const [status, setStatus] = useState<FieldMessageStatus | undefined>()
145
145
  const [response, setResponse] = useState<ValidationResponse | undefined>()
146
- const [validationMessage, setValidationMessage] = useState<
147
- string | undefined
148
- >()
146
+ const [validationMessage, setValidationMessage] =
147
+ useState<ValidationResponse["validationMessage"]>()
149
148
 
150
149
  const handleValidation = (validationResponse: ValidationResponse): void => {
151
150
  setResponse(validationResponse)
@@ -1,6 +1,6 @@
1
1
  import { ArgTypes } from "@storybook/react"
2
2
 
3
- const DATE_PICKER_SUPPORTED_LOCALES = ["en-US", "en-AU"]
3
+ const DATE_PICKER_SUPPORTED_LOCALES = ["en-US", "en-AU", "fr-CA"]
4
4
 
5
5
  export const datePickerLocaleControls: Partial<ArgTypes> = {
6
6
  locale: {