@simplybusiness/mobius-datepicker 3.12.2 → 4.0.0-beta.11

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 (182) hide show
  1. package/CHANGELOG.md +15 -2
  2. package/dist/cjs/components/DatePicker/DatePicker.d.ts +8 -6
  3. package/dist/cjs/components/DatePicker/DatePicker.js +98 -40
  4. package/dist/cjs/components/DatePicker/DatePicker.js.map +1 -1
  5. package/dist/cjs/components/DatePicker/DatePicker.stories.d.ts +22 -4
  6. package/dist/cjs/components/DatePicker/DatePicker.stories.js +60 -13
  7. package/dist/cjs/components/DatePicker/DatePicker.stories.js.map +1 -1
  8. package/dist/cjs/components/DatePicker/DatePicker.test.js +89 -5
  9. package/dist/cjs/components/DatePicker/DatePicker.test.js.map +1 -1
  10. package/dist/cjs/components/DatePicker/DatePickerIcon.d.ts +1 -0
  11. package/dist/cjs/components/DatePicker/DatePickerIcon.js +7 -0
  12. package/dist/cjs/components/DatePicker/DatePickerIcon.js.map +1 -0
  13. package/dist/cjs/components/DatePicker/DatePickerModal.d.ts +9 -0
  14. package/dist/cjs/components/DatePicker/DatePickerModal.js +50 -0
  15. package/dist/cjs/components/DatePicker/DatePickerModal.js.map +1 -0
  16. package/dist/cjs/components/DatePicker/DatePickerModal.test.d.ts +1 -0
  17. package/dist/cjs/components/DatePicker/DatePickerModal.test.js +102 -0
  18. package/dist/cjs/components/DatePicker/DatePickerModal.test.js.map +1 -0
  19. package/dist/cjs/components/DatePicker/constants.d.ts +2 -0
  20. package/dist/cjs/components/DatePicker/constants.js +7 -0
  21. package/dist/cjs/components/DatePicker/constants.js.map +1 -0
  22. package/dist/cjs/components/DatePicker/index.d.ts +0 -1
  23. package/dist/cjs/components/DatePicker/index.js +0 -3
  24. package/dist/cjs/components/DatePicker/index.js.map +1 -1
  25. package/dist/cjs/components/DatePicker/utils/dateObjToString.d.ts +1 -0
  26. package/dist/cjs/components/DatePicker/utils/dateObjToString.js +7 -0
  27. package/dist/cjs/components/DatePicker/utils/dateObjToString.js.map +1 -0
  28. package/dist/cjs/components/DatePicker/utils/dateObjToString.test.d.ts +1 -0
  29. package/dist/cjs/components/DatePicker/utils/dateObjToString.test.js +15 -0
  30. package/dist/cjs/components/DatePicker/utils/dateObjToString.test.js.map +1 -0
  31. package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.d.ts +2 -0
  32. package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.js +19 -0
  33. package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.js.map +1 -0
  34. package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.test.d.ts +1 -0
  35. package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.test.js +35 -0
  36. package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.test.js.map +1 -0
  37. package/dist/cjs/components/DatePicker/utils/index.d.ts +4 -0
  38. package/dist/cjs/components/DatePicker/utils/index.js +21 -0
  39. package/dist/cjs/components/DatePicker/utils/index.js.map +1 -0
  40. package/dist/cjs/components/DatePicker/utils/validateDateFormat.d.ts +2 -0
  41. package/dist/cjs/components/DatePicker/utils/validateDateFormat.js +17 -0
  42. package/dist/cjs/components/DatePicker/utils/validateDateFormat.js.map +1 -0
  43. package/dist/cjs/components/DatePicker/utils/validateDateFormat.test.d.ts +1 -0
  44. package/dist/cjs/components/DatePicker/utils/validateDateFormat.test.js +26 -0
  45. package/dist/cjs/components/DatePicker/utils/validateDateFormat.test.js.map +1 -0
  46. package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.d.ts +2 -0
  47. package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.js +14 -0
  48. package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.js.map +1 -0
  49. package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.test.d.ts +1 -0
  50. package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.test.js +23 -0
  51. package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.test.js.map +1 -0
  52. package/dist/cjs/hooks/index.d.ts +1 -0
  53. package/dist/cjs/hooks/index.js +18 -0
  54. package/dist/cjs/hooks/index.js.map +1 -0
  55. package/dist/cjs/hooks/useFocusTrap/index.d.ts +1 -0
  56. package/dist/cjs/hooks/useFocusTrap/index.js +18 -0
  57. package/dist/cjs/hooks/useFocusTrap/index.js.map +1 -0
  58. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.d.ts +5 -0
  59. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.js +41 -0
  60. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.js.map +1 -0
  61. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.test.d.ts +1 -0
  62. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.test.js +65 -0
  63. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.test.js.map +1 -0
  64. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  65. package/dist/cjs/utils/excludeControls.d.ts +1 -0
  66. package/dist/cjs/utils/excludeControls.js +29 -0
  67. package/dist/cjs/utils/excludeControls.js.map +1 -0
  68. package/dist/cjs/utils/excludeControls.test.d.ts +1 -0
  69. package/dist/cjs/utils/excludeControls.test.js +25 -0
  70. package/dist/cjs/utils/excludeControls.test.js.map +1 -0
  71. package/dist/cjs/utils/isTouchDevice.d.ts +1 -0
  72. package/dist/cjs/utils/isTouchDevice.js +11 -0
  73. package/dist/cjs/utils/isTouchDevice.js.map +1 -0
  74. package/dist/esm/components/DatePicker/DatePicker.js +99 -41
  75. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  76. package/dist/esm/components/DatePicker/DatePickerIcon.js +3 -0
  77. package/dist/esm/components/DatePicker/DatePickerIcon.js.map +1 -0
  78. package/dist/esm/components/DatePicker/DatePickerModal.js +43 -0
  79. package/dist/esm/components/DatePicker/DatePickerModal.js.map +1 -0
  80. package/dist/esm/components/DatePicker/constants.js +4 -0
  81. package/dist/esm/components/DatePicker/constants.js.map +1 -0
  82. package/dist/esm/components/DatePicker/index.js +0 -1
  83. package/dist/esm/components/DatePicker/index.js.map +1 -1
  84. package/dist/esm/components/DatePicker/utils/dateObjToString.js +3 -0
  85. package/dist/esm/components/DatePicker/utils/dateObjToString.js.map +1 -0
  86. package/dist/esm/components/DatePicker/utils/dateObjToString.test.js +13 -0
  87. package/dist/esm/components/DatePicker/utils/dateObjToString.test.js.map +1 -0
  88. package/dist/esm/components/DatePicker/utils/formatErrorMessageText.js +15 -0
  89. package/dist/esm/components/DatePicker/utils/formatErrorMessageText.js.map +1 -0
  90. package/dist/esm/components/DatePicker/utils/formatErrorMessageText.test.js +33 -0
  91. package/dist/esm/components/DatePicker/utils/formatErrorMessageText.test.js.map +1 -0
  92. package/dist/esm/components/DatePicker/utils/index.js +5 -0
  93. package/dist/esm/components/DatePicker/utils/index.js.map +1 -0
  94. package/dist/esm/components/DatePicker/utils/validateDateFormat.js +13 -0
  95. package/dist/esm/components/DatePicker/utils/validateDateFormat.js.map +1 -0
  96. package/dist/esm/components/DatePicker/utils/validateDateFormat.test.js +24 -0
  97. package/dist/esm/components/DatePicker/utils/validateDateFormat.test.js.map +1 -0
  98. package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.js +10 -0
  99. package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.js.map +1 -0
  100. package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.test.js +21 -0
  101. package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.test.js.map +1 -0
  102. package/dist/esm/hooks/index.js +2 -0
  103. package/dist/esm/hooks/index.js.map +1 -0
  104. package/dist/esm/hooks/useFocusTrap/index.js +2 -0
  105. package/dist/esm/hooks/useFocusTrap/index.js.map +1 -0
  106. package/dist/esm/hooks/useFocusTrap/useFocusTrap.js +38 -0
  107. package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -0
  108. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  109. package/dist/esm/utils/excludeControls.js +25 -0
  110. package/dist/esm/utils/excludeControls.js.map +1 -0
  111. package/dist/esm/utils/excludeControls.test.js +23 -0
  112. package/dist/esm/utils/excludeControls.test.js.map +1 -0
  113. package/dist/esm/utils/isTouchDevice.js +7 -0
  114. package/dist/esm/utils/isTouchDevice.js.map +1 -0
  115. package/package.json +26 -40
  116. package/src/components/DatePicker/DatePicker.mdx +79 -426
  117. package/src/components/DatePicker/DatePicker.stories.tsx +79 -16
  118. package/src/components/DatePicker/DatePicker.test.tsx +144 -11
  119. package/src/components/DatePicker/DatePicker.tsx +160 -82
  120. package/src/components/DatePicker/DatePickerIcon.tsx +1 -0
  121. package/src/components/DatePicker/DatePickerModal.test.tsx +162 -0
  122. package/src/components/DatePicker/DatePickerModal.tsx +94 -0
  123. package/src/components/DatePicker/constants.ts +4 -0
  124. package/src/components/DatePicker/index.tsx +0 -1
  125. package/src/components/DatePicker/utils/dateObjToString.test.ts +17 -0
  126. package/src/components/DatePicker/utils/dateObjToString.ts +3 -0
  127. package/src/components/DatePicker/utils/formatErrorMessageText.test.ts +48 -0
  128. package/src/components/DatePicker/utils/formatErrorMessageText.ts +23 -0
  129. package/src/components/DatePicker/utils/index.ts +4 -0
  130. package/src/components/DatePicker/utils/validateDateFormat.test.ts +31 -0
  131. package/src/components/DatePicker/utils/validateDateFormat.ts +18 -0
  132. package/src/components/DatePicker/utils/weekdayAsOneLetter.test.ts +28 -0
  133. package/src/components/DatePicker/utils/weekdayAsOneLetter.ts +11 -0
  134. package/src/hooks/index.tsx +1 -0
  135. package/src/hooks/useFocusTrap/index.tsx +1 -0
  136. package/src/hooks/useFocusTrap/useFocusTrap.test.tsx +72 -0
  137. package/src/hooks/useFocusTrap/useFocusTrap.tsx +56 -0
  138. package/src/utils/excludeControls.test.ts +26 -0
  139. package/src/utils/excludeControls.ts +28 -0
  140. package/src/utils/isTouchDevice.ts +7 -0
  141. package/dist/cjs/components/DatePicker/Calendar.d.ts +0 -5
  142. package/dist/cjs/components/DatePicker/Calendar.js +0 -21
  143. package/dist/cjs/components/DatePicker/Calendar.js.map +0 -1
  144. package/dist/cjs/components/DatePicker/CalendarButton.d.ts +0 -13
  145. package/dist/cjs/components/DatePicker/CalendarButton.js +0 -29
  146. package/dist/cjs/components/DatePicker/CalendarButton.js.map +0 -1
  147. package/dist/cjs/components/DatePicker/CalendarCell.d.ts +0 -6
  148. package/dist/cjs/components/DatePicker/CalendarCell.js +0 -27
  149. package/dist/cjs/components/DatePicker/CalendarCell.js.map +0 -1
  150. package/dist/cjs/components/DatePicker/CalendarGrid.d.ts +0 -7
  151. package/dist/cjs/components/DatePicker/CalendarGrid.js +0 -35
  152. package/dist/cjs/components/DatePicker/CalendarGrid.js.map +0 -1
  153. package/dist/cjs/components/DatePicker/DateField.d.ts +0 -6
  154. package/dist/cjs/components/DatePicker/DateField.js +0 -38
  155. package/dist/cjs/components/DatePicker/DateField.js.map +0 -1
  156. package/dist/cjs/components/DatePicker/DateSegment.d.ts +0 -6
  157. package/dist/cjs/components/DatePicker/DateSegment.js +0 -25
  158. package/dist/cjs/components/DatePicker/DateSegment.js.map +0 -1
  159. package/dist/cjs/components/DatePicker/Popover.d.ts +0 -8
  160. package/dist/cjs/components/DatePicker/Popover.js +0 -49
  161. package/dist/cjs/components/DatePicker/Popover.js.map +0 -1
  162. package/dist/esm/components/DatePicker/Calendar.js +0 -17
  163. package/dist/esm/components/DatePicker/Calendar.js.map +0 -1
  164. package/dist/esm/components/DatePicker/CalendarButton.js +0 -23
  165. package/dist/esm/components/DatePicker/CalendarButton.js.map +0 -1
  166. package/dist/esm/components/DatePicker/CalendarCell.js +0 -20
  167. package/dist/esm/components/DatePicker/CalendarCell.js.map +0 -1
  168. package/dist/esm/components/DatePicker/CalendarGrid.js +0 -31
  169. package/dist/esm/components/DatePicker/CalendarGrid.js.map +0 -1
  170. package/dist/esm/components/DatePicker/DateField.js +0 -34
  171. package/dist/esm/components/DatePicker/DateField.js.map +0 -1
  172. package/dist/esm/components/DatePicker/DateSegment.js +0 -18
  173. package/dist/esm/components/DatePicker/DateSegment.js.map +0 -1
  174. package/dist/esm/components/DatePicker/Popover.js +0 -45
  175. package/dist/esm/components/DatePicker/Popover.js.map +0 -1
  176. package/src/components/DatePicker/Calendar.tsx +0 -48
  177. package/src/components/DatePicker/CalendarButton.tsx +0 -58
  178. package/src/components/DatePicker/CalendarCell.tsx +0 -48
  179. package/src/components/DatePicker/CalendarGrid.tsx +0 -60
  180. package/src/components/DatePicker/DateField.tsx +0 -45
  181. package/src/components/DatePicker/DateSegment.tsx +0 -34
  182. package/src/components/DatePicker/Popover.tsx +0 -61
