pixelize-design-library 2.2.43 → 2.2.45
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/dist/Components/DatePicker/CalendarPanel.d.ts +22 -0
- package/dist/Components/DatePicker/CalendarPanel.js +104 -0
- package/dist/Components/DatePicker/DatePicker.js +9 -120
- package/dist/Components/DatePicker/RangeDatePicker.d.ts +4 -0
- package/dist/Components/DatePicker/RangeDatePicker.js +205 -0
- package/dist/Components/DatePicker/SingleDatePicker.d.ts +4 -0
- package/dist/Components/DatePicker/SingleDatePicker.js +988 -0
- package/dist/Components/DatePicker/ThemeDatePicker.d.ts +4 -0
- package/dist/Components/DatePicker/ThemeDatePicker.js +43 -0
- package/dist/Components/DatePicker/TimeOnlyPicker.d.ts +4 -0
- package/dist/Components/DatePicker/TimeOnlyPicker.js +119 -0
- package/dist/Components/DatePicker/TimePickerInput.d.ts +12 -0
- package/dist/Components/DatePicker/TimePickerInput.js +362 -0
- package/dist/Components/NoteTextArea/NoteTextArea.d.ts +1 -1
- package/dist/Components/NoteTextArea/NoteTextArea.js +9 -9
- package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +1 -0
- package/dist/Components/Table/Components/HeaderActions.js +41 -9
- package/dist/Theme/Meadow/palette.js +17 -17
- package/dist/Theme/Radiant/palette.js +34 -34
- package/dist/Theme/Skyline/palette.js +17 -17
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type CalendarPanelProps = {
|
|
3
|
+
currentMonth: Date;
|
|
4
|
+
setCurrentMonth: (updater: (prev: Date) => Date) => void;
|
|
5
|
+
today: Date;
|
|
6
|
+
isRange: boolean;
|
|
7
|
+
tempDate: Date | null;
|
|
8
|
+
tempRangeStart: Date | null;
|
|
9
|
+
tempRangeEnd: Date | null;
|
|
10
|
+
isSameDay: (a: Date, b: Date) => boolean;
|
|
11
|
+
isBefore: (a: Date, b: Date) => boolean;
|
|
12
|
+
isAfter: (a: Date, b: Date) => boolean;
|
|
13
|
+
minDate?: Date;
|
|
14
|
+
maxDate?: Date;
|
|
15
|
+
disablePastDates?: boolean;
|
|
16
|
+
disableFutureDates?: boolean;
|
|
17
|
+
disableToday?: boolean;
|
|
18
|
+
onDaySelect: (d: Date) => void;
|
|
19
|
+
renderWeekdays?: React.ReactNode;
|
|
20
|
+
};
|
|
21
|
+
export declare const CalendarPanel: React.FC<CalendarPanelProps>;
|
|
22
|
+
export default CalendarPanel;
|
|
@@ -0,0 +1,104 @@
|
|
|
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.CalendarPanel = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var react_2 = require("@chakra-ui/react");
|
|
9
|
+
var date_fns_1 = require("date-fns");
|
|
10
|
+
var lucide_react_1 = require("lucide-react");
|
|
11
|
+
var Button_1 = __importDefault(require("../Button/Button"));
|
|
12
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
13
|
+
var CalendarPanel = function (_a) {
|
|
14
|
+
var currentMonth = _a.currentMonth, setCurrentMonth = _a.setCurrentMonth, today = _a.today, isRange = _a.isRange, tempDate = _a.tempDate, tempRangeStart = _a.tempRangeStart, tempRangeEnd = _a.tempRangeEnd, isSameDay = _a.isSameDay, isBefore = _a.isBefore, isAfter = _a.isAfter, minDate = _a.minDate, maxDate = _a.maxDate, disablePastDates = _a.disablePastDates, disableFutureDates = _a.disableFutureDates, disableToday = _a.disableToday, onDaySelect = _a.onDaySelect, renderWeekdays = _a.renderWeekdays;
|
|
15
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
16
|
+
var renderDays = function () {
|
|
17
|
+
var monthStart = (0, date_fns_1.startOfMonth)(currentMonth);
|
|
18
|
+
var monthEnd = (0, date_fns_1.endOfMonth)(currentMonth);
|
|
19
|
+
var startDate = (0, date_fns_1.startOfWeek)(monthStart);
|
|
20
|
+
var endDate = (0, date_fns_1.endOfWeek)(monthEnd);
|
|
21
|
+
var rows = [];
|
|
22
|
+
var day = startDate;
|
|
23
|
+
while (day <= endDate) {
|
|
24
|
+
var days = [];
|
|
25
|
+
var _loop_1 = function (i) {
|
|
26
|
+
var thisDay = day;
|
|
27
|
+
var isInCurrentMonth = thisDay.getMonth() === currentMonth.getMonth();
|
|
28
|
+
var isToday = isSameDay(thisDay, today);
|
|
29
|
+
var isStart = isRange && tempRangeStart && isSameDay(thisDay, tempRangeStart);
|
|
30
|
+
var isEnd = isRange && tempRangeEnd && isSameDay(thisDay, tempRangeEnd);
|
|
31
|
+
var isInRange = isRange &&
|
|
32
|
+
tempRangeStart &&
|
|
33
|
+
tempRangeEnd &&
|
|
34
|
+
isAfter(thisDay, tempRangeStart) &&
|
|
35
|
+
isBefore(thisDay, tempRangeEnd);
|
|
36
|
+
var isSelected = !isRange && tempDate && isSameDay(thisDay, tempDate);
|
|
37
|
+
var disabled = !isInCurrentMonth ||
|
|
38
|
+
(minDate && isBefore(thisDay, minDate)) ||
|
|
39
|
+
(maxDate && isAfter(thisDay, maxDate)) ||
|
|
40
|
+
(disablePastDates && isBefore(thisDay, today) && !isSameDay(thisDay, today)) ||
|
|
41
|
+
(disableFutureDates && isAfter(thisDay, today) && !isSameDay(thisDay, today)) ||
|
|
42
|
+
(disableToday && isToday);
|
|
43
|
+
days.push(react_1.default.createElement(Button_1.default, { key: thisDay.toString(), size: "sm", variant: isStart || isEnd || isSelected ? "solid" : isInRange ? "outline" : "ghost", colorScheme: isStart || isEnd || isInRange || isSelected ? "primary" : "gray", opacity: isInCurrentMonth ? 1 : 0.4, onClick: function () { return !disabled && onDaySelect(new Date(thisDay)); }, isDisabled: disabled, border: isToday ? "0.125rem solid ".concat(theme.colors.primary[500]) : undefined, borderRadius: "full" }, (0, date_fns_1.format)(thisDay, "d")));
|
|
44
|
+
day = (0, date_fns_1.addDays)(day, 1);
|
|
45
|
+
};
|
|
46
|
+
for (var i = 0; i < 7; i++) {
|
|
47
|
+
_loop_1(i);
|
|
48
|
+
}
|
|
49
|
+
rows.push(react_1.default.createElement(react_2.Grid, { key: day.toString(), templateColumns: "repeat(7, 1fr)", gap: 1 }, days));
|
|
50
|
+
}
|
|
51
|
+
return rows;
|
|
52
|
+
};
|
|
53
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
54
|
+
react_1.default.createElement(react_2.Box, { display: "flex", alignItems: "center", justifyContent: "space-between", mb: 4 },
|
|
55
|
+
react_1.default.createElement(Button_1.default, { variant: "ghost", size: "sm", onClick: function () { return setCurrentMonth(function (prev) { return new Date(prev.getFullYear(), prev.getMonth() - 1, 1); }); }, "aria-label": "Previous month" },
|
|
56
|
+
react_1.default.createElement(lucide_react_1.ChevronLeftIcon, { size: 20 })),
|
|
57
|
+
react_1.default.createElement(react_2.Box, { display: "flex", alignItems: "center", gap: 2 },
|
|
58
|
+
react_1.default.createElement(react_2.Box, { as: "select", value: currentMonth.getMonth(), onChange: function (e) {
|
|
59
|
+
var newMonth = parseInt(e.target.value, 10);
|
|
60
|
+
setCurrentMonth(function (prev) { return new Date(prev.getFullYear(), newMonth, 1); });
|
|
61
|
+
}, border: "1px solid", borderColor: "gray.300", borderRadius: "md", px: 2, py: 1, fontSize: "sm", fontWeight: "medium", cursor: "pointer", bg: "white", outline: "none", _hover: {
|
|
62
|
+
borderColor: "gray.400",
|
|
63
|
+
borderWidth: "1px",
|
|
64
|
+
borderStyle: "solid",
|
|
65
|
+
}, _focus: {
|
|
66
|
+
outline: "none",
|
|
67
|
+
borderColor: theme.colors.primary[500],
|
|
68
|
+
borderWidth: "1px",
|
|
69
|
+
borderStyle: "solid",
|
|
70
|
+
boxShadow: "0 0 0 1px ".concat(theme.colors.primary[500]),
|
|
71
|
+
}, style: {
|
|
72
|
+
border: "1px solid #CBD5E0",
|
|
73
|
+
WebkitAppearance: "menulist",
|
|
74
|
+
MozAppearance: "menulist",
|
|
75
|
+
appearance: "menulist",
|
|
76
|
+
} }, Array.from({ length: 12 }).map(function (_, i) { return (react_1.default.createElement("option", { key: i, value: i }, (0, date_fns_1.format)(new Date(2000, i, 1), "MMMM"))); })),
|
|
77
|
+
react_1.default.createElement(react_2.Box, { as: "select", value: currentMonth.getFullYear(), onChange: function (e) {
|
|
78
|
+
var newYear = parseInt(e.target.value, 10);
|
|
79
|
+
setCurrentMonth(function (prev) { return new Date(newYear, prev.getMonth(), 1); });
|
|
80
|
+
}, border: "1px solid", borderColor: "gray.300", borderRadius: "md", px: 2, py: 1, fontSize: "sm", fontWeight: "medium", cursor: "pointer", bg: "white", outline: "none", _hover: {
|
|
81
|
+
borderColor: "gray.400",
|
|
82
|
+
borderWidth: "1px",
|
|
83
|
+
borderStyle: "solid",
|
|
84
|
+
}, _focus: {
|
|
85
|
+
outline: "none",
|
|
86
|
+
borderColor: theme.colors.primary[500],
|
|
87
|
+
borderWidth: "1px",
|
|
88
|
+
borderStyle: "solid",
|
|
89
|
+
boxShadow: "0 0 0 1px ".concat(theme.colors.primary[500]),
|
|
90
|
+
}, style: {
|
|
91
|
+
border: "1px solid #CBD5E0",
|
|
92
|
+
WebkitAppearance: "menulist",
|
|
93
|
+
MozAppearance: "menulist",
|
|
94
|
+
appearance: "menulist",
|
|
95
|
+
} }, Array.from({ length: 100 }).map(function (_, i) {
|
|
96
|
+
var year = new Date().getFullYear() - 50 + i;
|
|
97
|
+
return (react_1.default.createElement("option", { key: year, value: year }, year));
|
|
98
|
+
}))),
|
|
99
|
+
react_1.default.createElement(Button_1.default, { variant: "ghost", size: "sm", onClick: function () { return setCurrentMonth(function (prev) { return new Date(prev.getFullYear(), prev.getMonth() + 1, 1); }); }, "aria-label": "Next month" },
|
|
100
|
+
react_1.default.createElement(lucide_react_1.ChevronRightIcon, { size: 20 }))), renderWeekdays !== null && renderWeekdays !== void 0 ? renderWeekdays : (react_1.default.createElement(react_2.Grid, { templateColumns: "repeat(7, 1fr)", gap: 1, fontWeight: "bold", mb: 2 }, ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map(function (day) { return (react_1.default.createElement(react_2.Box, { textAlign: "center", key: day, fontSize: "sm", color: "gray.600", py: 2 }, day)); }))),
|
|
101
|
+
renderDays()));
|
|
102
|
+
};
|
|
103
|
+
exports.CalendarPanel = CalendarPanel;
|
|
104
|
+
exports.default = exports.CalendarPanel;
|
|
@@ -55,7 +55,6 @@ function CustomDatePicker(props) {
|
|
|
55
55
|
var tomorrow = (0, date_fns_1.addDays)(today, 1);
|
|
56
56
|
var showDate = resolvedPickerType === "date" || resolvedPickerType === "datetime";
|
|
57
57
|
var showTime = resolvedPickerType === "time" || resolvedPickerType === "datetime";
|
|
58
|
-
var formatHasTime = dateFormat.toLowerCase().includes("hh") || dateFormat.toLowerCase().includes("mm") || dateFormat.toLowerCase().includes("ss");
|
|
59
58
|
var selectedDate = !isRange ? props.selectedDate : null;
|
|
60
59
|
// const [currentMonth, setCurrentMonth] = useState<Date>(
|
|
61
60
|
// isRange ? new Date() : selectedDate ?? new Date()
|
|
@@ -75,10 +74,7 @@ function CustomDatePicker(props) {
|
|
|
75
74
|
// );
|
|
76
75
|
var _m = (0, react_1.useState)(rangeStart), tempRangeStart = _m[0], setTempRangeStart = _m[1];
|
|
77
76
|
var _o = (0, react_1.useState)(rangeEnd), tempRangeEnd = _o[0], setTempRangeEnd = _o[1];
|
|
78
|
-
var _p = (0, react_1.useState)(""), inputValue = _p[0], setInputValue = _p[1];
|
|
79
|
-
var _q = (0, react_1.useState)(false), isTyping = _q[0], setIsTyping = _q[1];
|
|
80
77
|
var popoverRef = (0, react_1.useRef)(null);
|
|
81
|
-
var triggerRef = (0, react_1.useRef)(null);
|
|
82
78
|
var handleOpen = function () {
|
|
83
79
|
if (!isRange && !selectedDate) {
|
|
84
80
|
// setTempDate(new Date());
|
|
@@ -92,93 +88,6 @@ function CustomDatePicker(props) {
|
|
|
92
88
|
}
|
|
93
89
|
onOpen();
|
|
94
90
|
};
|
|
95
|
-
// Initialize input value based on selected date
|
|
96
|
-
(0, react_1.useEffect)(function () {
|
|
97
|
-
if (!isRange) {
|
|
98
|
-
if (selectedDate instanceof Date) {
|
|
99
|
-
setTempDate(new Date(selectedDate));
|
|
100
|
-
setInputValue((0, date_fns_1.format)(selectedDate, dateFormat));
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
setTempDate(null);
|
|
104
|
-
setInputValue("");
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}, [selectedDate, isRange, disableToday, dateFormat]);
|
|
108
|
-
var handleInputChange = function (e) {
|
|
109
|
-
var value = e.target.value;
|
|
110
|
-
setInputValue(value);
|
|
111
|
-
setIsTyping(true);
|
|
112
|
-
if (!value.trim()) {
|
|
113
|
-
setTempDate(null);
|
|
114
|
-
setTempRangeStart(null);
|
|
115
|
-
setTempRangeEnd(null);
|
|
116
|
-
setRangeStart(null);
|
|
117
|
-
setRangeEnd(null);
|
|
118
|
-
setSelectingStart(true);
|
|
119
|
-
props.onChange(null);
|
|
120
|
-
setIsTyping(false);
|
|
121
|
-
onClose();
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
var handleInputKeyDown = function (e) {
|
|
126
|
-
if (e.key === 'Enter') {
|
|
127
|
-
e.currentTarget.blur();
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
var handleInputFocus = function (e) {
|
|
131
|
-
e.stopPropagation();
|
|
132
|
-
setIsTyping(true);
|
|
133
|
-
if (!isOpen) {
|
|
134
|
-
onOpen();
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
var handleInputBlur = function () {
|
|
138
|
-
setIsTyping(false);
|
|
139
|
-
if (!inputValue.trim()) {
|
|
140
|
-
setTempDate(null);
|
|
141
|
-
props.onChange(null);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
try {
|
|
145
|
-
var parsed = (0, date_fns_1.parse)(inputValue, dateFormat, new Date());
|
|
146
|
-
if ((0, date_fns_1.isValid)(parsed)) {
|
|
147
|
-
var isValidDate = true;
|
|
148
|
-
if (minDate && (0, date_fns_1.isBefore)(parsed, minDate))
|
|
149
|
-
isValidDate = false;
|
|
150
|
-
if (maxDate && (0, date_fns_1.isAfter)(parsed, maxDate))
|
|
151
|
-
isValidDate = false;
|
|
152
|
-
if (disablePastDates && (0, date_fns_1.isBefore)(parsed, today) && !(0, date_fns_1.isSameDay)(parsed, today))
|
|
153
|
-
isValidDate = false;
|
|
154
|
-
if (disableFutureDates && (0, date_fns_1.isAfter)(parsed, today) && !(0, date_fns_1.isSameDay)(parsed, today))
|
|
155
|
-
isValidDate = false;
|
|
156
|
-
if (disableToday && (0, date_fns_1.isSameDay)(parsed, today))
|
|
157
|
-
isValidDate = false;
|
|
158
|
-
if (isValidDate) {
|
|
159
|
-
var finalDate = parsed;
|
|
160
|
-
// Only preserve previous time if the input format does NOT include time tokens
|
|
161
|
-
if (showTime && tempDate && !formatHasTime) {
|
|
162
|
-
finalDate = new Date(parsed.getFullYear(), parsed.getMonth(), parsed.getDate(), tempDate.getHours(), tempDate.getMinutes(), tempDate.getSeconds());
|
|
163
|
-
}
|
|
164
|
-
setTempDate(finalDate);
|
|
165
|
-
setCurrentMonth(finalDate);
|
|
166
|
-
setInputValue((0, date_fns_1.format)(finalDate, dateFormat));
|
|
167
|
-
props.onChange(finalDate);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
catch (_a) { }
|
|
173
|
-
if (tempDate) {
|
|
174
|
-
setInputValue((0, date_fns_1.format)(tempDate, dateFormat));
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
setInputValue("");
|
|
178
|
-
setTempDate(null);
|
|
179
|
-
props.onChange(null);
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
91
|
(0, react_1.useEffect)(function () {
|
|
183
92
|
if (!isRange) {
|
|
184
93
|
if (selectedDate instanceof Date) {
|
|
@@ -224,8 +133,6 @@ function CustomDatePicker(props) {
|
|
|
224
133
|
? new Date(updated.getFullYear(), updated.getMonth(), updated.getDate(), tempDate.getHours(), tempDate.getMinutes(), tempDate.getSeconds())
|
|
225
134
|
: updated;
|
|
226
135
|
setTempDate(updatedDate);
|
|
227
|
-
setInputValue((0, date_fns_1.format)(updatedDate, dateFormat));
|
|
228
|
-
setIsTyping(false);
|
|
229
136
|
props.onChange(updatedDate);
|
|
230
137
|
}
|
|
231
138
|
};
|
|
@@ -278,22 +185,17 @@ function CustomDatePicker(props) {
|
|
|
278
185
|
: tempRangeStart
|
|
279
186
|
? "".concat((0, date_fns_1.format)(tempRangeStart, dateFormat), " -")
|
|
280
187
|
: ""
|
|
281
|
-
:
|
|
282
|
-
?
|
|
283
|
-
:
|
|
284
|
-
? (0, date_fns_1.format)(tempDate, dateFormat)
|
|
285
|
-
: "";
|
|
188
|
+
: tempDate
|
|
189
|
+
? (0, date_fns_1.format)(tempDate, dateFormat)
|
|
190
|
+
: "";
|
|
286
191
|
(0, react_1.useEffect)(function () {
|
|
287
192
|
var handleClickOutside = function (event) {
|
|
288
|
-
var _a
|
|
193
|
+
var _a;
|
|
289
194
|
if (popoverRef.current &&
|
|
290
195
|
!popoverRef.current.contains(event.target) &&
|
|
291
|
-
!((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))
|
|
292
|
-
!((_b = triggerRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target))) {
|
|
196
|
+
!((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {
|
|
293
197
|
if (tempDate) {
|
|
294
198
|
props.onChange(tempDate); // add new
|
|
295
|
-
setInputValue((0, date_fns_1.format)(tempDate, dateFormat));
|
|
296
|
-
setIsTyping(false);
|
|
297
199
|
}
|
|
298
200
|
onClose();
|
|
299
201
|
}
|
|
@@ -307,22 +209,13 @@ function CustomDatePicker(props) {
|
|
|
307
209
|
return function () {
|
|
308
210
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
309
211
|
};
|
|
310
|
-
}, [isOpen, onClose
|
|
212
|
+
}, [isOpen, onClose]);
|
|
311
213
|
return (react_1.default.createElement(react_2.Box, { width: width, position: "relative" },
|
|
312
214
|
label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, isRequired: isRequired, isInformation: isInformation, informationMessage: informationMessage })),
|
|
313
|
-
react_1.default.createElement(react_2.Popover, { isLazy: true, isOpen: isOpen, onClose: onClose, placement: "bottom-start", initialFocusRef: inputRef, closeOnBlur:
|
|
215
|
+
react_1.default.createElement(react_2.Popover, { isLazy: true, isOpen: isOpen, onClose: onClose, placement: "bottom-start", initialFocusRef: inputRef, closeOnBlur: true },
|
|
314
216
|
react_1.default.createElement(react_2.PopoverTrigger, null,
|
|
315
|
-
react_1.default.createElement(react_2.Box, {
|
|
316
|
-
|
|
317
|
-
if (!isOpen) {
|
|
318
|
-
handleOpen();
|
|
319
|
-
}
|
|
320
|
-
}, onClick: function (e) {
|
|
321
|
-
// Prevent Chakra PopoverTrigger from toggling (which would immediately close after open)
|
|
322
|
-
e.preventDefault();
|
|
323
|
-
e.stopPropagation();
|
|
324
|
-
} },
|
|
325
|
-
react_1.default.createElement(TextInput_1.default, { id: id, name: name, ref: inputRef, placeholder: placeholderText, value: displayValue, onChange: !isRange ? handleInputChange : undefined, onKeyDown: !isRange ? handleInputKeyDown : undefined, onFocus: !isRange ? handleInputFocus : undefined, onBlur: !isRange ? handleInputBlur : undefined, isReadOnly: isRange, error: error, errorMessage: errorMessage, helperText: helperText, autoComplete: autoComplete, isDisabled: disabled, width: width }))),
|
|
217
|
+
react_1.default.createElement(react_2.Box, { onClick: handleOpen },
|
|
218
|
+
react_1.default.createElement(TextInput_1.default, { id: id, name: name, ref: inputRef, placeholder: placeholderText, value: displayValue, isReadOnly: true, error: error, errorMessage: errorMessage, helperText: helperText, autoComplete: autoComplete, isDisabled: disabled, width: width }))),
|
|
326
219
|
react_1.default.createElement(react_2.PopoverContent, { width: "auto", p: 2, ref: popoverRef },
|
|
327
220
|
react_1.default.createElement(react_2.PopoverBody, null,
|
|
328
221
|
showDate && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
@@ -360,8 +253,6 @@ function CustomDatePicker(props) {
|
|
|
360
253
|
// }}
|
|
361
254
|
onChange: function (updatedDate) {
|
|
362
255
|
setTempDate(updatedDate);
|
|
363
|
-
setInputValue((0, date_fns_1.format)(updatedDate, dateFormat));
|
|
364
|
-
setIsTyping(false);
|
|
365
256
|
props.onChange(updatedDate);
|
|
366
257
|
} })),
|
|
367
258
|
react_1.default.createElement(react_2.Box, { display: "flex", justifyContent: "space-between", mt: 3 },
|
|
@@ -385,8 +276,6 @@ function CustomDatePicker(props) {
|
|
|
385
276
|
}
|
|
386
277
|
else if (!isRange && tempDate) {
|
|
387
278
|
props.onChange(tempDate);
|
|
388
|
-
setInputValue((0, date_fns_1.format)(tempDate, dateFormat));
|
|
389
|
-
setIsTyping(false);
|
|
390
279
|
}
|
|
391
280
|
onClose();
|
|
392
281
|
} }, "OK")))))));
|
|
@@ -0,0 +1,205 @@
|
|
|
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.RangeDatePicker = void 0;
|
|
30
|
+
var react_1 = __importStar(require("react"));
|
|
31
|
+
var react_2 = require("@chakra-ui/react");
|
|
32
|
+
var date_fns_1 = require("date-fns");
|
|
33
|
+
var lucide_react_1 = require("lucide-react");
|
|
34
|
+
var Button_1 = __importDefault(require("../Button/Button"));
|
|
35
|
+
var FormLabel_1 = require("../Common/FormLabel");
|
|
36
|
+
var HelperText_1 = __importDefault(require("../Common/HelperText"));
|
|
37
|
+
var ErrorMessage_1 = __importDefault(require("../Common/ErrorMessage"));
|
|
38
|
+
var CalendarPanel_1 = __importDefault(require("./CalendarPanel"));
|
|
39
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
40
|
+
var TimePickerInput_1 = require("./TimePickerInput");
|
|
41
|
+
// helper to set time on date while preserving date part
|
|
42
|
+
var setTimeFrom = function (base, time) {
|
|
43
|
+
var b = base ? new Date(base) : new Date();
|
|
44
|
+
return new Date(b.getFullYear(), b.getMonth(), b.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), 0);
|
|
45
|
+
};
|
|
46
|
+
var RangeDatePicker = function (props) {
|
|
47
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
48
|
+
var id = props.id, name = props.name, label = props.label, isRequired = props.isRequired, isInformation = props.isInformation, informationMessage = props.informationMessage, error = props.error, errorMessage = props.errorMessage, helperText = props.helperText, placeholderText = props.placeholderText, _o = props.dateFormat, dateFormat = _o === void 0 ? "dd/MM/yyyy" : _o, minDate = props.minDate, maxDate = props.maxDate, disableFutureDates = props.disableFutureDates, disablePastDates = props.disablePastDates, _p = props.autoComplete, autoComplete = _p === void 0 ? "off" : _p, disabled = props.disabled, _q = props.width, width = _q === void 0 ? "100%" : _q, _r = props.disableToday, disableToday = _r === void 0 ? false : _r;
|
|
49
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
50
|
+
var _s = (0, react_2.useDisclosure)(), isOpen = _s.isOpen, onOpen = _s.onOpen, onClose = _s.onClose;
|
|
51
|
+
var inputRef = (0, react_1.useRef)(null);
|
|
52
|
+
var triggerRef = (0, react_1.useRef)(null);
|
|
53
|
+
var popoverRef = (0, react_1.useRef)(null);
|
|
54
|
+
var today = new Date();
|
|
55
|
+
var placeholder = (0, react_1.useMemo)(function () { return placeholderText || "".concat(dateFormat, " - ").concat(dateFormat); }, [placeholderText, dateFormat]);
|
|
56
|
+
var selectedRange = (_b = (_a = props.value) !== null && _a !== void 0 ? _a : props.selectedDate) !== null && _b !== void 0 ? _b : null;
|
|
57
|
+
var _t = (0, react_1.useState)(new Date()), currentMonth = _t[0], setCurrentMonthState = _t[1];
|
|
58
|
+
var _u = (0, react_1.useState)((_c = selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) !== null && _c !== void 0 ? _c : null), tempRangeStart = _u[0], setTempRangeStart = _u[1];
|
|
59
|
+
var _v = (0, react_1.useState)((_d = selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to) !== null && _d !== void 0 ? _d : null), tempRangeEnd = _v[0], setTempRangeEnd = _v[1];
|
|
60
|
+
var _w = (0, react_1.useState)(true), selectingStart = _w[0], setSelectingStart = _w[1];
|
|
61
|
+
var _x = (0, react_1.useState)(""), inputValue = _x[0], setInputValue = _x[1];
|
|
62
|
+
var formatHasTime = (0, react_1.useMemo)(function () {
|
|
63
|
+
var lower = dateFormat.toLowerCase();
|
|
64
|
+
return lower.includes("hh") || lower.includes("mm") || lower.includes("ss");
|
|
65
|
+
}, [dateFormat]);
|
|
66
|
+
(0, react_1.useEffect)(function () {
|
|
67
|
+
if ((selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) && (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to)) {
|
|
68
|
+
var start = new Date(selectedRange.from);
|
|
69
|
+
var end = new Date(selectedRange.to);
|
|
70
|
+
setTempRangeStart(start);
|
|
71
|
+
setTempRangeEnd(end);
|
|
72
|
+
setInputValue("".concat((0, date_fns_1.format)(start, dateFormat), " - ").concat((0, date_fns_1.format)(end, dateFormat)));
|
|
73
|
+
setCurrentMonthState(start);
|
|
74
|
+
}
|
|
75
|
+
else if (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) {
|
|
76
|
+
var start = new Date(selectedRange.from);
|
|
77
|
+
setTempRangeStart(start);
|
|
78
|
+
setTempRangeEnd(null);
|
|
79
|
+
setInputValue("".concat((0, date_fns_1.format)(start, dateFormat), " -"));
|
|
80
|
+
setCurrentMonthState(start);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
setTempRangeStart(null);
|
|
84
|
+
setTempRangeEnd(null);
|
|
85
|
+
setInputValue("");
|
|
86
|
+
}
|
|
87
|
+
}, [selectedRange, dateFormat]);
|
|
88
|
+
var commitValue = function (value) {
|
|
89
|
+
props.onChange(value);
|
|
90
|
+
};
|
|
91
|
+
var finalize = function () {
|
|
92
|
+
if (tempRangeStart && tempRangeEnd) {
|
|
93
|
+
setInputValue("".concat((0, date_fns_1.format)(tempRangeStart, dateFormat), " - ").concat((0, date_fns_1.format)(tempRangeEnd, dateFormat)));
|
|
94
|
+
commitValue({ from: tempRangeStart, to: tempRangeEnd });
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
var requestClose = function () {
|
|
98
|
+
finalize();
|
|
99
|
+
onClose();
|
|
100
|
+
};
|
|
101
|
+
var handleOpen = function () {
|
|
102
|
+
onOpen();
|
|
103
|
+
};
|
|
104
|
+
var handleDaySelect = function (day) {
|
|
105
|
+
var updated = new Date(day);
|
|
106
|
+
if (selectingStart) {
|
|
107
|
+
setTempRangeStart(updated);
|
|
108
|
+
setTempRangeEnd(null);
|
|
109
|
+
setSelectingStart(false);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
var finalStart = tempRangeStart && updated < tempRangeStart ? updated : tempRangeStart !== null && tempRangeStart !== void 0 ? tempRangeStart : updated;
|
|
113
|
+
var finalEnd = tempRangeStart && updated < tempRangeStart ? tempRangeStart : updated;
|
|
114
|
+
setTempRangeStart(finalStart);
|
|
115
|
+
setTempRangeEnd(finalEnd);
|
|
116
|
+
setSelectingStart(true);
|
|
117
|
+
// no auto-close; wait for OK
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
(0, react_1.useEffect)(function () {
|
|
121
|
+
if (!isOpen)
|
|
122
|
+
return;
|
|
123
|
+
var handleMouseDownOutside = function (event) {
|
|
124
|
+
var target = event.target;
|
|
125
|
+
var inputEl = inputRef.current;
|
|
126
|
+
var triggerEl = triggerRef.current;
|
|
127
|
+
var popoverEl = popoverRef.current;
|
|
128
|
+
var insideInput = !!inputEl && inputEl.contains(target);
|
|
129
|
+
var insideTrigger = !!triggerEl && triggerEl.contains(target);
|
|
130
|
+
var insidePopover = !!popoverEl && popoverEl.contains(target);
|
|
131
|
+
if (!insideInput && !insideTrigger && !insidePopover) {
|
|
132
|
+
onClose();
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
document.addEventListener("mousedown", handleMouseDownOutside, true);
|
|
136
|
+
return function () { return document.removeEventListener("mousedown", handleMouseDownOutside, true); };
|
|
137
|
+
}, [isOpen, onClose]);
|
|
138
|
+
var handleClear = function () {
|
|
139
|
+
setTempRangeStart(null);
|
|
140
|
+
setTempRangeEnd(null);
|
|
141
|
+
setSelectingStart(true);
|
|
142
|
+
setInputValue("");
|
|
143
|
+
props.onChange(null);
|
|
144
|
+
};
|
|
145
|
+
var displayValue = (0, react_1.useMemo)(function () {
|
|
146
|
+
if (inputValue)
|
|
147
|
+
return inputValue;
|
|
148
|
+
if (tempRangeStart && tempRangeEnd)
|
|
149
|
+
return "".concat((0, date_fns_1.format)(tempRangeStart, dateFormat), " - ").concat((0, date_fns_1.format)(tempRangeEnd, dateFormat));
|
|
150
|
+
if (tempRangeStart)
|
|
151
|
+
return "".concat((0, date_fns_1.format)(tempRangeStart, dateFormat), " -");
|
|
152
|
+
return "";
|
|
153
|
+
}, [inputValue, tempRangeStart, tempRangeEnd, dateFormat]);
|
|
154
|
+
return (react_1.default.createElement(react_2.FormControl, { id: id, isInvalid: error, isRequired: isRequired, isDisabled: disabled, width: width },
|
|
155
|
+
label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, isRequired: isRequired, isInformation: isInformation, informationMessage: informationMessage })),
|
|
156
|
+
react_1.default.createElement(react_2.Popover, { isLazy: true, isOpen: isOpen, onClose: finalize, placement: "bottom-start", closeOnBlur: false, returnFocusOnClose: false },
|
|
157
|
+
react_1.default.createElement(react_2.PopoverTrigger, null,
|
|
158
|
+
react_1.default.createElement(react_2.Box, { ref: triggerRef, as: "div" },
|
|
159
|
+
react_1.default.createElement(react_2.InputGroup, null,
|
|
160
|
+
react_1.default.createElement(react_2.Input, { ref: inputRef, id: id, name: name, placeholder: placeholder, value: displayValue, readOnly: true, isDisabled: disabled, autoComplete: autoComplete, onFocus: function () {
|
|
161
|
+
if (!isOpen)
|
|
162
|
+
handleOpen();
|
|
163
|
+
}, onClick: function () {
|
|
164
|
+
if (!isOpen)
|
|
165
|
+
handleOpen();
|
|
166
|
+
}, borderColor: error ? (_f = (_e = theme.colors.semantic) === null || _e === void 0 ? void 0 : _e.error) === null || _f === void 0 ? void 0 : _f[500] : undefined, _focus: {
|
|
167
|
+
borderColor: error ? (_h = (_g = theme.colors.semantic) === null || _g === void 0 ? void 0 : _g.error) === null || _h === void 0 ? void 0 : _h[500] : theme.colors.primary[500],
|
|
168
|
+
boxShadow: error
|
|
169
|
+
? "0 0 0 1px ".concat((_k = (_j = theme.colors.semantic) === null || _j === void 0 ? void 0 : _j.error) === null || _k === void 0 ? void 0 : _k[500])
|
|
170
|
+
: "0 0 0 1px ".concat(theme.colors.primary[500]),
|
|
171
|
+
}, _hover: {
|
|
172
|
+
borderColor: error ? (_m = (_l = theme.colors.semantic) === null || _l === void 0 ? void 0 : _l.error) === null || _m === void 0 ? void 0 : _m[500] : undefined,
|
|
173
|
+
}, cursor: "pointer" }),
|
|
174
|
+
react_1.default.createElement(react_2.InputRightElement, { pr: 3, pointerEvents: "auto", style: { cursor: "pointer" }, onClick: function () { return (isOpen ? onClose() : handleOpen()); } },
|
|
175
|
+
react_1.default.createElement(lucide_react_1.CalendarIcon, { size: 18, color: theme.colors.gray[500] }))))),
|
|
176
|
+
react_1.default.createElement(react_2.PopoverContent, { width: "auto", p: 4, ref: popoverRef, boxShadow: "lg" },
|
|
177
|
+
react_1.default.createElement(react_2.PopoverBody, null,
|
|
178
|
+
react_1.default.createElement(CalendarPanel_1.default, { currentMonth: currentMonth, setCurrentMonth: function (updater) { return setCurrentMonthState(function (prev) { return updater(prev); }); }, today: today, isRange: true, tempDate: null, tempRangeStart: tempRangeStart, tempRangeEnd: tempRangeEnd, isSameDay: date_fns_1.isSameDay, isBefore: date_fns_1.isBefore, isAfter: date_fns_1.isAfter, minDate: minDate, maxDate: maxDate, disablePastDates: disablePastDates, disableFutureDates: disableFutureDates, disableToday: disableToday, onDaySelect: handleDaySelect }),
|
|
179
|
+
formatHasTime && (react_1.default.createElement(react_2.Box, { mt: 4, display: "grid", gridTemplateColumns: "1fr 1fr", gap: 3 },
|
|
180
|
+
react_1.default.createElement(react_2.Box, null,
|
|
181
|
+
react_1.default.createElement(react_2.Box, { fontSize: "sm", color: "gray.600", mb: 1 }, "Start time"),
|
|
182
|
+
react_1.default.createElement(TimePickerInput_1.TimePickerInput, { value: tempRangeStart, onChange: function (t) {
|
|
183
|
+
if (!t) {
|
|
184
|
+
setTempRangeStart(null);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
setTempRangeStart(setTimeFrom(tempRangeStart, t));
|
|
188
|
+
}, dateFormat: dateFormat.includes("HH") || dateFormat.includes("hh") ? "HH:mm" : "hh:mm a", disabled: disabled })),
|
|
189
|
+
react_1.default.createElement(react_2.Box, null,
|
|
190
|
+
react_1.default.createElement(react_2.Box, { fontSize: "sm", color: "gray.600", mb: 1 }, "End time"),
|
|
191
|
+
react_1.default.createElement(TimePickerInput_1.TimePickerInput, { value: tempRangeEnd, onChange: function (t) {
|
|
192
|
+
if (!t) {
|
|
193
|
+
setTempRangeEnd(null);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
setTempRangeEnd(setTimeFrom(tempRangeEnd, t));
|
|
197
|
+
}, dateFormat: dateFormat.includes("HH") || dateFormat.includes("hh") ? "HH:mm" : "hh:mm a", disabled: disabled })))),
|
|
198
|
+
react_1.default.createElement(react_2.Box, { display: "flex", justifyContent: "space-between", mt: 4, pt: 4, borderTop: "1px solid", borderColor: "gray.200" },
|
|
199
|
+
react_1.default.createElement(Button_1.default, { size: "sm", variant: "ghost", onClick: handleClear }, "Clear"),
|
|
200
|
+
react_1.default.createElement(Button_1.default, { size: "sm", colorScheme: "primary", onClick: requestClose }, "OK"))))),
|
|
201
|
+
error && errorMessage && react_1.default.createElement(ErrorMessage_1.default, { errorMessage: errorMessage }),
|
|
202
|
+
helperText && !error && react_1.default.createElement(HelperText_1.default, { helperText: helperText })));
|
|
203
|
+
};
|
|
204
|
+
exports.RangeDatePicker = RangeDatePicker;
|
|
205
|
+
exports.default = exports.RangeDatePicker;
|