@kaizen/components 1.52.1 → 1.54.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 (228) hide show
  1. package/dist/cjs/Calendar/CalendarRange/CalendarRange.cjs +0 -2
  2. package/dist/cjs/Calendar/CalendarSingle/CalendarSingle.cjs +3 -5
  3. package/dist/cjs/DatePicker/DatePicker.cjs +8 -1
  4. package/dist/cjs/DatePicker/utils/getLocale.cjs +96 -3
  5. package/dist/cjs/DatePicker/utils/validateDate.cjs +28 -2
  6. package/dist/cjs/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.cjs +8 -1
  7. package/dist/cjs/Filter/FilterBar/subcomponents/ClearAllButton/ClearAllButton.cjs +14 -2
  8. package/dist/cjs/Filter/FilterBar/subcomponents/FilterBarDatePicker/FilterBarDatePicker.cjs +1 -0
  9. package/dist/cjs/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs +10 -1
  10. package/dist/cjs/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.cjs +8 -1
  11. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.cjs +5 -1
  12. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useEndDateValidation.cjs +1 -0
  13. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useStartDateValidation.cjs +1 -0
  14. package/dist/cjs/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/validateEndDateBeforeStartDate.cjs +16 -1
  15. package/dist/esm/Calendar/CalendarRange/CalendarRange.mjs +0 -2
  16. package/dist/esm/Calendar/CalendarSingle/CalendarSingle.mjs +3 -5
  17. package/dist/esm/DatePicker/DatePicker.mjs +8 -1
  18. package/dist/esm/DatePicker/utils/getLocale.mjs +97 -4
  19. package/dist/esm/DatePicker/utils/validateDate.mjs +22 -2
  20. package/dist/esm/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.mjs +8 -1
  21. package/dist/esm/Filter/FilterBar/subcomponents/ClearAllButton/ClearAllButton.mjs +14 -2
  22. package/dist/esm/Filter/FilterBar/subcomponents/FilterBarDatePicker/FilterBarDatePicker.mjs +1 -0
  23. package/dist/esm/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs +10 -1
  24. package/dist/esm/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.mjs +8 -1
  25. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.mjs +5 -1
  26. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useEndDateValidation.mjs +1 -0
  27. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/useStartDateValidation.mjs +1 -0
  28. package/dist/esm/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/validateEndDateBeforeStartDate.mjs +10 -1
  29. package/dist/styles.css +2 -2
  30. package/dist/types/AvatarGroup/_docs/example-data.d.ts +8 -0
  31. package/dist/types/BrandMoment/_docs/ExampleHeaders.d.ts +3 -0
  32. package/dist/types/Calendar/_docs/controls/defaultMonthControls.d.ts +2 -0
  33. package/dist/types/Calendar/_docs/controls/weekStartsOnControls.d.ts +2 -0
  34. package/dist/types/Container/Container.d.ts +1 -1
  35. package/dist/types/Content/Content.d.ts +1 -1
  36. package/dist/types/DateInput/DateInput/DateInput.d.ts +1 -1
  37. package/dist/types/DatePicker/DatePicker.d.ts +3 -3
  38. package/dist/types/DatePicker/_docs/controls/datePickerLocaleControls.d.ts +2 -0
  39. package/dist/types/DatePicker/_docs/controls/disabledDayMatchersControls.d.ts +2 -0
  40. package/dist/types/DatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
  41. package/dist/types/DatePicker/types.d.ts +2 -1
  42. package/dist/types/DatePicker/utils/getLocale.d.ts +1 -2
  43. package/dist/types/DateRangePicker/DateRangePicker.d.ts +2 -2
  44. package/dist/types/Filter/FilterBar/context/types.d.ts +28 -0
  45. package/dist/types/Filter/FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.d.ts +1 -1
  46. package/dist/types/Filter/FilterDatePicker/_docs/controls/disabledDaysControls.d.ts +2 -0
  47. package/dist/types/Filter/FilterDatePicker/_docs/controls/validationControls.d.ts +2 -0
  48. package/dist/types/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
  49. package/dist/types/Filter/FilterDateRangePicker/_docs/controls/disabledDaysControls.d.ts +2 -0
  50. package/dist/types/Filter/FilterDateRangePicker/_docs/controls/validationControls.d.ts +2 -0
  51. package/dist/types/Filter/FilterMultiSelect/_docs/MockData.d.ts +10 -0
  52. package/dist/types/Filter/FilterSelect/_docs/mockData.d.ts +6 -0
  53. package/dist/types/Filter/_docs/controls/renderTriggerControls.d.ts +2 -0
  54. package/dist/types/Menu/_docs/MenuContentExample.d.ts +8 -0
  55. package/dist/types/Menu/_docs/examples.d.ts +11 -0
  56. package/dist/types/Modal/_docs/controls.d.ts +11 -0
  57. package/dist/types/MultiSelect/MultiSelect.d.ts +23 -0
  58. package/dist/types/MultiSelect/subcomponents/MultiSelectOptions/MultiSelectOptions.d.ts +13 -0
  59. package/dist/types/Select/Select.d.ts +3 -3
  60. package/dist/types/Workflow/_docs/controls/controls.d.ts +2 -0
  61. package/dist/types/Workflow/_docs/controls/index.d.ts +1 -0
  62. package/dist/types/__future__/Select/Select.d.ts +2 -2
  63. package/dist/types/__future__/Select/_docs/mockData.d.ts +6 -0
  64. package/dist/types/__future__/Select/subcomponents/SelectToggle/SelectToggle.d.ts +2 -2
  65. package/dist/types/__future__/Select/types.d.ts +22 -0
  66. package/dist/types/__future__/Workflow/_docs/controls/controls.d.ts +2 -0
  67. package/dist/types/__future__/Workflow/_docs/controls/index.d.ts +1 -0
  68. package/dist/types/__overlays__/Tooltip/v1/utils/isSemanticElement.d.ts +2 -2
  69. package/dist/types/utils/getNodeText.d.ts +2 -1
  70. package/locales/en.json +40 -0
  71. package/package.json +3 -3
  72. package/src/Avatar/_docs/Avatar.mdx +1 -1
  73. package/src/AvatarGroup/_docs/AvatarGroup.mdx +1 -1
  74. package/src/Badge/_docs/Badge.mdx +1 -1
  75. package/src/Brand/_docs/Brand.mdx +1 -1
  76. package/src/BrandMoment/_docs/BrandMoment.mdx +1 -1
  77. package/src/Button/Button/_docs/Button.mdx +1 -1
  78. package/src/Button/IconButton/_docs/IconButton.mdx +1 -1
  79. package/src/ButtonGroup/_docs/ButtonGroup.mdx +1 -1
  80. package/src/Calendar/CalendarRange/CalendarRange.tsx +0 -2
  81. package/src/Calendar/CalendarRange/_docs/CalendarRange.mdx +1 -1
  82. package/src/Calendar/CalendarSingle/CalendarSingle.tsx +1 -2
  83. package/src/Calendar/CalendarSingle/_docs/CalendarSingle.mdx +1 -1
  84. package/src/Card/_docs/Card.mdx +1 -1
  85. package/src/Checkbox/Checkbox/_docs/Checkbox.mdx +1 -1
  86. package/src/Checkbox/CheckboxField/_docs/CheckboxField.mdx +1 -1
  87. package/src/Checkbox/CheckboxGroup/_docs/CheckboxGroup.mdx +1 -1
  88. package/src/Collapsible/Collapsible/_docs/Collapsible.mdx +1 -1
  89. package/src/Collapsible/CollapsibleGroup/_docs/CollapsibleGroup.mdx +1 -1
  90. package/src/Collapsible/ExpertAdviceCollapsible/_docs/ExpertAdviceCollapsible.mdx +1 -1
  91. package/src/Container/_docs/Container.mdx +1 -1
  92. package/src/Content/_docs/Content.mdx +1 -1
  93. package/src/DateInput/DateInputDescription/DateInputDescription.spec.tsx +26 -18
  94. package/src/DatePicker/DatePicker.spec.tsx +100 -69
  95. package/src/DatePicker/DatePicker.tsx +15 -7
  96. package/src/DatePicker/_docs/DatePicker.mdx +1 -3
  97. package/src/DatePicker/_docs/DatePicker.stickersheet.stories.tsx +57 -21
  98. package/src/DatePicker/_docs/DatePicker.stories.tsx +2 -3
  99. package/src/DatePicker/_docs/controls/datePickerLocaleControls.ts +8 -2
  100. package/src/DatePicker/_docs/getLocale.stickersheet.stories.tsx +49 -0
  101. package/src/DatePicker/subcomponents/DateInputField/DateInputField.spec.tsx +49 -36
  102. package/src/DatePicker/types.ts +2 -1
  103. package/src/DatePicker/utils/getLocale.spec.ts +2 -2
  104. package/src/DatePicker/utils/getLocale.ts +141 -6
  105. package/src/DatePicker/utils/validateDate.spec.ts +40 -16
  106. package/src/DatePicker/utils/{validateDate.ts → validateDate.tsx} +24 -4
  107. package/src/DateRangePicker/DateRangePicker.tsx +2 -2
  108. package/src/DateRangePicker/_docs/DateRangePicker.mdx +1 -1
  109. package/src/Divider/_docs/Divider.mdx +1 -1
  110. package/src/EmptyState/_docs/EmptyState.mdx +1 -1
  111. package/src/ErrorPage/_docs/ErrorPage.mdx +1 -1
  112. package/src/FieldGroup/_docs/FieldGroup.mdx +1 -1
  113. package/src/FieldMessage/_docs/FieldMessage.mdx +1 -1
  114. package/src/Filter/Filter/_docs/Filter.mdx +1 -1
  115. package/src/Filter/FilterBar/FilterBar.spec.tsx +56 -25
  116. package/src/Filter/FilterBar/_docs/FilterBar.mdx +1 -1
  117. package/src/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.spec.tsx +21 -13
  118. package/src/Filter/FilterBar/subcomponents/AddFiltersMenu/AddFiltersMenu.tsx +11 -1
  119. package/src/Filter/FilterBar/subcomponents/ClearAllButton/ClearAllButton.tsx +17 -2
  120. package/src/Filter/FilterBar/subcomponents/FilterBarButton/FilterBarButton.spec.tsx +17 -8
  121. package/src/Filter/FilterBar/subcomponents/FilterBarDatePicker/FilterBarDatePicker.spec.tsx +37 -23
  122. package/src/Filter/FilterBar/subcomponents/FilterBarDateRangePicker/FilterBarDateRangePicker.spec.tsx +35 -23
  123. package/src/Filter/FilterBar/subcomponents/FilterBarMultiSelect/FilterBarMultiSelect.spec.tsx +42 -26
  124. package/src/Filter/FilterBar/subcomponents/FilterBarSelect/FilterBarSelect.spec.tsx +37 -24
  125. package/src/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.spec.tsx +12 -12
  126. package/src/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.tsx +15 -2
  127. package/src/Filter/FilterButton/_docs/filter-buttons.mdx +1 -1
  128. package/src/Filter/FilterDatePicker/FilterDatePicker.spec.tsx +21 -16
  129. package/src/Filter/FilterDatePicker/_docs/FilterDatePicker.mdx +1 -1
  130. package/src/Filter/FilterDatePicker/_docs/FilterDatePicker.stickersheet.stories.tsx +56 -1
  131. package/src/Filter/FilterDatePicker/hooks/useDateInputHandlers.spec.ts +3 -3
  132. package/src/Filter/FilterDatePicker/hooks/{useDateValidation.spec.tsx → useDateValidation.spec.ts} +13 -12
  133. package/src/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.tsx +10 -1
  134. package/src/Filter/FilterDatePicker/subcomponents/FilterDatePickerField/FilterDatePickerField.spec.tsx +57 -36
  135. package/src/Filter/FilterDatePicker/utils/validateDate.spec.ts +52 -28
  136. package/src/Filter/FilterDateRangePicker/FilterDateRangePicker.spec.tsx +3 -2
  137. package/src/Filter/FilterDateRangePicker/_docs/FilterDateRangePicker.mdx +1 -1
  138. package/src/Filter/FilterDateRangePicker/_docs/FilterDateRangePicker.stickersheet.stories.tsx +55 -24
  139. package/src/Filter/FilterDateRangePicker/subcomponents/DateRangeInputField/DateRangeInputField.spec.tsx +43 -28
  140. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.spec.tsx +82 -48
  141. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/FilterDateRangePickerField.tsx +6 -1
  142. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/{useEndDateValidation.spec.tsx → useEndDateValidation.spec.ts} +23 -20
  143. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/hooks/{useStartDateValidation.spec.tsx → useStartDateValidation.spec.ts} +13 -11
  144. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/validateEndDateBeforeStartDate.spec.ts +17 -6
  145. package/src/Filter/FilterDateRangePicker/subcomponents/FilterDateRangePickerField/utils/{validateEndDateBeforeStartDate.ts → validateEndDateBeforeStartDate.tsx} +9 -3
  146. package/src/Filter/FilterMultiSelect/FilterMultiSelect.spec.tsx +10 -14
  147. package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelect.mdx +1 -1
  148. package/src/Filter/FilterMultiSelect/context/SelectionProvider/SelectionProvider.spec.tsx +392 -372
  149. package/src/Filter/FilterMultiSelect/subcomponents/SearchInput/SearchInput.spec.tsx +9 -6
  150. package/src/Filter/FilterSelect/_docs/FilterSelect.mdx +1 -1
  151. package/src/GuidanceBlock/_docs/GuidanceBlock.mdx +1 -1
  152. package/src/Heading/_docs/Heading.mdx +1 -1
  153. package/src/Icon/_docs/Icon.mdx +1 -1
  154. package/src/Illustration/Scene/BrandMomentCaptureIntro/_docs/BrandMomentCaptureIntro.mdx +1 -1
  155. package/src/Illustration/Scene/_docs/Scene.mdx +1 -1
  156. package/src/Illustration/Spot/_docs/Spot.mdx +1 -1
  157. package/src/Input/Input/_docs/Input.mdx +1 -1
  158. package/src/Input/InputRange/_docs/InputRange.mdx +1 -1
  159. package/src/Input/InputSearch/InputSearch.spec.tsx +15 -14
  160. package/src/Input/InputSearch/_docs/InputSearch.mdx +1 -1
  161. package/src/Label/_docs/Label.mdx +1 -1
  162. package/src/LabelledMessage/_docs/LabelledMessage.mdx +1 -1
  163. package/src/LikertScaleLegacy/_docs/LikertScaleLegacy.mdx +1 -1
  164. package/src/Loading/LoadingGraphic/_docs/LoadingGraphic.mdx +1 -1
  165. package/src/Loading/LoadingHeading/_docs/LoadingHeading.mdx +1 -1
  166. package/src/Loading/LoadingInput/_docs/LoadingInput.mdx +1 -1
  167. package/src/Loading/LoadingParagraph/_docs/LoadingParagraph.mdx +1 -1
  168. package/src/Loading/LoadingSpinner/_docs/LoadingSpinner.mdx +1 -1
  169. package/src/Menu/_docs/Menu.mdx +1 -1
  170. package/src/Modal/ConfirmationModal/_docs/ConfirmationModal.mdx +1 -1
  171. package/src/Modal/ContextModal/_docs/ContextModal.mdx +1 -1
  172. package/src/Modal/GenericModal/_docs/GenericModal.mdx +1 -1
  173. package/src/Modal/InputEditModal/_docs/InputEditModal.mdx +1 -1
  174. package/src/MultiSelect/_docs/MultiSelect.mdx +1 -1
  175. package/src/Notification/GlobalNotification/_docs/GlobalNotification.mdx +1 -1
  176. package/src/Notification/InlineNotification/_docs/InlineNotification.mdx +1 -1
  177. package/src/Notification/ToastNotification/_docs/ToastNotification.mdx +1 -1
  178. package/src/Pagination/_docs/Pagination.mdx +1 -1
  179. package/src/Pagination/subcomponents/DirectionalLink/_docs/DirectionalLink.mdx +1 -1
  180. package/src/Pagination/subcomponents/PaginationLink/_docs/PaginationLink.mdx +1 -1
  181. package/src/Popover/_docs/Popover.mdx +1 -1
  182. package/src/ProgressBar/_docs/ProgressBar.mdx +1 -1
  183. package/src/Radio/Radio/_docs/Radio.mdx +1 -1
  184. package/src/Radio/RadioField/_docs/RadioField.mdx +1 -1
  185. package/src/Radio/RadioGroup/_docs/RadioGroup.mdx +1 -1
  186. package/src/RichTextEditor/EditableRichTextContent/_docs/EditableRichTextContent.mdx +1 -1
  187. package/src/RichTextEditor/RichTextContent/_docs/RichTextContent.mdx +1 -1
  188. package/src/RichTextEditor/RichTextEditor/_docs/RichTextEditor.mdx +1 -1
  189. package/src/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/_docs/ToggleIconButton.mdx +1 -1
  190. package/src/RichTextEditor/RichTextEditor/subcomponents/Toolbar/_docs/Toolbar.mdx +1 -1
  191. package/src/SearchField/_docs/SearchField.mdx +1 -1
  192. package/src/Select/_docs/Select.mdx +1 -1
  193. package/src/Skirt/_docs/Skirt.mdx +1 -1
  194. package/src/Slider/_docs/Slider.mdx +1 -1
  195. package/src/SplitButton/SplitButton.spec.tsx +11 -6
  196. package/src/SplitButton/_docs/SplitButton.mdx +1 -1
  197. package/src/SplitButton/subcomponents/DropdownButton/DropdownButton.spec.tsx +15 -10
  198. package/src/Table/_docs/Table.mdx +1 -1
  199. package/src/Tabs/_docs/Tabs.mdx +1 -1
  200. package/src/Tag/_docs/Tag.mdx +1 -1
  201. package/src/Text/_docs/Text.mdx +1 -1
  202. package/src/TextArea/_docs/TextArea.mdx +1 -1
  203. package/src/TextAreaField/_docs/TextAreaField.mdx +1 -1
  204. package/src/TextField/_docs/TextField.mdx +1 -1
  205. package/src/Tile/InformationTile/_docs/InformationTile.mdx +1 -1
  206. package/src/Tile/MultiActionTile/_docs/MultiActionTile.mdx +1 -1
  207. package/src/Tile/TileGrid/_docs/TileGrid.mdx +1 -1
  208. package/src/TimeField/_docs/TimeField.mdx +1 -1
  209. package/src/TitleBlockZen/_docs/TitleBlockZen.mdx +1 -1
  210. package/src/ToggleSwitch/ToggleSwitch/_docs/ToggleSwitch.mdx +1 -1
  211. package/src/ToggleSwitch/ToggleSwitchField/_docs/ToggleSwitchField.mdx +1 -1
  212. package/src/VisuallyHidden/_docs/VisuallyHidden.mdx +1 -1
  213. package/src/Well/_docs/Well.mdx +1 -1
  214. package/src/Workflow/_docs/ProgressStepper.mdx +1 -1
  215. package/src/Workflow/_docs/Workflow.mdx +1 -1
  216. package/src/Workflow/_docs/WorkflowFooter.mdx +1 -1
  217. package/src/Workflow/_docs/WorkflowHeader.mdx +1 -1
  218. package/src/__future__/Select/_docs/Select.mdx +1 -1
  219. package/src/__future__/Tag/Tag/_docs/Tag.mdx +1 -1
  220. package/src/__future__/Workflow/_docs/ProgressStepper.mdx +1 -1
  221. package/src/__future__/Workflow/_docs/Workflow.mdx +1 -1
  222. package/src/__future__/Workflow/_docs/WorkflowFooter.mdx +1 -1
  223. package/src/__future__/Workflow/_docs/WorkflowHeader.mdx +1 -1
  224. package/src/__overlays__/Tooltip/v1/_docs/Tooltip.mdx +1 -1
  225. package/src/__overlays__/Tooltip/v3/_docs/ApiSpecification.mdx +0 -1
  226. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.docs.stories.tsx +52 -0
  227. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.mdx +40 -61
  228. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_spec.png +0 -0