package/CHANGELOG.md CHANGED
@@ -1,12 +1,25 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to this project will be documented in this file, or link in [archives](#archived).
4
-
5
3
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
4
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
5
 
8
6
  ## Unreleased
9
7
 
8
+ ### Added
9
+
10
+ Added accessibility features to DatePicker:
11
+
12
+ - A focus trap ensures that keyboard navigation remains on the calendar when open
13
+ - Screen reader announce text on open
14
+ - DOM body is set to aria-hidden="true" when calendar is open
15
+ - Pressing escape or clicking outside calendar closes it
16
+
17
+ ## [4.0.0-alpha.0] - 2023-10-23
18
+
19
+ ### Added
20
+
21
+ - Added exit animations to `Modal`
22
+
10
23
  ### Changed
11
24
 
12
25
  - Move DatePicker component under `@simplybusiness/mobius-datepicker`
@@ -1,7 +1,9 @@
1
- import { DatePickerStateOptions } from "@react-stately/datepicker";
2
- import { AriaDatePickerProps } from "@react-aria/datepicker";
3
- import { DateValue } from "@internationalized/date";
4
- export interface DatePickerProps extends AriaDatePickerProps<DateValue>, DatePickerStateOptions<DateValue> {
5
- label: string;
1
+ import { TextFieldProps } from "@simplybusiness/mobius";
2
+ export interface DatePickerProps extends Omit<TextFieldProps, "defaultValue" | "onChange" | "onBlur" | "onFocus"> {
3
+ onChange?: (date: string | undefined) => void;
4
+ defaultValue?: string;
5
+ min?: string;
6
+ max?: string;
7
+ id?: string;
6
8
  }
7
- export declare function DatePicker(props: DatePickerProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare const DatePicker: (props: DatePickerProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,51 +1,109 @@
1
1
  "use strict";
2
2
  "use client";
3
+ var __rest = (this && this.__rest) || function (s, e) {
4
+ var t = {};
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
6
+ t[p] = s[p];
7
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
8
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
9
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
10
+ t[p[i]] = s[p[i]];
11
+ }
12
+ return t;
13
+ };
3
14
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
15
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
16
  };
6
17
  Object.defineProperty(exports, "__esModule", { value: true });
7
18
  exports.DatePicker = void 0;
8
19
  const jsx_runtime_1 = require("react/jsx-runtime");
9
- const datepicker_1 = require("@react-stately/datepicker");
10
- const datepicker_2 = require("@react-aria/datepicker");
11
- const react_1 = require("react");
12
- const overlays_1 = require("@react-aria/overlays");
13
- const interactions_1 = require("@react-aria/interactions");
14
- const focus_1 = require("@react-aria/focus");
15
- const clsx_1 = __importDefault(require("clsx"));
16
- const visually_hidden_1 = require("@react-aria/visually-hidden");
17
20
  const mobius_1 = require("@simplybusiness/mobius");
18
- const DateField_1 = require("./DateField");
19
- const Popover_1 = require("./Popover");
20
- const Calendar_1 = require("./Calendar");
21
- function DatePicker(props) {
22
- const { label, isRequired } = props;
23
- const state = (0, datepicker_1.useDatePickerState)(props);
24
- const ref = (0, react_1.useRef)(null);
25
- const { groupProps, labelProps, fieldProps, buttonProps, dialogProps, calendarProps, } = (0, datepicker_2.useDatePicker)(props, state, ref);
26
- const classes = (0, clsx_1.default)("mobius/DatePicker", {
27
- "--is-valid": state.validationState === "valid",
28
- "--is-invalid": state.validationState === "invalid",
29
- "--is-required": typeof isRequired === "boolean" && isRequired,
30
- "--is-optional": typeof isRequired === "boolean" && !isRequired,
31
- });
32
- const { hoverProps, isHovered } = (0, interactions_1.useHover)(Object.assign({}, props));
33
- const { focusProps, isFocusVisible } = (0, focus_1.useFocusRing)(props);
34
- const dateFieldGroupClasses = (0, clsx_1.default)("mobius/DateFieldGroup", {
35
- "--is-hovered": isHovered,
36
- "--is-focused": isFocusVisible,
37
- });
38
- const dateFieldClasses = (0, clsx_1.default)("mobius/DateField", {
39
- "--is-hovered": isHovered,
40
- "--is-focused": isFocusVisible,
41
- });
42
- const buttonClasses = (0, clsx_1.default)("mobius/DateFieldButton", {
43
- "--is-hovered": isHovered,
44
- "--is-focused": isFocusVisible,
45
- });
46
- return ((0, jsx_runtime_1.jsx)(overlays_1.ModalProvider, { children: (0, jsx_runtime_1.jsxs)("div", { className: classes, style: { position: "relative" }, children: [(0, jsx_runtime_1.jsx)(mobius_1.Label, Object.assign({}, labelProps, { children: label })), (0, jsx_runtime_1.jsxs)("div", Object.assign({}, groupProps, hoverProps, focusProps, { ref: ref, className: dateFieldGroupClasses, children: [(0, jsx_runtime_1.jsx)(DateField_1.DateField, Object.assign({}, fieldProps, { className: dateFieldClasses })), (0, jsx_runtime_1.jsx)(mobius_1.Button, Object.assign({ variant: "secondary" }, buttonProps, { className: buttonClasses, children: (0, jsx_runtime_1.jsx)(visually_hidden_1.VisuallyHidden, { children: "Pick date" }) }))] })), state.isOpen && (
47
- /* @ts-expect-error */
48
- (0, jsx_runtime_1.jsx)(Popover_1.Popover, Object.assign({}, dialogProps, { isOpen: state.isOpen, onClose: () => state.setOpen(false), children: (0, jsx_runtime_1.jsx)(Calendar_1.Calendar, Object.assign({}, calendarProps)) })))] }) }));
49
- }
21
+ const dedupe_1 = __importDefault(require("classnames/dedupe"));
22
+ const react_1 = require("react");
23
+ const isTouchDevice_1 = require("../../utils/isTouchDevice");
24
+ const DatePickerModal_1 = require("./DatePickerModal");
25
+ const utils_1 = require("./utils");
26
+ const DatePicker = (props) => {
27
+ const { onChange, defaultValue = "", isDisabled, validationState, errorMessage = "" } = props, otherProps = __rest(props, ["onChange", "defaultValue", "isDisabled", "validationState", "errorMessage"]);
28
+ const containerRef = (0, react_1.useRef)(null);
29
+ const [top, setTop] = (0, react_1.useState)(0);
30
+ const inputRef = (0, react_1.useRef)(null);
31
+ const [isOpen, setIsOpen] = (0, react_1.useState)(false);
32
+ const [textFieldVal, setTextFieldVal] = (0, react_1.useState)((0, utils_1.validateDateFormat)(defaultValue));
33
+ const [isValid, setIsValid] = (0, react_1.useState)(true);
34
+ const errorMessageText = !isValid
35
+ ? // eslint-disable-next-line react/destructuring-assignment
36
+ (0, utils_1.formatErrorMessageText)(textFieldVal, props.min, props.max)
37
+ : errorMessage;
38
+ const inputValidationState = !isValid ? "invalid" : validationState;
39
+ const touchDevice = (0, isTouchDevice_1.isTouchDevice)();
40
+ const validationClasses = {
41
+ "--is-valid": validationState === "valid",
42
+ "--is-invalid": validationState === "invalid" || !isValid,
43
+ };
44
+ const containerClasses = (0, dedupe_1.default)("mobius/DatePickerContainer", Object.assign({ "--is-disabled": isDisabled }, validationClasses));
45
+ const popoverToggleClasses = (0, dedupe_1.default)("mobius/DateFieldButton", Object.assign({}, validationClasses));
46
+ const togglePopoverVisibility = () => {
47
+ setIsValid(true);
48
+ setIsOpen(!isOpen);
49
+ };
50
+ const handleTextFieldChange = (event) => {
51
+ setTextFieldVal(event.target.value);
52
+ // onChange only triggers on a valid date
53
+ // so this clears the error
54
+ setIsValid(true);
55
+ };
56
+ const validate = () => {
57
+ var _a;
58
+ // If 'min' or 'max' values are provided, checkValidity() will
59
+ // validate the date and return a boolean
60
+ const isValidInput = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.checkValidity();
61
+ if (!isValidInput) {
62
+ setIsValid(false);
63
+ }
64
+ };
65
+ const onDateSelected = (selectedDate) => {
66
+ // Handle null callback from useOnClickOutside
67
+ if (selectedDate) {
68
+ setTextFieldVal(selectedDate);
69
+ setIsValid(true);
70
+ // Add other callback events here
71
+ onChange === null || onChange === void 0 ? void 0 : onChange(selectedDate);
72
+ }
73
+ setIsOpen(false);
74
+ };
75
+ // User has interacted with the component and navigated away
76
+ const handleBlur = (event) => {
77
+ validate();
78
+ // User hasn't entered a date OR
79
+ // entered an invalid date
80
+ if (!textFieldVal) {
81
+ setIsValid(false);
82
+ }
83
+ onChange === null || onChange === void 0 ? void 0 : onChange(event.target.value);
84
+ };
85
+ (0, react_1.useEffect)(() => {
86
+ var _a;
87
+ if (isOpen) {
88
+ setTop(((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().height) || 0);
89
+ // Disable validation when day picker is open
90
+ setIsValid(true);
91
+ return;
92
+ }
93
+ validate();
94
+ }, [isOpen]);
95
+ if (touchDevice) {
96
+ return ((0, jsx_runtime_1.jsx)(mobius_1.TextField, Object.assign({ ref: inputRef, type: "date", className: "mobius/DatePicker",
97
+ // @ts-ignore
98
+ onBlur: handleBlur, onChange: handleTextFieldChange, value: textFieldVal, isDisabled: isDisabled, validationState: inputValidationState }, otherProps, { errorMessage: errorMessageText })));
99
+ }
100
+ return ((0, jsx_runtime_1.jsxs)("div", { className: containerClasses, ref: containerRef, children: [(0, jsx_runtime_1.jsx)(mobius_1.TextField, Object.assign({ ref: inputRef, type: "date", className: "mobius/DatePicker",
101
+ // @ts-ignore
102
+ onBlur: handleBlur, onChange: handleTextFieldChange, value: textFieldVal, isDisabled: isDisabled, validationState: inputValidationState }, otherProps, { errorMessage: errorMessageText, children: (0, jsx_runtime_1.jsx)(mobius_1.Button, { className: popoverToggleClasses, onClick: togglePopoverVisibility, isDisabled: isDisabled, children: (0, jsx_runtime_1.jsx)(mobius_1.VisuallyHidden, { children: "Pick date" }) }) })), isOpen && ((0, jsx_runtime_1.jsx)(DatePickerModal_1.DatePickerModal, { date: textFieldVal, isOpen: isOpen, top: top, onSelected: onDateSelected,
103
+ // eslint-disable-next-line react/destructuring-assignment
104
+ min: props.min,
105
+ // eslint-disable-next-line react/destructuring-assignment
106
+ max: props.max }))] }));
107
+ };
50
108
  exports.DatePicker = DatePicker;
51
109
  //# sourceMappingURL=DatePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;AAEb,0DAGmC;AACnC,uDAA4E;AAC5E,iCAA+B;AAC/B,mDAAqD;AAErD,2DAAoD;AACpD,6CAAiD;AACjD,gDAAwB;AACxB,iEAA6D;AAC7D,mDAAuD;AACvD,2CAAwC;AACxC,uCAAoC;AACpC,yCAAsC;AAQtC,SAAgB,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,IAAA,+BAAkB,EAAC,KAAK,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IAChD,MAAM,EACJ,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,GACd,GAAG,IAAA,0BAAa,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,IAAA,cAAI,EAAC,mBAAmB,EAAE;QACxC,YAAY,EAAE,KAAK,CAAC,eAAe,KAAK,OAAO;QAC/C,cAAc,EAAE,KAAK,CAAC,eAAe,KAAK,SAAS;QACnD,eAAe,EAAE,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU;QAC9D,eAAe,EAAE,OAAO,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU;KAChE,CAAC,CAAC;IAEH,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAA,uBAAQ,oBACrC,KAAK,EACR,CAAC;IAEH,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC;IAE3D,MAAM,qBAAqB,GAAG,IAAA,cAAI,EAAC,uBAAuB,EAAE;QAC1D,cAAc,EAAE,SAAS;QACzB,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,IAAA,cAAI,EAAC,kBAAkB,EAAE;QAChD,cAAc,EAAE,SAAS;QACzB,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAA,cAAI,EAAC,wBAAwB,EAAE;QACnD,cAAc,EAAE,SAAS;QACzB,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IAEH,OAAO,CACL,uBAAC,wBAAa,cACZ,iCAAK,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,aACtD,uBAAC,cAAK,oBAAK,UAAU,cAAG,KAAK,IAAS,EACtC,iDACM,UAAU,EACV,UAAU,EACV,UAAU,IACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,qBAAqB,aAEhC,uBAAC,qBAAS,oBAAK,UAAU,IAAE,SAAS,EAAE,gBAAgB,IAAI,EAE1D,uBAAC,eAAM,kBACL,OAAO,EAAC,WAAW,IACf,WAAW,IACf,SAAS,EAAE,aAAa,YAExB,uBAAC,gCAAc,4BAA2B,IACnC,KACL,EACL,KAAK,CAAC,MAAM,IAAI;gBACf,sBAAsB;gBACtB,uBAAC,iBAAO,oBACF,WAAW,IACf,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAEnC,uBAAC,mBAAQ,oBAAK,aAAa,EAAI,IACvB,CACX,IACG,GACQ,CACjB,CAAC;AACJ,CAAC;AA3ED,gCA2EC"}
1
+ {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;AAEb,mDAMgC;AAChC,+DAA2C;AAC3C,iCAA6E;AAC7E,6DAA0D;AAC1D,uDAAoD;AACpD,mCAAqE;AAc9D,MAAM,UAAU,GAAG,CAAC,KAAsB,EAAE,EAAE;IACnD,MAAM,EACJ,QAAQ,EACR,YAAY,GAAG,EAAE,EACjB,UAAU,EACV,eAAe,EACf,YAAY,GAAG,EAAE,KAEf,KAAK,EADJ,UAAU,UACX,KAAK,EAPH,6EAOL,CAAQ,CAAC;IACV,MAAM,YAAY,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAA,gBAAQ,EAAS,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAA,cAAM,EAA8B,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IACrD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAC9C,IAAA,0BAAkB,EAAC,YAAY,CAAC,CACjC,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAU,IAAI,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,CAAC,OAAO;QAC/B,CAAC,CAAC,0DAA0D;YAC1D,IAAA,8BAAsB,EAAC,YAAY,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;QAC5D,CAAC,CAAC,YAAY,CAAC;IACjB,MAAM,oBAAoB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC;IACpE,MAAM,WAAW,GAAG,IAAA,6BAAa,GAAE,CAAC;IAEpC,MAAM,iBAAiB,GAAG;QACxB,YAAY,EAAE,eAAe,KAAK,OAAO;QACzC,cAAc,EAAE,eAAe,KAAK,SAAS,IAAI,CAAC,OAAO;KAC1D,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAA,gBAAU,EAAC,4BAA4B,kBAC9D,eAAe,EAAE,UAAU,IACxB,iBAAiB,EACpB,CAAC;IAEH,MAAM,oBAAoB,GAAG,IAAA,gBAAU,EAAC,wBAAwB,oBAC3D,iBAAiB,EACpB,CAAC;IAEH,MAAM,uBAAuB,GAAG,GAAG,EAAE;QACnC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,KAAwC,EAAE,EAAE;QACzE,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,yCAAyC;QACzC,2BAA2B;QAC3B,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;;QACpB,8DAA8D;QAC9D,yCAAyC;QACzC,MAAM,YAAY,GAAG,MAAA,QAAQ,CAAC,OAAO,0CAAE,aAAa,EAAE,CAAC;QAEvD,IAAI,CAAC,YAAY,EAAE;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;SACnB;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,YAAgC,EAAE,EAAE;QAC1D,8CAA8C;QAC9C,IAAI,YAAY,EAAE;YAChB,eAAe,CAAC,YAAY,CAAC,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,iCAAiC;YACjC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,YAAY,CAAC,CAAC;SAC1B;QAED,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,4DAA4D;IAC5D,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAE,EAAE;QAC7D,QAAQ,EAAE,CAAC;QAEX,gCAAgC;QAChC,0BAA0B;QAC1B,IAAI,CAAC,YAAY,EAAE;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;SACnB;QAED,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACb,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,CAAA,MAAA,YAAY,CAAC,OAAO,0CAAE,qBAAqB,GAAG,MAAM,KAAI,CAAC,CAAC,CAAC;YAClE,6CAA6C;YAC7C,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;SACR;QAED,QAAQ,EAAE,CAAC;IACb,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,WAAW,EAAE;QACf,OAAO,CACL,uBAAC,kBAAS,kBACR,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,mBAAmB;YAC7B,aAAa;YACb,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,oBAAoB,IACjC,UAAU,IACd,YAAY,EAAE,gBAAgB,IAC9B,CACH,CAAC;KACH;IAED,OAAO,CACL,iCAAK,SAAS,EAAE,gBAAgB,EAAE,GAAG,EAAE,YAAY,aACjD,uBAAC,kBAAS,kBACR,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,mBAAmB;gBAC7B,aAAa;gBACb,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,oBAAoB,IACjC,UAAU,IACd,YAAY,EAAE,gBAAgB,YAE9B,uBAAC,eAAM,IACL,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,UAAU,YAEtB,uBAAC,uBAAc,4BAA2B,GACnC,IACC,EACX,MAAM,IAAI,CACT,uBAAC,iCAAe,IACd,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,cAAc;gBAC1B,0DAA0D;gBAC1D,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,0DAA0D;gBAC1D,GAAG,EAAE,KAAK,CAAC,GAAG,GACd,CACH,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAvJW,QAAA,UAAU,cAuJrB"}
@@ -1,16 +1,34 @@
1
1
  import type { Meta } from "@storybook/react";
2
- import { DatePicker } from "./DatePicker";
2
+ import { DatePicker, DatePickerProps } from "./DatePicker";
3
3
  declare const _default: {
4
4
  title: string;
5
- component: typeof DatePicker;
5
+ component: (props: DatePickerProps) => import("react/jsx-runtime").JSX.Element;
6
6
  argTypes: {
7
- locale: {
7
+ validationState: {
8
+ options: string[];
8
9
  control: {
9
10
  type: string;
10
11
  };
11
- options: string[];
12
+ mapping: {
13
+ valid: string;
14
+ invalid: string;
15
+ neither: string;
16
+ };
12
17
  };
13
18
  };
19
+ args: {
20
+ defaultValue: string;
21
+ errorMessage: string;
22
+ isDisabled: boolean;
23
+ isRequired: boolean;
24
+ min: string;
25
+ max: string;
26
+ };
14
27
  };
15
28
  export default _default;
16
29
  export declare const Normal: Meta<typeof DatePicker>;
30
+ export declare const WithMinValue: Meta<typeof DatePicker>;
31
+ export declare const WithMaxValue: Meta<typeof DatePicker>;
32
+ export declare const Disabled: Meta<typeof DatePicker>;
33
+ export declare const Valid: Meta<typeof DatePicker>;
34
+ export declare const Invalid: Meta<typeof DatePicker>;
@@ -1,28 +1,75 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Normal = void 0;
3
+ exports.Invalid = exports.Valid = exports.Disabled = exports.WithMaxValue = exports.WithMinValue = exports.Normal = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const date_1 = require("@internationalized/date");
6
- const i18n_1 = require("@react-aria/i18n");
5
+ const date_fns_1 = require("date-fns");
6
+ const excludeControls_1 = require("../../utils/excludeControls");
7
7
  const DatePicker_1 = require("./DatePicker");
8
8
  exports.default = {
9
9
  title: "Forms/DatePicker",
10
10
  component: DatePicker_1.DatePicker,
11
- argTypes: {
12
- locale: {
13
- control: { type: "select" },
14
- options: ["", "en-GB", "en-US"],
15
- },
11
+ argTypes: Object.assign({ validationState: {
12
+ options: ["valid", "invalid", "neither"],
13
+ control: { type: "radio" },
14
+ mapping: {
15
+ valid: "valid",
16
+ invalid: "invalid",
17
+ neither: "",
18
+ },
19
+ } }, (0, excludeControls_1.excludeControls)("onChange", "id", "className", "description", "type", "aria-label", "aria-labelledby", "labelElementType", "inputElementType", "isReadOnly", "aria-describedby", "aria-errormessage")),
20
+ args: {
21
+ defaultValue: "",
22
+ errorMessage: "",
23
+ isDisabled: false,
24
+ isRequired: false,
25
+ min: "",
26
+ max: "",
16
27
  },
17
28
  };
18
29
  exports.Normal = {
19
- render: (args) => ((0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({ minValue: (0, date_1.parseDate)("2022-05-05") }, args))),
30
+ render: (args) => (0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({}, args)),
20
31
  args: {
21
32
  label: "Start date",
22
- isRequired: false,
23
33
  },
24
- decorators: [
25
- (Story, context) => ((0, jsx_runtime_1.jsx)(i18n_1.I18nProvider, { locale: context.allArgs.locale, children: (0, jsx_runtime_1.jsx)(Story, {}) })),
26
- ],
34
+ };
35
+ const aWeekFromToday = (0, date_fns_1.format)((0, date_fns_1.add)(new Date(), { weeks: 1 }), "yyyy-MM-dd");
36
+ const twoMonthsFromToday = (0, date_fns_1.format)((0, date_fns_1.add)(new Date(), { months: 2 }), "yyyy-MM-dd");
37
+ exports.WithMinValue = {
38
+ render: (args) => (0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({}, args)),
39
+ args: {
40
+ label: "Start date (a week from today)",
41
+ min: aWeekFromToday,
42
+ isRequired: true,
43
+ },
44
+ };
45
+ exports.WithMaxValue = {
46
+ render: (args) => (0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({}, args)),
47
+ args: {
48
+ label: "End date (two months from today)",
49
+ max: twoMonthsFromToday,
50
+ isRequired: true,
51
+ },
52
+ };
53
+ exports.Disabled = {
54
+ render: (args) => (0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({}, args)),
55
+ args: {
56
+ label: "Start date",
57
+ isDisabled: true,
58
+ },
59
+ };
60
+ exports.Valid = {
61
+ render: (args) => (0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({}, args)),
62
+ args: {
63
+ label: "Start date",
64
+ validationState: "valid",
65
+ },
66
+ };
67
+ exports.Invalid = {
68
+ render: (args) => (0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, Object.assign({}, args)),
69
+ args: {
70
+ label: "Start date",
71
+ validationState: "invalid",
72
+ errorMessage: "This is an error message",
73
+ },
27
74
  };
28
75
  //# sourceMappingURL=DatePicker.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.stories.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.stories.tsx"],"names":[],"mappings":";;;;AACA,kDAAoD;AACpD,2CAAgD;AAChD,6CAA2D;AAE3D,kBAAe;IACb,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,uBAAU;IACrB,QAAQ,EAAE;QACR,MAAM,EAAE;YACN,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC;SAChC;KACF;CACF,CAAC;AAEW,QAAA,MAAM,GAA4B;IAC7C,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,CACjC,uBAAC,uBAAU,kBAAC,QAAQ,EAAE,IAAA,gBAAS,EAAC,YAAY,CAAC,IAAM,IAAI,EAAI,CAC5D;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,KAAK;KAClB;IACD,UAAU,EAAE;QACV,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAClB,uBAAC,mBAAY,IAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,YAC1C,uBAAC,KAAK,KAAG,GACI,CAChB;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"DatePicker.stories.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.stories.tsx"],"names":[],"mappings":";;;;AACA,uCAAuC;AACvC,iEAA8D;AAC9D,6CAA2D;AAE3D,kBAAe;IACb,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,uBAAU;IACrB,QAAQ,kBACN,eAAe,EAAE;YACf,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;YACxC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YAC1B,OAAO,EAAE;gBACP,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,EAAE;aACZ;SACF,IACE,IAAA,iCAAe,EAChB,UAAU,EACV,IAAI,EACJ,WAAW,EACX,aAAa,EACb,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,CACpB,CACF;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,KAAK;QACjB,GAAG,EAAE,EAAE;QACP,GAAG,EAAE,EAAE;KACR;CACF,CAAC;AAEW,QAAA,MAAM,GAA4B;IAC7C,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,uBAAC,uBAAU,oBAAK,IAAI,EAAI;IAC3D,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY;KACpB;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,IAAA,iBAAM,EAAC,IAAA,cAAG,EAAC,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;AAC3E,MAAM,kBAAkB,GAAG,IAAA,iBAAM,EAAC,IAAA,cAAG,EAAC,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;AAEnE,QAAA,YAAY,GAA4B;IACnD,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,uBAAC,uBAAU,oBAAK,IAAI,EAAI;IAC3D,IAAI,EAAE;QACJ,KAAK,EAAE,gCAAgC;QACvC,GAAG,EAAE,cAAc;QACnB,UAAU,EAAE,IAAI;KACjB;CACF,CAAC;AAEW,QAAA,YAAY,GAA4B;IACnD,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,uBAAC,uBAAU,oBAAK,IAAI,EAAI;IAC3D,IAAI,EAAE;QACJ,KAAK,EAAE,kCAAkC;QACzC,GAAG,EAAE,kBAAkB;QACvB,UAAU,EAAE,IAAI;KACjB;CACF,CAAC;AAEW,QAAA,QAAQ,GAA4B;IAC/C,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,uBAAC,uBAAU,oBAAK,IAAI,EAAI;IAC3D,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,IAAI;KACjB;CACF,CAAC;AAEW,QAAA,KAAK,GAA4B;IAC5C,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,uBAAC,uBAAU,oBAAK,IAAI,EAAI;IAC3D,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY;QACnB,eAAe,EAAE,OAAO;KACzB;CACF,CAAC;AAEW,QAAA,OAAO,GAA4B;IAC9C,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,uBAAC,uBAAU,oBAAK,IAAI,EAAI;IAC3D,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY;QACnB,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,0BAA0B;KACzC;CACF,CAAC"}
@@ -1,14 +1,98 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const jsx_runtime_1 = require("react/jsx-runtime");
4
7
  const react_1 = require("@testing-library/react");
5
- const i18n_1 = require("@react-aria/i18n");
6
- const date_1 = require("@internationalized/date");
8
+ const user_event_1 = __importDefault(require("@testing-library/user-event"));
7
9
  const _1 = require(".");
10
+ const mockMatchMedia = (matches) => {
11
+ Object.defineProperty(window, "matchMedia", {
12
+ writable: true,
13
+ configurable: true,
14
+ value: jest.fn().mockImplementation(query => ({
15
+ matches,
16
+ media: query,
17
+ onchange: null,
18
+ addListener: jest.fn(),
19
+ removeListener: jest.fn(),
20
+ addEventListener: jest.fn(),
21
+ removeEventListener: jest.fn(),
22
+ dispatchEvent: jest.fn(),
23
+ })),
24
+ });
25
+ };
26
+ const DEVICES = [
27
+ ["touch device", true],
28
+ ["non-touch device", false],
29
+ ];
8
30
  describe("DatePicker", () => {
9
- it("should render without errors", () => {
10
- const component = (0, react_1.render)((0, jsx_runtime_1.jsx)(i18n_1.I18nProvider, { locale: "en-GB", children: (0, jsx_runtime_1.jsx)(_1.DatePicker, { minValue: (0, date_1.parseDate)("2022-05-05"), label: "Start date" }) }));
11
- expect(component).toBeTruthy();
31
+ describe.each(DEVICES)(`given it is a %s`, (_, value) => {
32
+ beforeEach(() => {
33
+ mockMatchMedia(value);
34
+ });
35
+ it("should render without errors", () => {
36
+ const exampleDate = "2023-11-13";
37
+ const labelText = "Start date";
38
+ const testId = "date-picker";
39
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(_1.DatePicker, { defaultValue: exampleDate, label: labelText, "data-testid": testId }));
40
+ const inputField = react_1.screen.getByTestId(testId);
41
+ const label = react_1.screen.getByLabelText(labelText);
42
+ expect(inputField).toHaveValue(exampleDate);
43
+ expect(label).toBeInTheDocument();
44
+ });
45
+ describe("when value changes", () => {
46
+ it("triggers onChange", async () => {
47
+ const labelText = "Start date";
48
+ const testId = "date-picker";
49
+ const onChange = jest.fn();
50
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(_1.DatePicker, { label: labelText, "data-testid": testId, onChange: onChange }));
51
+ const inputField = react_1.screen.getByTestId(testId);
52
+ const newDate = "2015-06-01";
53
+ react_1.fireEvent.change(inputField, { target: { value: newDate } });
54
+ expect(inputField).toHaveValue(newDate);
55
+ // Tab outside, so that date picker triggers onBlur event
56
+ await user_event_1.default.tab();
57
+ await user_event_1.default.tab();
58
+ expect(onChange).toHaveBeenCalledWith(newDate);
59
+ });
60
+ });
61
+ it("displays custom error message", () => {
62
+ const testId = "date-picker";
63
+ const errorMessage = "Input error";
64
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(_1.DatePicker, { label: "Start date", "data-testid": testId, errorMessage: errorMessage }));
65
+ const error = react_1.screen.getByText(errorMessage);
66
+ expect(error).toBeInTheDocument();
67
+ });
68
+ describe("given a min prop is provided", () => {
69
+ describe("given a default invalid date falls into rangeUnderflow", () => {
70
+ it("should display an error", () => {
71
+ const exampleDate = "2023-11-13";
72
+ const minimumDate = "2024-01-01";
73
+ const labelText = "Start date";
74
+ const testId = "date-picker";
75
+ const errorMessage = `The selected date ${exampleDate} is before earliest possible ${minimumDate} date`;
76
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(_1.DatePicker, { defaultValue: exampleDate, min: minimumDate, label: labelText, "data-testid": testId }));
77
+ const error = react_1.screen.getByText(errorMessage);
78
+ expect(error).toBeInTheDocument();
79
+ });
80
+ });
81
+ });
82
+ describe("given a max prop is provided", () => {
83
+ describe("given a default invalid date falls into rangeOverflow", () => {
84
+ it("should display an error", () => {
85
+ const exampleDate = "2025-11-13";
86
+ const maximumDate = "2024-01-01";
87
+ const labelText = "Start date";
88
+ const testId = "date-picker";
89
+ const errorMessage = `The selected date ${exampleDate} is after latest possible ${maximumDate} date`;
90
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(_1.DatePicker, { defaultValue: exampleDate, max: maximumDate, label: labelText, "data-testid": testId }));
91
+ const error = react_1.screen.getByText(errorMessage);
92
+ expect(error).toBeInTheDocument();
93
+ });
94
+ });
95
+ });
12
96
  });
13
97
  });
14
98
  //# sourceMappingURL=DatePicker.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.test.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.test.tsx"],"names":[],"mappings":";;;AACA,kDAAgD;AAChD,2CAAgD;AAChD,kDAAoD;AACpD,wBAA+B;AAE/B,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,SAAS,GAAG,IAAA,cAAM,EACtB,uBAAC,mBAAY,IAAC,MAAM,EAAC,OAAO,YAC1B,uBAAC,aAAU,IAAC,QAAQ,EAAE,IAAA,gBAAS,EAAC,YAAY,CAAC,EAAE,KAAK,EAAC,YAAY,GAAG,GACvD,CAChB,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"DatePicker.test.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const DatePickerIcon: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatePickerIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const DatePickerIcon = () => (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: " " });
6
+ exports.DatePickerIcon = DatePickerIcon;
7
+ //# sourceMappingURL=DatePickerIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePickerIcon.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePickerIcon.tsx"],"names":[],"mappings":";;;;AAAO,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,iEAAM,CAAC;AAA9B,QAAA,cAAc,kBAAgB"}
@@ -0,0 +1,9 @@
1
+ export type DatePickerModalProps = {
2
+ date?: string;
3
+ isOpen: boolean;
4
+ top: number;
5
+ onSelected: (date?: string | undefined) => void;
6
+ min?: string;
7
+ max?: string;
8
+ };
9
+ export declare const DatePickerModal: ({ date, isOpen, onSelected, top, min, max, }: DatePickerModalProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ "use client";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DatePickerModal = void 0;
8
+ const jsx_runtime_1 = require("react/jsx-runtime");
9
+ const mobius_1 = require("@simplybusiness/mobius");
10
+ const dedupe_1 = __importDefault(require("classnames/dedupe"));
11
+ const react_1 = require("react");
12
+ const react_day_picker_1 = require("react-day-picker");
13
+ const useFocusTrap_1 = __importDefault(require("../../hooks/useFocusTrap/useFocusTrap"));
14
+ const DatePickerIcon_1 = require("./DatePickerIcon");
15
+ const constants_1 = require("./constants");
16
+ const utils_1 = require("./utils");
17
+ const PARENT_NODE = typeof document !== "undefined" && document.body;
18
+ const DatePickerModal = ({ date, isOpen, onSelected, top, min, max, }) => {
19
+ const modalRef = (0, react_1.useRef)(null);
20
+ const initialDate = date ? new Date(date) : undefined;
21
+ const minDate = min ? new Date(min) : undefined;
22
+ const maxDate = max ? new Date(max) : undefined;
23
+ if (isOpen && PARENT_NODE) {
24
+ PARENT_NODE === null || PARENT_NODE === void 0 ? void 0 : PARENT_NODE.setAttribute("aria-hidden", "true");
25
+ }
26
+ const handleSelected = (selectedDate) => {
27
+ if (PARENT_NODE)
28
+ PARENT_NODE === null || PARENT_NODE === void 0 ? void 0 : PARENT_NODE.removeAttribute("aria-hidden");
29
+ onSelected(selectedDate);
30
+ };
31
+ const handleDayPickerSelect = (selectedDate) => {
32
+ if (!selectedDate)
33
+ return;
34
+ handleSelected((0, utils_1.dateObjToString)(selectedDate));
35
+ };
36
+ (0, mobius_1.useOnClickOutside)(modalRef, () => {
37
+ if (modalRef.current && isOpen) {
38
+ handleSelected();
39
+ }
40
+ });
41
+ const modalClasses = (0, dedupe_1.default)("mobius/DatePickerModal", {
42
+ "--is-open": isOpen,
43
+ });
44
+ return ((0, jsx_runtime_1.jsx)(useFocusTrap_1.default, { children: (0, jsx_runtime_1.jsxs)("div", { ref: modalRef, className: modalClasses, style: { top }, "aria-describedby": "screen-reader-title", "data-testid": "modal-container", children: [(0, jsx_runtime_1.jsx)(mobius_1.VisuallyHidden, { children: (0, jsx_runtime_1.jsx)("div", { id: "screen-reader-title", children: "Please select a date from the calendar" }) }), (0, jsx_runtime_1.jsx)(react_day_picker_1.DayPicker, { mode: "single", fromDate: minDate, toDate: maxDate, selected: initialDate, defaultMonth: initialDate, onSelect: handleDayPickerSelect, pagedNavigation: true, showOutsideDays: true, weekStartsOn: constants_1.MONDAY_AS_NUMBER, formatters: { formatWeekdayName: utils_1.weekdayAsOneLetter }, components: {
45
+ IconLeft: DatePickerIcon_1.DatePickerIcon,
46
+ IconRight: DatePickerIcon_1.DatePickerIcon,
47
+ } })] }) }));
48
+ };
49
+ exports.DatePickerModal = DatePickerModal;
50
+ //# sourceMappingURL=DatePickerModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePickerModal.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePickerModal.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;AAEb,mDAA2E;AAC3E,+DAA2C;AAC3C,iCAA+B;AAC/B,uDAA6C;AAC7C,yFAA8D;AAC9D,qDAAkD;AAClD,2CAA+C;AAC/C,mCAA8D;AAE9D,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC;AAW9D,MAAM,eAAe,GAAG,CAAC,EAC9B,IAAI,EACJ,MAAM,EACN,UAAU,EACV,GAAG,EACH,GAAG,EACH,GAAG,GACkB,EAAE,EAAE;IACzB,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhD,IAAI,MAAM,IAAI,WAAW,EAAE;QACzB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;KAClD;IAED,MAAM,cAAc,GAAG,CAAC,YAAiC,EAAE,EAAE;QAC3D,IAAI,WAAW;YAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,CAAC,aAAa,CAAC,CAAC;QAC7D,UAAU,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,YAA8B,EAAE,EAAE;QAC/D,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,cAAc,CAAC,IAAA,uBAAe,EAAC,YAAY,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,IAAA,0BAAiB,EAAC,QAAQ,EAAE,GAAG,EAAE;QAC/B,IAAI,QAAQ,CAAC,OAAO,IAAI,MAAM,EAAE;YAC9B,cAAc,EAAE,CAAC;SAClB;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,IAAA,gBAAU,EAAC,wBAAwB,EAAE;QACxD,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IAEH,OAAO,CACL,uBAAC,sBAAS,cACR,iCACE,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,EAAE,GAAG,EAAE,sBACG,qBAAqB,iBAC1B,iBAAiB,aAE7B,uBAAC,uBAAc,cACb,gCAAK,EAAE,EAAC,qBAAqB,uDAEvB,GACS,EACjB,uBAAC,4BAAS,IACR,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAE,WAAW,EACzB,QAAQ,EAAE,qBAAqB,EAC/B,eAAe,QACf,eAAe,QACf,YAAY,EAAE,4BAAgB,EAC9B,UAAU,EAAE,EAAE,iBAAiB,EAAE,0BAAkB,EAAE,EACrD,UAAU,EAAE;wBACV,QAAQ,EAAE,+BAAc;wBACxB,SAAS,EAAE,+BAAc;qBAC1B,GACD,IACE,GACI,CACb,CAAC;AACJ,CAAC,CAAC;AAvEW,QAAA,eAAe,mBAuE1B"}