@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.
- package/CHANGELOG.md +15 -2
- package/dist/cjs/components/DatePicker/DatePicker.d.ts +8 -6
- package/dist/cjs/components/DatePicker/DatePicker.js +98 -40
- package/dist/cjs/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.stories.d.ts +22 -4
- package/dist/cjs/components/DatePicker/DatePicker.stories.js +60 -13
- package/dist/cjs/components/DatePicker/DatePicker.stories.js.map +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.test.js +89 -5
- package/dist/cjs/components/DatePicker/DatePicker.test.js.map +1 -1
- package/dist/cjs/components/DatePicker/DatePickerIcon.d.ts +1 -0
- package/dist/cjs/components/DatePicker/DatePickerIcon.js +7 -0
- package/dist/cjs/components/DatePicker/DatePickerIcon.js.map +1 -0
- package/dist/cjs/components/DatePicker/DatePickerModal.d.ts +9 -0
- package/dist/cjs/components/DatePicker/DatePickerModal.js +50 -0
- package/dist/cjs/components/DatePicker/DatePickerModal.js.map +1 -0
- package/dist/cjs/components/DatePicker/DatePickerModal.test.d.ts +1 -0
- package/dist/cjs/components/DatePicker/DatePickerModal.test.js +102 -0
- package/dist/cjs/components/DatePicker/DatePickerModal.test.js.map +1 -0
- package/dist/cjs/components/DatePicker/constants.d.ts +2 -0
- package/dist/cjs/components/DatePicker/constants.js +7 -0
- package/dist/cjs/components/DatePicker/constants.js.map +1 -0
- package/dist/cjs/components/DatePicker/index.d.ts +0 -1
- package/dist/cjs/components/DatePicker/index.js +0 -3
- package/dist/cjs/components/DatePicker/index.js.map +1 -1
- package/dist/cjs/components/DatePicker/utils/dateObjToString.d.ts +1 -0
- package/dist/cjs/components/DatePicker/utils/dateObjToString.js +7 -0
- package/dist/cjs/components/DatePicker/utils/dateObjToString.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/dateObjToString.test.d.ts +1 -0
- package/dist/cjs/components/DatePicker/utils/dateObjToString.test.js +15 -0
- package/dist/cjs/components/DatePicker/utils/dateObjToString.test.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.d.ts +2 -0
- package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.js +19 -0
- package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.test.d.ts +1 -0
- package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.test.js +35 -0
- package/dist/cjs/components/DatePicker/utils/formatErrorMessageText.test.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/index.d.ts +4 -0
- package/dist/cjs/components/DatePicker/utils/index.js +21 -0
- package/dist/cjs/components/DatePicker/utils/index.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/validateDateFormat.d.ts +2 -0
- package/dist/cjs/components/DatePicker/utils/validateDateFormat.js +17 -0
- package/dist/cjs/components/DatePicker/utils/validateDateFormat.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/validateDateFormat.test.d.ts +1 -0
- package/dist/cjs/components/DatePicker/utils/validateDateFormat.test.js +26 -0
- package/dist/cjs/components/DatePicker/utils/validateDateFormat.test.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.d.ts +2 -0
- package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.js +14 -0
- package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.js.map +1 -0
- package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.test.d.ts +1 -0
- package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.test.js +23 -0
- package/dist/cjs/components/DatePicker/utils/weekdayAsOneLetter.test.js.map +1 -0
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.js +18 -0
- package/dist/cjs/hooks/index.js.map +1 -0
- package/dist/cjs/hooks/useFocusTrap/index.d.ts +1 -0
- package/dist/cjs/hooks/useFocusTrap/index.js +18 -0
- package/dist/cjs/hooks/useFocusTrap/index.js.map +1 -0
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.d.ts +5 -0
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.js +41 -0
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.js.map +1 -0
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.test.d.ts +1 -0
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.test.js +65 -0
- package/dist/cjs/hooks/useFocusTrap/useFocusTrap.test.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils/excludeControls.d.ts +1 -0
- package/dist/cjs/utils/excludeControls.js +29 -0
- package/dist/cjs/utils/excludeControls.js.map +1 -0
- package/dist/cjs/utils/excludeControls.test.d.ts +1 -0
- package/dist/cjs/utils/excludeControls.test.js +25 -0
- package/dist/cjs/utils/excludeControls.test.js.map +1 -0
- package/dist/cjs/utils/isTouchDevice.d.ts +1 -0
- package/dist/cjs/utils/isTouchDevice.js +11 -0
- package/dist/cjs/utils/isTouchDevice.js.map +1 -0
- package/dist/esm/components/DatePicker/DatePicker.js +99 -41
- package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/DatePickerIcon.js +3 -0
- package/dist/esm/components/DatePicker/DatePickerIcon.js.map +1 -0
- package/dist/esm/components/DatePicker/DatePickerModal.js +43 -0
- package/dist/esm/components/DatePicker/DatePickerModal.js.map +1 -0
- package/dist/esm/components/DatePicker/constants.js +4 -0
- package/dist/esm/components/DatePicker/constants.js.map +1 -0
- package/dist/esm/components/DatePicker/index.js +0 -1
- package/dist/esm/components/DatePicker/index.js.map +1 -1
- package/dist/esm/components/DatePicker/utils/dateObjToString.js +3 -0
- package/dist/esm/components/DatePicker/utils/dateObjToString.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/dateObjToString.test.js +13 -0
- package/dist/esm/components/DatePicker/utils/dateObjToString.test.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/formatErrorMessageText.js +15 -0
- package/dist/esm/components/DatePicker/utils/formatErrorMessageText.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/formatErrorMessageText.test.js +33 -0
- package/dist/esm/components/DatePicker/utils/formatErrorMessageText.test.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/index.js +5 -0
- package/dist/esm/components/DatePicker/utils/index.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/validateDateFormat.js +13 -0
- package/dist/esm/components/DatePicker/utils/validateDateFormat.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/validateDateFormat.test.js +24 -0
- package/dist/esm/components/DatePicker/utils/validateDateFormat.test.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.js +10 -0
- package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.js.map +1 -0
- package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.test.js +21 -0
- package/dist/esm/components/DatePicker/utils/weekdayAsOneLetter.test.js.map +1 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/index.js.map +1 -0
- package/dist/esm/hooks/useFocusTrap/index.js +2 -0
- package/dist/esm/hooks/useFocusTrap/index.js.map +1 -0
- package/dist/esm/hooks/useFocusTrap/useFocusTrap.js +38 -0
- package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/utils/excludeControls.js +25 -0
- package/dist/esm/utils/excludeControls.js.map +1 -0
- package/dist/esm/utils/excludeControls.test.js +23 -0
- package/dist/esm/utils/excludeControls.test.js.map +1 -0
- package/dist/esm/utils/isTouchDevice.js +7 -0
- package/dist/esm/utils/isTouchDevice.js.map +1 -0
- package/package.json +26 -40
- package/src/components/DatePicker/DatePicker.mdx +79 -426
- package/src/components/DatePicker/DatePicker.stories.tsx +79 -16
- package/src/components/DatePicker/DatePicker.test.tsx +144 -11
- package/src/components/DatePicker/DatePicker.tsx +160 -82
- package/src/components/DatePicker/DatePickerIcon.tsx +1 -0
- package/src/components/DatePicker/DatePickerModal.test.tsx +162 -0
- package/src/components/DatePicker/DatePickerModal.tsx +94 -0
- package/src/components/DatePicker/constants.ts +4 -0
- package/src/components/DatePicker/index.tsx +0 -1
- package/src/components/DatePicker/utils/dateObjToString.test.ts +17 -0
- package/src/components/DatePicker/utils/dateObjToString.ts +3 -0
- package/src/components/DatePicker/utils/formatErrorMessageText.test.ts +48 -0
- package/src/components/DatePicker/utils/formatErrorMessageText.ts +23 -0
- package/src/components/DatePicker/utils/index.ts +4 -0
- package/src/components/DatePicker/utils/validateDateFormat.test.ts +31 -0
- package/src/components/DatePicker/utils/validateDateFormat.ts +18 -0
- package/src/components/DatePicker/utils/weekdayAsOneLetter.test.ts +28 -0
- package/src/components/DatePicker/utils/weekdayAsOneLetter.ts +11 -0
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useFocusTrap/index.tsx +1 -0
- package/src/hooks/useFocusTrap/useFocusTrap.test.tsx +72 -0
- package/src/hooks/useFocusTrap/useFocusTrap.tsx +56 -0
- package/src/utils/excludeControls.test.ts +26 -0
- package/src/utils/excludeControls.ts +28 -0
- package/src/utils/isTouchDevice.ts +7 -0
- package/dist/cjs/components/DatePicker/Calendar.d.ts +0 -5
- package/dist/cjs/components/DatePicker/Calendar.js +0 -21
- package/dist/cjs/components/DatePicker/Calendar.js.map +0 -1
- package/dist/cjs/components/DatePicker/CalendarButton.d.ts +0 -13
- package/dist/cjs/components/DatePicker/CalendarButton.js +0 -29
- package/dist/cjs/components/DatePicker/CalendarButton.js.map +0 -1
- package/dist/cjs/components/DatePicker/CalendarCell.d.ts +0 -6
- package/dist/cjs/components/DatePicker/CalendarCell.js +0 -27
- package/dist/cjs/components/DatePicker/CalendarCell.js.map +0 -1
- package/dist/cjs/components/DatePicker/CalendarGrid.d.ts +0 -7
- package/dist/cjs/components/DatePicker/CalendarGrid.js +0 -35
- package/dist/cjs/components/DatePicker/CalendarGrid.js.map +0 -1
- package/dist/cjs/components/DatePicker/DateField.d.ts +0 -6
- package/dist/cjs/components/DatePicker/DateField.js +0 -38
- package/dist/cjs/components/DatePicker/DateField.js.map +0 -1
- package/dist/cjs/components/DatePicker/DateSegment.d.ts +0 -6
- package/dist/cjs/components/DatePicker/DateSegment.js +0 -25
- package/dist/cjs/components/DatePicker/DateSegment.js.map +0 -1
- package/dist/cjs/components/DatePicker/Popover.d.ts +0 -8
- package/dist/cjs/components/DatePicker/Popover.js +0 -49
- package/dist/cjs/components/DatePicker/Popover.js.map +0 -1
- package/dist/esm/components/DatePicker/Calendar.js +0 -17
- package/dist/esm/components/DatePicker/Calendar.js.map +0 -1
- package/dist/esm/components/DatePicker/CalendarButton.js +0 -23
- package/dist/esm/components/DatePicker/CalendarButton.js.map +0 -1
- package/dist/esm/components/DatePicker/CalendarCell.js +0 -20
- package/dist/esm/components/DatePicker/CalendarCell.js.map +0 -1
- package/dist/esm/components/DatePicker/CalendarGrid.js +0 -31
- package/dist/esm/components/DatePicker/CalendarGrid.js.map +0 -1
- package/dist/esm/components/DatePicker/DateField.js +0 -34
- package/dist/esm/components/DatePicker/DateField.js.map +0 -1
- package/dist/esm/components/DatePicker/DateSegment.js +0 -18
- package/dist/esm/components/DatePicker/DateSegment.js.map +0 -1
- package/dist/esm/components/DatePicker/Popover.js +0 -45
- package/dist/esm/components/DatePicker/Popover.js.map +0 -1
- package/src/components/DatePicker/Calendar.tsx +0 -48
- package/src/components/DatePicker/CalendarButton.tsx +0 -58
- package/src/components/DatePicker/CalendarCell.tsx +0 -48
- package/src/components/DatePicker/CalendarGrid.tsx +0 -60
- package/src/components/DatePicker/DateField.tsx +0 -45
- package/src/components/DatePicker/DateSegment.tsx +0 -34
- 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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
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
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"--is-
|
|
40
|
-
|
|
41
|
-
});
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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:
|
|
5
|
+
component: (props: DatePickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
6
|
argTypes: {
|
|
7
|
-
|
|
7
|
+
validationState: {
|
|
8
|
+
options: string[];
|
|
8
9
|
control: {
|
|
9
10
|
type: string;
|
|
10
11
|
};
|
|
11
|
-
|
|
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
|
|
6
|
-
const
|
|
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
|
-
|
|
13
|
-
control: { type: "
|
|
14
|
-
|
|
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) => (
|
|
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
|
-
|
|
25
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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":"
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|