@@ -1,6 +1,7 @@
1
- import React, { act } from "react"
1
+ import { act } from "react"
2
+ import { waitFor } from "@testing-library/react"
2
3
  import { renderHook } from "@testing-library/react-hooks"
3
- import { LabelledMessage } from "~components/LabelledMessage"
4
+ import { renderWithIntl } from "~tests"
4
5
  import { useDateValidation } from "./useDateValidation"
5
6
 
6
7
  describe("useDateValidation()", () => {
@@ -23,11 +24,9 @@ describe("useDateValidation()", () => {
23
24
  })
24
25
 
25
26
  describe("with an invalid date", () => {
26
- it("returns a validation message and no date", () => {
27
+ it("returns a validation message and no date", async () => {
27
28
  const { result } = renderHook(() =>
28
- useDateValidation({
29
- inputLabel: "Date",
30
- })
29
+ useDateValidation({ inputLabel: "Date" })
31
30
  )
32
31
  const { validateDate, updateValidation } = result.current
33
32
  const { validationResponse, newDate } = validateDate({
@@ -38,14 +37,16 @@ describe("useDateValidation()", () => {
38
37
  act(() => {
39
38
  updateValidation(validationResponse)
40
39
  })
40
+ expect(newDate).toEqual(undefined)
41
41
 
42
- expect(result.current.validationMessage).toStrictEqual({
43
- status: "error",
44
- message: (
45
- <LabelledMessage label="Date" message="potato is an invalid date" />
46
- ),
42
+ expect(result.current.validationMessage?.status).toBe("error")
43
+
44
+ const { container } = renderWithIntl(
45
+ result.current.validationMessage?.message
46
+ )
47
+ await waitFor(() => {
48
+ expect(container).toHaveTextContent("Date:potato is an invalid date")
47
49
  })
48
- expect(newDate).toBeUndefined()
49
50
  })
50
51
  })
51
52
 
@@ -1,4 +1,5 @@
1
1
  import React from "react"
2
+ import { useIntl } from "@cultureamp/i18n-react-intl"
2
3
  import type { Locale } from "date-fns"
3
4
  import {
4
5
  DateInput,
@@ -41,6 +42,14 @@ export const DateInputField = React.forwardRef<
41
42
  },
42
43
  ref
43
44
  ) => {
45
+ const { formatMessage } = useIntl()
46
+
47
+ const dateInputLabelFallback = formatMessage({
48
+ id: "filterDatePickerDateInputField.dateInputLabelFallback",
49
+ defaultMessage: "Date",
50
+ description: "Default label for date input field",
51
+ })
52
+
44
53
  const descriptionId = `${id}--field-message`
45
54
 
46
55
  const errorMessageId = validationMessage
@@ -58,7 +67,7 @@ export const DateInputField = React.forwardRef<
58
67
  <DateInput
59
68
  ref={ref}
60
69
  id={id}
61
- labelText={labelText || "Date"}
70
+ labelText={labelText || dateInputLabelFallback}
62
71
  aria-describedby={inputDescribedBy}
63
72
  aria-errormessage={errorMessageId}
64
73
  aria-invalid={dateIsInvalid}
@@ -1,6 +1,7 @@
1
1
  import React, { useState, FocusEvent } 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 { FilterDatePickerField, FilterDatePickerFieldProps } from "."
5
6
 
6
7
  const user = userEvent.setup()
@@ -27,30 +28,36 @@ const FilterDatePickerFieldWrapper = ({
27
28
  )
28
29
  }
29
30
 
31
+ const waitForI18nContent = async (): Promise<void> => {
32
+ await waitFor(() => {
33
+ expect(screen.getByLabelText("Date")).toBeVisible()
34
+ })
35
+ }
36
+
30
37
  describe("<FilterDatePickerField />", () => {
31
38
  beforeEach(() => {
32
39
  jest.clearAllMocks()
33
40
  })
34
41
 
35
42
  describe("Inputs", () => {
36
- it("has empty inputs when a date is not provided", () => {
37
- render(<FilterDatePickerFieldWrapper />)
38
-
43
+ it("has empty inputs when a date is not provided", async () => {
44
+ renderWithIntl(<FilterDatePickerFieldWrapper />)
45
+ await waitForI18nContent()
39
46
  const inputDate = screen.getByLabelText("Date")
40
47
  expect(inputDate).toHaveValue("")
41
48
  })
42
49
 
43
- it("pre-fills the inputs when date is provided", () => {
44
- render(
50
+ it("pre-fills the inputs when date is provided", async () => {
51
+ renderWithIntl(
45
52
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-01")} />
46
53
  )
47
-
54
+ await waitForI18nContent()
48
55
  const inputDate = screen.getByLabelText("Date")
49
56
  expect(inputDate).toHaveValue("1 May 2022")
50
57
  })
51
58
 
52
- it("allows customising the input labels", () => {
53
- render(
59
+ it("allows customising the input labels", async () => {
60
+ renderWithIntl(
54
61
  <FilterDatePickerFieldWrapper
55
62
  selectedDate={new Date("2022-05-01")}
56
63
  inputProps={{
@@ -58,21 +65,23 @@ describe("<FilterDatePickerField />", () => {
58
65
  }}
59
66
  />
60
67
  )
61
-
62
- const date = screen.getByLabelText("Due date")
63
- expect(date).toHaveValue("1 May 2022")
68
+ await waitFor(() => {
69
+ const date = screen.getByLabelText("Due date")
70
+ expect(date).toHaveValue("1 May 2022")
71
+ })
64
72
  })
65
73
 
66
74
  describe("onBlur", () => {
67
75
  it("updates date input and calendar values correctly on blur", async () => {
68
76
  const inputDateOnBlur = jest.fn<void, [FocusEvent]>()
69
77
 
70
- render(
78
+ renderWithIntl(
71
79
  <FilterDatePickerFieldWrapper
72
80
  selectedDate={new Date("2022-05-02")}
73
81
  onBlur={inputDateOnBlur}
74
82
  />
75
83
  )
84
+ await waitForI18nContent()
76
85
 
77
86
  const inputDate = screen.getByLabelText("Date")
78
87
  expect(inputDate).toHaveValue("2 May 2022")
@@ -99,9 +108,10 @@ describe("<FilterDatePickerField />", () => {
99
108
 
100
109
  describe("Press Enter key", () => {
101
110
  it("updates calendar values and calls submit when the date is valid", async () => {
102
- render(
111
+ renderWithIntl(
103
112
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-02")} />
104
113
  )
114
+ await waitForI18nContent()
105
115
 
106
116
  const inputDate = screen.getByLabelText("Date")
107
117
  expect(inputDate).toHaveValue("2 May 2022")
@@ -124,9 +134,10 @@ describe("<FilterDatePickerField />", () => {
124
134
  })
125
135
 
126
136
  it("does not call submit when the date is invalid", async () => {
127
- render(
137
+ renderWithIntl(
128
138
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-02")} />
129
139
  )
140
+ await waitForI18nContent()
130
141
 
131
142
  const inputDate = screen.getByLabelText("Date")
132
143
  await user.click(inputDate)
@@ -141,9 +152,10 @@ describe("<FilterDatePickerField />", () => {
141
152
  })
142
153
 
143
154
  it("updates the calendar month to match the new start date input", async () => {
144
- render(
155
+ renderWithIntl(
145
156
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-02")} />
146
157
  )
158
+ await waitForI18nContent()
147
159
 
148
160
  const inputDate = screen.getByLabelText("Date")
149
161
  expect(inputDate).toHaveValue("2 May 2022")
@@ -162,24 +174,27 @@ describe("<FilterDatePickerField />", () => {
162
174
  })
163
175
 
164
176
  describe("Calendar", () => {
165
- it("shows the default month as the start month when there isn't a selected value", () => {
166
- render(
177
+ it("shows the default month as the start month when there isn't a selected value", async () => {
178
+ renderWithIntl(
167
179
  <FilterDatePickerFieldWrapper defaultMonth={new Date("2022-05-02")} />
168
180
  )
169
-
181
+ await waitForI18nContent()
170
182
  expect(screen.getByText("May 2022")).toBeVisible()
171
183
  })
172
184
 
173
- it("shows the selected start date month as the start month when provided", () => {
174
- render(
185
+ it("shows the selected start date month as the start month when provided", async () => {
186
+ renderWithIntl(
175
187
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-01")} />
176
188
  )
177
-
189
+ await waitForI18nContent()
178
190
  expect(screen.getByText("May 2022")).toBeVisible()
179
191
  })
180
192
 
181
- it("shows the current month as the start month when selected date is invalid", () => {
182
- render(<FilterDatePickerFieldWrapper selectedDate={new Date("potato")} />)
193
+ it("shows the current month as the start month when selected date is invalid", async () => {
194
+ renderWithIntl(
195
+ <FilterDatePickerFieldWrapper selectedDate={new Date("potato")} />
196
+ )
197
+ await waitForI18nContent()
183
198
  const currentMonth = new Date().toLocaleDateString("en-AU", {
184
199
  month: "long",
185
200
  year: "numeric",
@@ -188,7 +203,7 @@ describe("<FilterDatePickerField />", () => {
188
203
  })
189
204
 
190
205
  it("calls the onDateSubmit when selecting a date", async () => {
191
- render(
206
+ renderWithIntl(
192
207
  <FilterDatePickerFieldWrapper defaultMonth={new Date("2022-05-01")} />
193
208
  )
194
209
  const targetMonth = screen.getByRole("grid", { name: "May 2022" })
@@ -203,9 +218,10 @@ describe("<FilterDatePickerField />", () => {
203
218
  })
204
219
 
205
220
  it("updates the input when changing the date", async () => {
206
- render(
221
+ renderWithIntl(
207
222
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-15")} />
208
223
  )
224
+ await waitForI18nContent()
209
225
 
210
226
  const inputDate = screen.getByLabelText("Date")
211
227
  expect(inputDate).toHaveValue("15 May 2022")
@@ -224,9 +240,10 @@ describe("<FilterDatePickerField />", () => {
224
240
  })
225
241
 
226
242
  it("clears the inputs when clearing the calendar value", async () => {
227
- render(
243
+ renderWithIntl(
228
244
  <FilterDatePickerFieldWrapper selectedDate={new Date("2022-05-15")} />
229
245
  )
246
+ await waitForI18nContent()
230
247
 
231
248
  const inputDate = screen.getByLabelText("Date")
232
249
  expect(inputDate).toHaveValue("15 May 2022")
@@ -248,8 +265,8 @@ describe("<FilterDatePickerField />", () => {
248
265
  const dateErrorId = "#test__filter-date-picker--input--date-error-message"
249
266
 
250
267
  describe("Custom validation", () => {
251
- it("shows validation messages passed in from the consumer", () => {
252
- render(
268
+ it("shows validation messages passed in from the consumer", async () => {
269
+ renderWithIntl(
253
270
  <FilterDatePickerFieldWrapper
254
271
  onValidate={(): void => undefined}
255
272
  validationMessage={{
@@ -258,14 +275,15 @@ describe("<FilterDatePickerField />", () => {
258
275
  }}
259
276
  />
260
277
  )
261
-
278
+ await waitForI18nContent()
262
279
  expect(screen.getByText("Date error message")).toBeVisible()
263
280
  })
264
281
  })
265
282
 
266
283
  describe("Inbuilt validation", () => {
267
284
  it("shows inbuilt validation messages", async () => {
268
- const { container } = render(<FilterDatePickerFieldWrapper />)
285
+ const { container } = renderWithIntl(<FilterDatePickerFieldWrapper />)
286
+ await waitForI18nContent()
269
287
 
270
288
  const inputDate = screen.getByLabelText("Date")
271
289
 
@@ -282,16 +300,16 @@ describe("<FilterDatePickerField />", () => {
282
300
  })
283
301
  })
284
302
 
285
- it("shows inbuilt validation messages for pre-existing values", () => {
286
- const { container } = render(
303
+ it("shows inbuilt validation messages for pre-existing values", async () => {
304
+ const { container } = renderWithIntl(
287
305
  <FilterDatePickerFieldWrapper
288
306
  selectedDate={new Date("2022-05-15")}
289
307
  disabledDays={[new Date("2022-05-15")]}
290
308
  />
291
309
  )
310
+ await waitForI18nContent()
292
311
 
293
312
  const dateErrorContainer = container.querySelector(dateErrorId)
294
-
295
313
  expect(dateErrorContainer).toHaveTextContent(
296
314
  "15/05/2022 is not available, try another date"
297
315
  )
@@ -299,7 +317,10 @@ describe("<FilterDatePickerField />", () => {
299
317
  })
300
318
 
301
319
  it("does not call onDateSubmit when the input value is invalid", async () => {
302
- const { getByLabelText } = render(<FilterDatePickerFieldWrapper />)
320
+ const { getByLabelText } = renderWithIntl(
321
+ <FilterDatePickerFieldWrapper />
322
+ )
323
+ await waitForI18nContent()
303
324
 
304
325
  const inputDate = getByLabelText("Date")
305
326
  await user.clear(inputDate)
@@ -312,7 +333,7 @@ describe("<FilterDatePickerField />", () => {
312
333
  })
313
334
 
314
335
  it("re-validates values when selecting a value using the calendar", async () => {
315
- const { container } = render(
336
+ const { container } = renderWithIntl(
316
337
  <FilterDatePickerFieldWrapper
317
338
  selectedDate={new Date("potato")}
318
339
  defaultMonth={new Date("2022-05-01")}
@@ -1,3 +1,5 @@
1
+ import { waitFor, screen } from "@testing-library/react"
2
+ import { renderWithIntl } from "~tests"
1
3
  import { validateDate } from "./validateDate"
2
4
 
3
5
  describe("validateDate()", () => {
@@ -19,70 +21,85 @@ describe("validateDate()", () => {
19
21
  expect(newDate).toBeUndefined()
20
22
  })
21
23
 
22
- it("returns expected response when selected day is invalid and input value is undefined", () => {
24
+ it("returns expected response when selected day is invalid and input value is undefined", async () => {
23
25
  const date = new Date("potato")
24
26
  const inputValue = undefined
25
27
  const { validationResponse, newDate } = validateDate({ date, inputValue })
26
28
 
27
- expect(validationResponse).toStrictEqual({
29
+ expect(newDate).toBeUndefined()
30
+
31
+ const { validationMessage, ...response } = validationResponse
32
+
33
+ expect(response).toStrictEqual({
28
34
  date,
29
35
  inputValue,
30
- validationMessage: {
31
- status: "error",
32
- message: "Date is invalid",
33
- },
34
36
  isInvalid: true,
35
37
  isDisabled: false,
36
38
  isEmpty: false,
37
39
  isValidDate: false,
38
40
  })
39
41
 
40
- expect(newDate).toBeUndefined()
42
+ expect(validationMessage?.status).toBe("error")
43
+
44
+ renderWithIntl(validationMessage?.message)
45
+ await waitFor(() => {
46
+ expect(screen.getByText("Date is invalid")).toBeVisible()
47
+ })
41
48
  })
42
49
 
43
- it("returns expected response when selected day is invalid and input value is empty string", () => {
50
+ it("returns expected response when selected day is invalid and input value is empty string", async () => {
44
51
  const date = new Date("potato")
45
52
  const inputValue = ""
46
53
  const { validationResponse, newDate } = validateDate({ date, inputValue })
47
54
 
48
- expect(validationResponse).toStrictEqual({
55
+ expect(newDate).toBeUndefined()
56
+
57
+ const { validationMessage, ...response } = validationResponse
58
+
59
+ expect(response).toStrictEqual({
49
60
  date,
50
61
  inputValue,
51
- validationMessage: {
52
- status: "error",
53
- message: "Date is invalid",
54
- },
55
62
  isInvalid: true,
56
63
  isDisabled: false,
57
64
  isEmpty: false,
58
65
  isValidDate: false,
59
66
  })
60
67
 
61
- expect(newDate).toBeUndefined()
68
+ expect(validationMessage?.status).toBe("error")
69
+
70
+ renderWithIntl(validationMessage?.message)
71
+ await waitFor(() => {
72
+ expect(screen.getByText("Date is invalid")).toBeVisible()
73
+ })
62
74
  })
63
75
 
64
- it("returns expected response when selected day is invalid and input value is valid string", () => {
76
+ it("returns expected response when selected day is invalid and input value is valid string", async () => {
65
77
  const date = new Date("potato")
66
78
  const inputValue = "potato"
67
79
  const { validationResponse, newDate } = validateDate({ date, inputValue })
68
80
 
69
- expect(validationResponse).toStrictEqual({
81
+ expect(newDate).toBeUndefined()
82
+
83
+ const { validationMessage, ...response } = validationResponse
84
+
85
+ expect(response).toStrictEqual({
70
86
  date,
71
87
  inputValue,
72
- validationMessage: {
73
- status: "error",
74
- message: "potato is an invalid date",
75
- },
76
88
  isInvalid: true,
77
89
  isDisabled: false,
78
90
  isEmpty: false,
79
91
  isValidDate: false,
80
92
  })
81
93
 
82
- expect(newDate).toBeUndefined()
94
+ expect(validationMessage?.status).toBe("error")
95
+
96
+ renderWithIntl(validationMessage?.message)
97
+ await waitFor(() => {
98
+ expect(screen.getByText("potato is an invalid date")).toBeVisible()
99
+ })
83
100
  })
84
101
 
85
- it("returns expected response when selected day is disabled", () => {
102
+ it("returns expected response when selected day is disabled", async () => {
86
103
  const date = new Date("2022-03-01")
87
104
  const inputValue = "03/01/2022"
88
105
  const disabledDays = [new Date("2022-03-01")]
@@ -92,20 +109,27 @@ describe("validateDate()", () => {
92
109
  disabledDays,
93
110
  })
94
111
 
95
- expect(validationResponse).toStrictEqual({
112
+ expect(newDate).toBeUndefined()
113
+
114
+ const { validationMessage, ...response } = validationResponse
115
+
116
+ expect(response).toStrictEqual({
96
117
  date,
97
118
  inputValue,
98
- validationMessage: {
99
- status: "error",
100
- message: "03/01/2022 is not available, try another date",
101
- },
102
119
  isInvalid: false,
103
120
  isDisabled: true,
104
121
  isEmpty: false,
105
122
  isValidDate: false,
106
123
  })
107
124
 
108
- expect(newDate).toBeUndefined()
125
+ expect(validationMessage?.status).toBe("error")
126
+
127
+ renderWithIntl(validationMessage?.message)
128
+ await waitFor(() => {
129
+ expect(
130
+ screen.getByText("03/01/2022 is not available, try another date")
131
+ ).toBeVisible()
132
+ })
109
133
  })
110
134
 
111
135
  it("returns expected response when selected day is valid", () => {
@@ -1,6 +1,7 @@
1
1
  import React, { useState } from "react"
2
2
  import { render, waitFor } from "@testing-library/react"
3
3
  import userEvent from "@testing-library/user-event"
4
+ import { renderWithIntl } from "~tests"
4
5
  import { DateRange } from "~components/Calendar"
5
6
  import { FilterButton } from "~components/Filter/FilterButton"
6
7
  import { FilterDateRangePicker, FilterDateRangePickerProps } from "./index"
@@ -81,7 +82,7 @@ describe("<FilterDateRangePicker />", () => {
81
82
  })
82
83
 
83
84
  it("should show the calendar when the filter button is clicked", async () => {
84
- const { queryByRole, getByRole, getByText } = render(
85
+ const { queryByRole, getByRole, getByText } = renderWithIntl(
85
86
  <FilterDateRangePickerWrapper defaultMonth={new Date("2022-05-01")} />
86
87
  )
87
88
  expect(queryByRole("dialog")).not.toBeInTheDocument()
@@ -95,7 +96,7 @@ describe("<FilterDateRangePicker />", () => {
95
96
  })
96
97
 
97
98
  it("should not show a date range in the button if the selected range is not valid", async () => {
98
- const { getByRole, getByLabelText } = render(
99
+ const { getByRole, getByLabelText } = renderWithIntl(
99
100
  <FilterDateRangePickerWrapper
100
101
  selectedRange={{ from: new Date("2022-05-01") }}
101
102
  />
@@ -10,7 +10,7 @@ import * as FilterDRPStories from "./FilterDateRangePicker.stories"
10
10
  sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/FilterDateRangePicker"
11
11
  figma="https://www.figma.com/file/ZRfnoNUXbGZv4eVWLbF4Az/%F0%9F%96%BC%EF%B8%8F-Component-Gallery?node-id=2349%3A110993&t=gzsKluk8LiOX3jCF-1"
12
12
  designGuidelines="https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3082093959/Filters"
13
- className="!mb-8"
13
+
14
14
  />
15
15
 
16
16
  Date Range Picker to use for Filtering.
@@ -10,7 +10,7 @@ import {
10
10
  StickerSheetStory,
11
11
  } from "~storybook/components/StickerSheet"
12
12
  import { FilterButton } from "../../FilterButton"
13
- import { FilterDateRangePicker } from "../index"
13
+ import { FilterDateRangePicker, FilterDateRangePickerProps } from "../index"
14
14
  import { FilterDateRangePickerField } from "../subcomponents/FilterDateRangePickerField"
15
15
 
16
16
  const IS_CHROMATIC = isChromatic()
@@ -56,7 +56,7 @@ const StickerSheetTemplate: StickerSheetStory = {
56
56
  })
57
57
 
58
58
  return (
59
- <StaticIntlProvider locale="en">
59
+ <>
60
60
  <StickerSheet
61
61
  heading="Filter Date Range Picker"
62
62
  style={{ paddingBottom: IS_CHROMATIC ? "33rem" : undefined }}
@@ -138,28 +138,7 @@ const StickerSheetTemplate: StickerSheetStory = {
138
138
  </StickerSheet.Row>
139
139
  </StickerSheet.Body>
140
140
  </StickerSheet>
141
-
142
- <StickerSheet heading="Translated">
143
- <StickerSheet.Body>
144
- <StickerSheet.Row rowTitle="Japanese">
145
- <StaticIntlProvider locale="ja">
146
- <FilterDateRangePickerField
147
- id="stickersheet--filter-drp-field--translated"
148
- label="Dates"
149
- locale="en-US"
150
- selectedRange={rangeFieldValidation}
151
- onRangeChange={setRangeFieldValidation}
152
- onValidate={{
153
- dateStart: action(
154
- "Validation story: date start onValidate"
155
- ),
156
- }}
157
- />
158
- </StaticIntlProvider>
159
- </StickerSheet.Row>
160
- </StickerSheet.Body>
161
- </StickerSheet>
162
- </StaticIntlProvider>
141
+ </>
163
142
  )
164
143
  },
165
144
  play: async ({ canvasElement }): Promise<void> => {
@@ -191,3 +170,55 @@ export const StickerSheetRTL: StickerSheetStory = {
191
170
  name: "Sticker Sheet (RTL)",
192
171
  parameters: { textDirection: "rtl" },
193
172
  }
173
+
174
+ export const StickerSheetLocales: StickerSheetStory = {
175
+ name: "Sticker Sheet (Locales)",
176
+ render: () => {
177
+ const props = {
178
+ isOpen: false,
179
+ setIsOpen: () => undefined,
180
+ renderTrigger: (triggerButtonProps): JSX.Element => (
181
+ <FilterButton {...triggerButtonProps} />
182
+ ),
183
+ label: "Dates",
184
+ selectedRange: {
185
+ from: new Date("2022-05-15"),
186
+ to: new Date("2022-06-22"),
187
+ },
188
+ onRangeChange: () => undefined,
189
+ locale: "en-AU",
190
+ } satisfies FilterDateRangePickerProps
191
+
192
+ return (
193
+ <>
194
+ <StickerSheet heading="Localisation">
195
+ <StickerSheet.Header headings={["en-AU", "en-US"]} />
196
+ <StickerSheet.Body>
197
+ <StickerSheet.Row>
198
+ <FilterDateRangePicker {...props} locale="en-AU" />
199
+ <FilterDateRangePicker {...props} locale="en-US" />
200
+ </StickerSheet.Row>
201
+ </StickerSheet.Body>
202
+ </StickerSheet>
203
+
204
+ <StickerSheet>
205
+ <StickerSheet.Header headings={["fr-CA"]} />
206
+ <StickerSheet.Body>
207
+ <StickerSheet.Row>
208
+ <StaticIntlProvider locale="fr-CA">
209
+ <FilterDateRangePicker {...props} locale="fr-CA" isOpen />
210
+ </StaticIntlProvider>
211
+ </StickerSheet.Row>
212
+ </StickerSheet.Body>
213
+ </StickerSheet>
214
+ </>
215
+ )
216
+ },
217
+ decorators: [
218
+ Story => (
219
+ <div className="mb-[520px]">
220
+ <Story />
221
+ </div>
222
+ ),
223
+ ],
224
+ }