@conveyorhq/arrow-ds 1.157.0 → 1.159.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.
- package/package.json +1 -1
- package/public/components/DateRangePicker/DateRangePicker.d.ts +1 -22
- package/public/components/DateRangePicker/DateRangePicker.js +30 -39
- package/public/components/DateRangePicker/DateRangePickerLegacy.d.ts +3 -0
- package/public/components/DateRangePicker/DateRangePickerLegacy.js +186 -0
- package/public/components/DateRangePicker/index.d.ts +2 -0
- package/public/components/DateRangePicker/index.js +2 -0
- package/public/components/DateRangePicker/types.d.ts +29 -0
- package/public/components/DateRangePicker/types.js +2 -0
- package/public/components/DateRangePicker/utils.d.ts +13 -0
- package/public/components/DateRangePicker/utils.js +32 -0
- package/public/css/styles.css +9 -0
- package/public/css/styles.min.css +1 -1
- package/public/css/styles.min.css.map +1 -1
- package/src/components/DateRangePicker/DateRangePicker.stories.mdx +10 -13
- package/src/components/DateRangePicker/DateRangePicker.tsx +28 -120
- package/src/components/DateRangePicker/DateRangePickerLegacy.tsx +303 -0
- package/src/components/DateRangePicker/index.css +8 -0
- package/src/components/DateRangePicker/index.ts +2 -0
- package/src/components/DateRangePicker/types.ts +76 -0
- package/src/components/DateRangePicker/utils.tsx +47 -0
package/package.json
CHANGED
|
@@ -1,24 +1,3 @@
|
|
|
1
1
|
import { FC } from "react";
|
|
2
|
-
|
|
3
|
-
startDate: Date;
|
|
4
|
-
endDate: Date;
|
|
5
|
-
}
|
|
6
|
-
export interface DateRangePickerPreset {
|
|
7
|
-
name: string;
|
|
8
|
-
startDate: Date;
|
|
9
|
-
endDate: Date;
|
|
10
|
-
}
|
|
11
|
-
export type DateRangePickerValue = DateRangePickerValueWithDates | null | DateRangePickerPreset;
|
|
12
|
-
export interface DateRangePickerProps {
|
|
13
|
-
value: DateRangePickerPreset;
|
|
14
|
-
onChange: (newValue: DateRangePickerPreset) => void;
|
|
15
|
-
presets: DateRangePickerPreset[];
|
|
16
|
-
align?: "left" | "right";
|
|
17
|
-
minDate?: Date;
|
|
18
|
-
maxDate?: Date;
|
|
19
|
-
className?: string;
|
|
20
|
-
onCustomChange: () => void;
|
|
21
|
-
onSave: (newValue: DateRangePickerPreset) => void;
|
|
22
|
-
disabled?: boolean;
|
|
23
|
-
}
|
|
2
|
+
import { DateRangePickerProps } from "./types";
|
|
24
3
|
export declare const DateRangePicker: FC<DateRangePickerProps>;
|
|
@@ -31,7 +31,6 @@ const react_1 = __importStar(require("react"));
|
|
|
31
31
|
const classnames_1 = __importDefault(require("classnames"));
|
|
32
32
|
const date_fns_1 = require("date-fns");
|
|
33
33
|
const Box_1 = require("../Box");
|
|
34
|
-
const bem_1 = require("../../utilities/bem");
|
|
35
34
|
const Button_1 = require("../Button");
|
|
36
35
|
const MenuRenderer_1 = require("../MenuRenderer");
|
|
37
36
|
const PopoverMenu_1 = require("../PopoverMenu");
|
|
@@ -42,19 +41,7 @@ const CustomDateRangeInput_1 = require("./CustomDateRangeInput");
|
|
|
42
41
|
const utilities_1 = require("../../utilities");
|
|
43
42
|
const DatePicker_1 = require("../DatePicker");
|
|
44
43
|
const isValidDate_1 = require("../../utilities/isValidDate");
|
|
45
|
-
const
|
|
46
|
-
const RangePickerPreset = ({ isSelected, children, onClick, }) => {
|
|
47
|
-
const classes = (0, classnames_1.default)(cn({ e: "preset" }), isSelected && cn({ e: "preset", m: "isSelected" }));
|
|
48
|
-
return (react_1.default.createElement("button", { type: "button", className: classes, onClick: onClick }, children));
|
|
49
|
-
};
|
|
50
|
-
const CUSTOM_PRESET = "Custom";
|
|
51
|
-
const focusInput = (ref) => {
|
|
52
|
-
const input = ref.current;
|
|
53
|
-
const { activeElement } = document;
|
|
54
|
-
if (input && input !== activeElement) {
|
|
55
|
-
input.focus();
|
|
56
|
-
}
|
|
57
|
-
};
|
|
44
|
+
const utils_1 = require("./utils");
|
|
58
45
|
const DateRangePicker = ({ className, onChange, align = "left", presets, value, minDate, maxDate, onCustomChange, onSave, disabled, ...rest }) => {
|
|
59
46
|
const placement = align === "left" ? "bottom-start" : "bottom-end";
|
|
60
47
|
const [customStartDateInputVal, setCustomStartDateInputVal,] = (0, react_1.useState)("");
|
|
@@ -67,9 +54,10 @@ const DateRangePicker = ({ className, onChange, align = "left", presets, value,
|
|
|
67
54
|
const handleClose = () => {
|
|
68
55
|
setCustomStartDateError("");
|
|
69
56
|
};
|
|
70
|
-
const [
|
|
57
|
+
const [selectedPresetName, setSelectedPresetName] = (0, react_1.useState)(value.name);
|
|
58
|
+
const [currentPresetName, setCurrentPresetName] = (0, react_1.useState)(value.name);
|
|
71
59
|
(0, react_1.useEffect)(() => {
|
|
72
|
-
|
|
60
|
+
setSelectedPresetName(value.name);
|
|
73
61
|
setCustomStartDateInputVal(value.startDate ? (0, date_fns_1.format)(value.startDate, utilities_1.DATE_FORMAT) : "");
|
|
74
62
|
setCustomEndDateInputVal(value.endDate ? (0, date_fns_1.format)(value.endDate, utilities_1.DATE_FORMAT) : "");
|
|
75
63
|
}, [value]);
|
|
@@ -81,13 +69,13 @@ const DateRangePicker = ({ className, onChange, align = "left", presets, value,
|
|
|
81
69
|
const displayText = (0, react_1.useMemo)(() => {
|
|
82
70
|
if (!value)
|
|
83
71
|
return "Select Date Range";
|
|
84
|
-
return
|
|
85
|
-
}, [
|
|
72
|
+
return currentPresetName;
|
|
73
|
+
}, [currentPresetName, value]);
|
|
86
74
|
(0, react_1.useEffect)(() => {
|
|
87
75
|
if (customDateInputsValid)
|
|
88
76
|
return;
|
|
89
77
|
const inputToFocus = customSelectingWhichDate === "start" ? startInput : endInput;
|
|
90
|
-
|
|
78
|
+
(0, utils_1.dateRangePickerFocusInput)(inputToFocus);
|
|
91
79
|
}, [customSelectingWhichDate, customDateInputsValid]);
|
|
92
80
|
const validDates = (0, react_1.useMemo)(() => {
|
|
93
81
|
let start = null;
|
|
@@ -126,7 +114,7 @@ const DateRangePicker = ({ className, onChange, align = "left", presets, value,
|
|
|
126
114
|
}, [customStartDateInputVal, customEndDateInputVal, minDate, maxDate]);
|
|
127
115
|
const handleDatePickerChange = ([newStartDate, newEndDate]) => {
|
|
128
116
|
if (!newEndDate)
|
|
129
|
-
|
|
117
|
+
(0, utils_1.dateRangePickerFocusInput)(endInput);
|
|
130
118
|
const newStartString = newStartDate
|
|
131
119
|
? (0, date_fns_1.format)(newStartDate, utilities_1.DATE_FORMAT)
|
|
132
120
|
: "";
|
|
@@ -143,36 +131,38 @@ const DateRangePicker = ({ className, onChange, align = "left", presets, value,
|
|
|
143
131
|
!validDates.end ||
|
|
144
132
|
!!customStartDateError ||
|
|
145
133
|
!!customEndDateError;
|
|
146
|
-
return (react_1.default.createElement(MenuRenderer_1.MenuRenderer, { className: (0, classnames_1.default)(cn(), className), placement: placement, onClose: handleClose, hasPortal: true, trigger: (triggerProps) => (react_1.default.createElement(Button_1.Button, { variant: Button_1.BUTTON_VARIANT.SECONDARY, icon: Icon_1.ICON_TYPE.CARET_DOWN, iconPosition: Button_1.BUTTON_ICON_POSITION.RIGHT, className: cn({ e: "trigger" }), disabled: disabled, ...triggerProps },
|
|
147
|
-
react_1.default.createElement(Flex_1.Flex, { className: cn({ e: "trigger-inner" }) },
|
|
148
|
-
react_1.default.createElement(Icon_1.Icon, { icon: Icon_1.ICON_TYPE.CALENDAR, className: cn({ e: "trigger-icon" }) }),
|
|
134
|
+
return (react_1.default.createElement(MenuRenderer_1.MenuRenderer, { className: (0, classnames_1.default)((0, utils_1.cn)(), className), placement: placement, onClose: handleClose, hasPortal: true, trigger: (triggerProps) => (react_1.default.createElement(Button_1.Button, { variant: Button_1.BUTTON_VARIANT.SECONDARY, icon: Icon_1.ICON_TYPE.CARET_DOWN, iconPosition: Button_1.BUTTON_ICON_POSITION.RIGHT, className: (0, utils_1.cn)({ e: "custom-trigger" }), disabled: disabled, ...triggerProps },
|
|
135
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "trigger-inner" }) },
|
|
136
|
+
react_1.default.createElement(Icon_1.Icon, { icon: Icon_1.ICON_TYPE.CALENDAR, className: (0, utils_1.cn)({ e: "trigger-icon" }) }),
|
|
149
137
|
" ",
|
|
150
|
-
react_1.default.createElement(Text_1.Text, { as: "span", className: cn({ e: "trigger-text" }) }, displayText)))), ...rest }, ({ listProps, onClose }) => (react_1.default.createElement(PopoverMenu_1.PopoverMenu, { ...listProps },
|
|
151
|
-
react_1.default.createElement(Flex_1.Flex, { className: cn({
|
|
138
|
+
react_1.default.createElement(Text_1.Text, { as: "span", className: (0, utils_1.cn)({ e: "custom-trigger-text" }) }, displayText)))), ...rest }, ({ listProps, onClose }) => (react_1.default.createElement(PopoverMenu_1.PopoverMenu, { ...listProps },
|
|
139
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({
|
|
152
140
|
e: "popover-inner-wrapper",
|
|
153
141
|
m: `${align}Aligned`,
|
|
154
142
|
}) },
|
|
155
|
-
react_1.default.createElement(Flex_1.Flex, { className: cn({ e: "presets-wrapper" }) },
|
|
156
|
-
presets.map((p) => (react_1.default.createElement(RangePickerPreset, { key: p.name, onClick: () => {
|
|
143
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "presets-wrapper" }) },
|
|
144
|
+
presets.map((p) => (react_1.default.createElement(utils_1.RangePickerPreset, { key: p.name, onClick: () => {
|
|
157
145
|
onChange(p);
|
|
158
|
-
|
|
146
|
+
setSelectedPresetName(p.name);
|
|
159
147
|
setCustomStartDateInputVal((0, date_fns_1.format)(p.startDate, utilities_1.DATE_FORMAT));
|
|
160
148
|
setCustomEndDateInputVal((0, date_fns_1.format)(p.endDate, utilities_1.DATE_FORMAT));
|
|
161
|
-
}, isSelected: p.name ===
|
|
162
|
-
react_1.default.createElement(RangePickerPreset, { onClick: () => {
|
|
149
|
+
}, isSelected: p.name === selectedPresetName }, p.name))),
|
|
150
|
+
react_1.default.createElement(utils_1.RangePickerPreset, { onClick: () => {
|
|
163
151
|
onCustomChange();
|
|
164
|
-
|
|
152
|
+
setSelectedPresetName(utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET);
|
|
165
153
|
setCustomStartDateInputVal("");
|
|
166
154
|
setCustomEndDateInputVal("");
|
|
167
|
-
}, isSelected:
|
|
168
|
-
react_1.default.createElement(Box_1.Box, { className: (0, classnames_1.default)(cn({ e: "custom-wrapper" }), cn({ e: "custom-wrapper", m: `${align}Aligned` })) },
|
|
169
|
-
react_1.default.createElement(Flex_1.Flex, { className: cn({ e: "custom-date-inputs-wrapper" }) },
|
|
155
|
+
}, isSelected: selectedPresetName === utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET }, "Custom")),
|
|
156
|
+
react_1.default.createElement(Box_1.Box, { className: (0, classnames_1.default)((0, utils_1.cn)({ e: "custom-wrapper" }), (0, utils_1.cn)({ e: "custom-wrapper", m: `${align}Aligned` })) },
|
|
157
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "custom-date-inputs-wrapper" }) },
|
|
170
158
|
react_1.default.createElement(CustomDateRangeInput_1.CustomDateRangeInput, { ref: startInput, value: customStartDateInputVal, setValue: setCustomStartDateInputVal, error: customStartDateError, setError: setCustomStartDateError, ariaLabel: "Start Date", onFocus: () => setCustomSelectingWhichDate("start") }),
|
|
171
|
-
react_1.default.createElement(Text_1.Text, { as: "span", className: cn({ e: "custom-dates-to" }) }, "to"),
|
|
159
|
+
react_1.default.createElement(Text_1.Text, { as: "span", className: (0, utils_1.cn)({ e: "custom-dates-to" }) }, "to"),
|
|
172
160
|
react_1.default.createElement(CustomDateRangeInput_1.CustomDateRangeInput, { ref: endInput, value: customEndDateInputVal, setValue: setCustomEndDateInputVal, error: customEndDateError, setError: setCustomEndDateError, ariaLabel: "End Date", onFocus: () => setCustomSelectingWhichDate("end") })),
|
|
173
|
-
react_1.default.createElement(Box_1.Box, { className: cn({ e: "custom-date-calendars-wrapper" }) },
|
|
174
|
-
react_1.default.createElement(DatePicker_1.DatePicker, { monthsShown: 2, inline: true, onChange: handleDatePickerChange, onSelect: handleDatePickerSelect, selectsRange: true, selected: validDates.start, startDate: validDates.start, endDate: validDates.end, minDate: minDate, maxDate: maxDate, openToDate:
|
|
175
|
-
|
|
161
|
+
react_1.default.createElement(Box_1.Box, { className: (0, utils_1.cn)({ e: "custom-date-calendars-wrapper" }) },
|
|
162
|
+
react_1.default.createElement(DatePicker_1.DatePicker, { monthsShown: 2, inline: true, onChange: handleDatePickerChange, onSelect: handleDatePickerSelect, selectsRange: true, selected: validDates.start, startDate: validDates.start, endDate: validDates.end, minDate: minDate, maxDate: maxDate, openToDate: selectedPresetName === utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET
|
|
163
|
+
? new Date()
|
|
164
|
+
: undefined })),
|
|
165
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "custom-date-footer" }) },
|
|
176
166
|
react_1.default.createElement(Button_1.Button, { variant: Button_1.BUTTON_VARIANT.SECONDARY, onClick: () => {
|
|
177
167
|
if (onClose) {
|
|
178
168
|
onClose();
|
|
@@ -185,7 +175,8 @@ const DateRangePicker = ({ className, onChange, align = "left", presets, value,
|
|
|
185
175
|
const startDate = (0, utilities_1.parseDate)(customStartDateInputVal);
|
|
186
176
|
const endDate = (0, utilities_1.parseDate)(customEndDateInputVal);
|
|
187
177
|
if (startDate && endDate) {
|
|
188
|
-
|
|
178
|
+
setCurrentPresetName(selectedPresetName);
|
|
179
|
+
onSave({ name: selectedPresetName, startDate, endDate });
|
|
189
180
|
}
|
|
190
181
|
} }, "Apply"))))))));
|
|
191
182
|
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.DateRangePickerLegacy = void 0;
|
|
30
|
+
const react_1 = __importStar(require("react"));
|
|
31
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
32
|
+
const date_fns_1 = require("date-fns");
|
|
33
|
+
const Box_1 = require("../Box");
|
|
34
|
+
const Button_1 = require("../Button");
|
|
35
|
+
const MenuRenderer_1 = require("../MenuRenderer");
|
|
36
|
+
const PopoverMenu_1 = require("../PopoverMenu");
|
|
37
|
+
const Icon_1 = require("../Icon");
|
|
38
|
+
const Flex_1 = require("../Flex");
|
|
39
|
+
const Text_1 = require("../Text");
|
|
40
|
+
const CustomDateRangeInput_1 = require("./CustomDateRangeInput");
|
|
41
|
+
const utilities_1 = require("../../utilities");
|
|
42
|
+
const DatePicker_1 = require("../DatePicker");
|
|
43
|
+
const isValidDate_1 = require("../../utilities/isValidDate");
|
|
44
|
+
const utils_1 = require("./utils");
|
|
45
|
+
const DateRangePickerLegacy = ({ className, onChange, align = "left", presets, value, minDate, maxDate, ...rest }) => {
|
|
46
|
+
const placement = align === "left" ? "bottom-start" : "bottom-end";
|
|
47
|
+
const [selectingCustomDate, setSelectingCustomDate] = (0, react_1.useState)(!(0, utils_1.getMatchingDateRangePickerPreset)(value, presets) && value !== null);
|
|
48
|
+
const [customStartDateInputVal, setCustomStartDateInputVal,] = (0, react_1.useState)("");
|
|
49
|
+
const [customStartDateError, setCustomStartDateError] = (0, react_1.useState)("");
|
|
50
|
+
const [customEndDateInputVal, setCustomEndDateInputVal] = (0, react_1.useState)("");
|
|
51
|
+
const [customEndDateError, setCustomEndDateError] = (0, react_1.useState)("");
|
|
52
|
+
const [customSelectingWhichDate, setCustomSelectingWhichDate] = (0, react_1.useState)("start");
|
|
53
|
+
const startInput = (0, react_1.useRef)(null);
|
|
54
|
+
const endInput = (0, react_1.useRef)(null);
|
|
55
|
+
const handleClose = () => {
|
|
56
|
+
setCustomStartDateError("");
|
|
57
|
+
if (selectingCustomDate && value && "name" in value) {
|
|
58
|
+
setSelectingCustomDate(false);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const selectedPreset = (0, react_1.useMemo)(() => {
|
|
62
|
+
if (!value)
|
|
63
|
+
return null;
|
|
64
|
+
if (selectingCustomDate)
|
|
65
|
+
return utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET;
|
|
66
|
+
const matchingPreset = (0, utils_1.getMatchingDateRangePickerPreset)(value, presets);
|
|
67
|
+
return matchingPreset
|
|
68
|
+
? matchingPreset.name
|
|
69
|
+
: utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET;
|
|
70
|
+
}, [presets, value, selectingCustomDate]);
|
|
71
|
+
const customDateInputsValid = (0, react_1.useMemo)(() => {
|
|
72
|
+
const parsedStart = (0, utilities_1.parseDate)(customStartDateInputVal);
|
|
73
|
+
const parsedEnd = (0, utilities_1.parseDate)(customEndDateInputVal);
|
|
74
|
+
return !!(parsedStart && parsedEnd);
|
|
75
|
+
}, [customStartDateInputVal, customEndDateInputVal]);
|
|
76
|
+
const displayText = (0, react_1.useMemo)(() => {
|
|
77
|
+
if (!value)
|
|
78
|
+
return "Select Date Range";
|
|
79
|
+
const matchingPreset = (0, utils_1.getMatchingDateRangePickerPreset)(value, presets);
|
|
80
|
+
if (selectingCustomDate && matchingPreset)
|
|
81
|
+
return utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET;
|
|
82
|
+
return selectedPreset === utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET
|
|
83
|
+
? `${(0, date_fns_1.format)(value.startDate, utilities_1.DATE_FORMAT)} to ${(0, date_fns_1.format)(value.endDate, utilities_1.DATE_FORMAT)}`
|
|
84
|
+
: selectedPreset;
|
|
85
|
+
}, [selectedPreset, value, selectingCustomDate, presets]);
|
|
86
|
+
(0, react_1.useEffect)(() => {
|
|
87
|
+
if (!selectingCustomDate || customDateInputsValid)
|
|
88
|
+
return;
|
|
89
|
+
const inputToFocus = customSelectingWhichDate === "start" ? startInput : endInput;
|
|
90
|
+
(0, utils_1.dateRangePickerFocusInput)(inputToFocus);
|
|
91
|
+
}, [customSelectingWhichDate, selectingCustomDate, customDateInputsValid]);
|
|
92
|
+
const validDates = (0, react_1.useMemo)(() => {
|
|
93
|
+
let start = null;
|
|
94
|
+
let end = null;
|
|
95
|
+
if (customStartDateInputVal) {
|
|
96
|
+
const parsed = (0, date_fns_1.parse)(customStartDateInputVal, utilities_1.DATE_FORMAT, new Date());
|
|
97
|
+
start = (0, isValidDate_1.isValidDate)(parsed) ? parsed : null;
|
|
98
|
+
}
|
|
99
|
+
if (customEndDateInputVal) {
|
|
100
|
+
const parsed = (0, date_fns_1.parse)(customEndDateInputVal, utilities_1.DATE_FORMAT, new Date());
|
|
101
|
+
end = (0, isValidDate_1.isValidDate)(parsed) ? parsed : null;
|
|
102
|
+
}
|
|
103
|
+
if (start &&
|
|
104
|
+
((minDate && (0, date_fns_1.isBefore)(start, minDate)) ||
|
|
105
|
+
(maxDate && (0, date_fns_1.isAfter)(start, maxDate)))) {
|
|
106
|
+
setCustomStartDateError("Outside allowed date range");
|
|
107
|
+
start = null;
|
|
108
|
+
}
|
|
109
|
+
if (end &&
|
|
110
|
+
((minDate && (0, date_fns_1.isBefore)(end, minDate)) ||
|
|
111
|
+
(maxDate && (0, date_fns_1.isAfter)(end, maxDate)))) {
|
|
112
|
+
setCustomEndDateError("Outside allowed date range");
|
|
113
|
+
end = null;
|
|
114
|
+
}
|
|
115
|
+
if (start && end && (0, date_fns_1.isAfter)(start, end)) {
|
|
116
|
+
setCustomEndDateError("End date cannot be before start date");
|
|
117
|
+
end = null;
|
|
118
|
+
}
|
|
119
|
+
if (start) {
|
|
120
|
+
setCustomStartDateError("");
|
|
121
|
+
}
|
|
122
|
+
if (end) {
|
|
123
|
+
setCustomEndDateError("");
|
|
124
|
+
}
|
|
125
|
+
return { start, end };
|
|
126
|
+
}, [customStartDateInputVal, customEndDateInputVal, minDate, maxDate]);
|
|
127
|
+
const handleDatePickerChange = ([newStartDate, newEndDate]) => {
|
|
128
|
+
if (!newEndDate)
|
|
129
|
+
(0, utils_1.dateRangePickerFocusInput)(endInput);
|
|
130
|
+
const newStartString = newStartDate
|
|
131
|
+
? (0, date_fns_1.format)(newStartDate, utilities_1.DATE_FORMAT)
|
|
132
|
+
: "";
|
|
133
|
+
const newEndString = newEndDate ? (0, date_fns_1.format)(newEndDate, utilities_1.DATE_FORMAT) : "";
|
|
134
|
+
setCustomStartDateInputVal(newStartString);
|
|
135
|
+
setCustomEndDateInputVal(newEndString);
|
|
136
|
+
};
|
|
137
|
+
const handleDatePickerSelect = (date) => {
|
|
138
|
+
if (!validDates.start && validDates.end) {
|
|
139
|
+
setCustomStartDateInputVal((0, date_fns_1.format)(date, utilities_1.DATE_FORMAT));
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const customApplyBtnDisabled = !validDates.start ||
|
|
143
|
+
!validDates.end ||
|
|
144
|
+
!!customStartDateError ||
|
|
145
|
+
!!customEndDateError;
|
|
146
|
+
return (react_1.default.createElement(MenuRenderer_1.MenuRenderer, { className: (0, classnames_1.default)((0, utils_1.cn)(), className), placement: placement, onClose: handleClose, hasPortal: true, trigger: (triggerProps) => (react_1.default.createElement(Button_1.Button, { variant: Button_1.BUTTON_VARIANT.SECONDARY, icon: Icon_1.ICON_TYPE.CARET_DOWN, iconPosition: Button_1.BUTTON_ICON_POSITION.RIGHT, className: (0, utils_1.cn)({ e: "trigger" }), ...triggerProps },
|
|
147
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "trigger-inner" }) },
|
|
148
|
+
react_1.default.createElement(Icon_1.Icon, { icon: Icon_1.ICON_TYPE.CALENDAR, className: (0, utils_1.cn)({ e: "trigger-icon" }) }),
|
|
149
|
+
" ",
|
|
150
|
+
react_1.default.createElement(Text_1.Text, { as: "span", className: (0, utils_1.cn)({ e: "trigger-text" }) }, displayText)))), ...rest }, ({ listProps, onClose }) => (react_1.default.createElement(PopoverMenu_1.PopoverMenu, { ...listProps },
|
|
151
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({
|
|
152
|
+
e: "popover-inner-wrapper",
|
|
153
|
+
m: `${align}Aligned`,
|
|
154
|
+
}) },
|
|
155
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "presets-wrapper" }) },
|
|
156
|
+
presets.map((p) => (react_1.default.createElement(utils_1.RangePickerPreset, { key: p.name, onClick: () => {
|
|
157
|
+
onChange(p);
|
|
158
|
+
if (onClose) {
|
|
159
|
+
onClose();
|
|
160
|
+
}
|
|
161
|
+
}, isSelected: p.name === selectedPreset }, p.name))),
|
|
162
|
+
react_1.default.createElement(utils_1.RangePickerPreset, { onClick: () => {
|
|
163
|
+
if (selectingCustomDate)
|
|
164
|
+
return;
|
|
165
|
+
setSelectingCustomDate(true);
|
|
166
|
+
}, isSelected: selectedPreset === utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET }, "Custom")),
|
|
167
|
+
selectedPreset === utils_1.DATE_RANGE_PICKER_CUSTOM_PRESET ? (react_1.default.createElement(Box_1.Box, { className: (0, classnames_1.default)((0, utils_1.cn)({ e: "custom-wrapper" }), (0, utils_1.cn)({ e: "custom-wrapper", m: `${align}Aligned` })) },
|
|
168
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "custom-date-inputs-wrapper" }) },
|
|
169
|
+
react_1.default.createElement(CustomDateRangeInput_1.CustomDateRangeInput, { ref: startInput, value: customStartDateInputVal, setValue: setCustomStartDateInputVal, error: customStartDateError, setError: setCustomStartDateError, ariaLabel: "Start Date", onFocus: () => setCustomSelectingWhichDate("start") }),
|
|
170
|
+
react_1.default.createElement(Text_1.Text, { as: "span", className: (0, utils_1.cn)({ e: "custom-dates-to" }) }, "to"),
|
|
171
|
+
react_1.default.createElement(CustomDateRangeInput_1.CustomDateRangeInput, { ref: endInput, value: customEndDateInputVal, setValue: setCustomEndDateInputVal, error: customEndDateError, setError: setCustomEndDateError, ariaLabel: "End Date", onFocus: () => setCustomSelectingWhichDate("end") })),
|
|
172
|
+
react_1.default.createElement(Box_1.Box, { className: (0, utils_1.cn)({ e: "custom-date-calendars-wrapper" }) },
|
|
173
|
+
react_1.default.createElement(DatePicker_1.DatePicker, { monthsShown: 2, inline: true, onChange: handleDatePickerChange, onSelect: handleDatePickerSelect, selectsRange: true, selected: validDates.start, startDate: validDates.start, endDate: validDates.end, minDate: minDate, maxDate: maxDate })),
|
|
174
|
+
react_1.default.createElement(Flex_1.Flex, { className: (0, utils_1.cn)({ e: "custom-date-footer" }) },
|
|
175
|
+
react_1.default.createElement(Button_1.Button, { disabled: customApplyBtnDisabled, onClick: () => {
|
|
176
|
+
if (onClose) {
|
|
177
|
+
onClose();
|
|
178
|
+
}
|
|
179
|
+
const startDate = (0, utilities_1.parseDate)(customStartDateInputVal);
|
|
180
|
+
const endDate = (0, utilities_1.parseDate)(customEndDateInputVal);
|
|
181
|
+
if (startDate && endDate) {
|
|
182
|
+
onChange({ startDate, endDate });
|
|
183
|
+
}
|
|
184
|
+
} }, "Apply")))) : null)))));
|
|
185
|
+
};
|
|
186
|
+
exports.DateRangePickerLegacy = DateRangePickerLegacy;
|
|
@@ -14,4 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./DateRangePickerLegacy"), exports);
|
|
17
19
|
__exportStar(require("./DateRangePicker"), exports);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface DateRangePickerValueWithDates {
|
|
2
|
+
startDate: Date;
|
|
3
|
+
endDate: Date;
|
|
4
|
+
}
|
|
5
|
+
export interface DateRangePickerPreset {
|
|
6
|
+
name: string;
|
|
7
|
+
startDate: Date;
|
|
8
|
+
endDate: Date;
|
|
9
|
+
}
|
|
10
|
+
export type DateRangePickerValue = DateRangePickerValueWithDates | null | DateRangePickerPreset;
|
|
11
|
+
interface SharedDateRangePickerProps {
|
|
12
|
+
presets: DateRangePickerPreset[];
|
|
13
|
+
align?: "left" | "right";
|
|
14
|
+
minDate?: Date;
|
|
15
|
+
maxDate?: Date;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DateRangePickerLegacyProps extends SharedDateRangePickerProps {
|
|
19
|
+
value: DateRangePickerValue;
|
|
20
|
+
onChange: (newValue: DateRangePickerValue) => void;
|
|
21
|
+
}
|
|
22
|
+
export interface DateRangePickerProps extends SharedDateRangePickerProps {
|
|
23
|
+
value: DateRangePickerPreset;
|
|
24
|
+
onChange: (newValue: DateRangePickerPreset) => void;
|
|
25
|
+
onCustomChange: () => void;
|
|
26
|
+
onSave: (newValue: DateRangePickerPreset) => void;
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React, { ReactNode, RefObject } from "react";
|
|
2
|
+
import { DateRangePickerPreset, DateRangePickerValue } from "./types";
|
|
3
|
+
export declare const cn: (options?: import("../../utilities/bem").BemOptions | undefined) => string;
|
|
4
|
+
interface DateRangePickerPresetProps {
|
|
5
|
+
isSelected: boolean;
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
onClick: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const RangePickerPreset: ({ isSelected, children, onClick, }: DateRangePickerPresetProps) => React.JSX.Element;
|
|
10
|
+
export declare const DATE_RANGE_PICKER_CUSTOM_PRESET = "Custom";
|
|
11
|
+
export declare const getMatchingDateRangePickerPreset: (value: DateRangePickerValue, presets: DateRangePickerPreset[]) => DateRangePickerPreset | null | undefined;
|
|
12
|
+
export declare const dateRangePickerFocusInput: (ref: RefObject<HTMLInputElement>) => void;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.dateRangePickerFocusInput = exports.getMatchingDateRangePickerPreset = exports.DATE_RANGE_PICKER_CUSTOM_PRESET = exports.RangePickerPreset = exports.cn = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
9
|
+
const bem_1 = require("../../utilities/bem");
|
|
10
|
+
const Heading_1 = require("../Heading");
|
|
11
|
+
exports.cn = (0, bem_1.bemHOF)("DateRangePicker");
|
|
12
|
+
const RangePickerPreset = ({ isSelected, children, onClick, }) => {
|
|
13
|
+
const classes = (0, classnames_1.default)((0, exports.cn)({ e: "preset" }), isSelected && (0, exports.cn)({ e: "preset", m: "isSelected" }));
|
|
14
|
+
return (react_1.default.createElement("button", { type: "button", className: classes, onClick: onClick },
|
|
15
|
+
react_1.default.createElement(Heading_1.Heading.H4, null, children)));
|
|
16
|
+
};
|
|
17
|
+
exports.RangePickerPreset = RangePickerPreset;
|
|
18
|
+
exports.DATE_RANGE_PICKER_CUSTOM_PRESET = "Custom";
|
|
19
|
+
const getMatchingDateRangePickerPreset = (value, presets) => {
|
|
20
|
+
if (!value || !("name" in value))
|
|
21
|
+
return null;
|
|
22
|
+
return presets.find((p) => p.name === value.name);
|
|
23
|
+
};
|
|
24
|
+
exports.getMatchingDateRangePickerPreset = getMatchingDateRangePickerPreset;
|
|
25
|
+
const dateRangePickerFocusInput = (ref) => {
|
|
26
|
+
const input = ref.current;
|
|
27
|
+
const { activeElement } = document;
|
|
28
|
+
if (input && input !== activeElement) {
|
|
29
|
+
input.focus();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.dateRangePickerFocusInput = dateRangePickerFocusInput;
|
package/public/css/styles.css
CHANGED
|
@@ -3699,6 +3699,10 @@ override built-in Image component classes */
|
|
|
3699
3699
|
}
|
|
3700
3700
|
|
|
3701
3701
|
.ads-DateRangePicker-trigger {
|
|
3702
|
+
width: 224px;
|
|
3703
|
+
}
|
|
3704
|
+
|
|
3705
|
+
.ads-DateRangePicker-custom-trigger {
|
|
3702
3706
|
width: 144px;
|
|
3703
3707
|
}
|
|
3704
3708
|
|
|
@@ -3711,6 +3715,11 @@ override built-in Image component classes */
|
|
|
3711
3715
|
}
|
|
3712
3716
|
|
|
3713
3717
|
.ads-DateRangePicker-trigger-text {
|
|
3718
|
+
width: 160px;
|
|
3719
|
+
text-align: left;
|
|
3720
|
+
}
|
|
3721
|
+
|
|
3722
|
+
.ads-DateRangePicker-custom-trigger-text {
|
|
3714
3723
|
width: 80px;
|
|
3715
3724
|
text-align: left;
|
|
3716
3725
|
}
|