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.
@@ -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
- : isTyping
282
- ? inputValue
283
- : tempDate
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, _b;
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, props, tempDate]);
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: false },
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, { ref: triggerRef, onMouseDown: function (e) {
316
- e.stopPropagation();
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,4 @@
1
+ import React from "react";
2
+ import { RangeDatePickerProps } from "./DatePickerProps";
3
+ export declare const RangeDatePicker: React.FC<RangeDatePickerProps>;
4
+ export default RangeDatePicker;
@@ -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;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { SingleDatePickerProps } from "./DatePickerProps";
3
+ export declare const SingleDatePicker: React.FC<SingleDatePickerProps>;
4
+ export default SingleDatePicker;