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,4 @@
1
+ import React from "react";
2
+ import { DatePickerProps } from "./DatePickerProps";
3
+ declare const ThemeDatePicker: React.FC<DatePickerProps>;
4
+ export default ThemeDatePicker;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var react_1 = __importDefault(require("react"));
18
+ var RangeDatePicker_1 = require("./RangeDatePicker");
19
+ var SingleDatePicker_1 = require("./SingleDatePicker");
20
+ var TimeOnlyPicker_1 = require("./TimeOnlyPicker");
21
+ var inferPickerTypeFromFormat = function (formatStr) {
22
+ var lower = formatStr.toLowerCase();
23
+ var hasTime = lower.includes("hh") || lower.includes("mm") || lower.includes("ss");
24
+ var hasDate = lower.includes("d") && lower.includes("m") && lower.includes("y");
25
+ if (hasTime && hasDate)
26
+ return "datetime";
27
+ if (hasTime)
28
+ return "time";
29
+ return "date";
30
+ };
31
+ var ThemeDatePicker = function (props) {
32
+ var _a, _b;
33
+ if (props.isRange) {
34
+ return react_1.default.createElement(RangeDatePicker_1.RangeDatePicker, __assign({}, props));
35
+ }
36
+ var dateFormat = (_a = props.dateFormat) !== null && _a !== void 0 ? _a : "dd/MM/yyyy";
37
+ var pickerType = (_b = props.pickerType) !== null && _b !== void 0 ? _b : inferPickerTypeFromFormat(dateFormat);
38
+ if (pickerType === "time") {
39
+ return react_1.default.createElement(TimeOnlyPicker_1.TimeOnlyPicker, __assign({}, props));
40
+ }
41
+ return react_1.default.createElement(SingleDatePicker_1.SingleDatePicker, __assign({}, props));
42
+ };
43
+ exports.default = ThemeDatePicker;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { SingleDatePickerProps } from "./DatePickerProps";
3
+ export declare const TimeOnlyPicker: React.FC<SingleDatePickerProps>;
4
+ export default TimeOnlyPicker;
@@ -0,0 +1,119 @@
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.TimeOnlyPicker = 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 useCustomTheme_1 = require("../../Theme/useCustomTheme");
34
+ var FormLabel_1 = require("../Common/FormLabel");
35
+ var HelperText_1 = __importDefault(require("../Common/HelperText"));
36
+ var ErrorMessage_1 = __importDefault(require("../Common/ErrorMessage"));
37
+ var TimePicker_1 = __importDefault(require("./TimePicker"));
38
+ var TimePickerInput_1 = require("./TimePickerInput");
39
+ var formatToPlaceholder = function (formatStr) {
40
+ return formatStr.replace(/h{1,2}/gi, "HH").replace(/m{1,2}/gi, "mm").replace(/a{1,2}/gi, "AM");
41
+ };
42
+ var TimeOnlyPicker = function (props) {
43
+ var _a;
44
+ 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, _b = props.dateFormat, dateFormat = _b === void 0 ? "HH:mm" : _b, _c = props.autoComplete, autoComplete = _c === void 0 ? "off" : _c, disabled = props.disabled, _d = props.width, width = _d === void 0 ? "100%" : _d, _e = props.disableToday, disableToday = _e === void 0 ? false : _e;
45
+ var theme = (0, useCustomTheme_1.useCustomTheme)();
46
+ var _f = (0, react_2.useDisclosure)(), isOpen = _f.isOpen, onOpen = _f.onOpen, onClose = _f.onClose;
47
+ var popoverRef = (0, react_1.useRef)(null);
48
+ var triggerRef = (0, react_1.useRef)(null);
49
+ var inputWrapperRef = (0, react_1.useRef)(null);
50
+ var today = new Date();
51
+ var tomorrow = (0, date_fns_1.addDays)(today, 1);
52
+ var selectedDate = ((_a = props.value) !== null && _a !== void 0 ? _a : props.selectedDate);
53
+ var _g = (0, react_1.useState)(selectedDate ? new Date(selectedDate) : null), tempDate = _g[0], setTempDate = _g[1];
54
+ (0, react_1.useEffect)(function () {
55
+ setTempDate(selectedDate ? new Date(selectedDate) : null);
56
+ }, [selectedDate]);
57
+ var placeholder = (0, react_1.useMemo)(function () { return placeholderText || formatToPlaceholder(dateFormat); }, [placeholderText, dateFormat]);
58
+ var handleTimeInputChange = function (date) {
59
+ setTempDate(date);
60
+ props.onChange(date);
61
+ };
62
+ var handleTimePickerChange = function (date) {
63
+ setTempDate(date);
64
+ props.onChange(date);
65
+ };
66
+ var handleClear = function () {
67
+ setTempDate(null);
68
+ props.onChange(null);
69
+ // Do not close; user asked only outside-click and OK to close
70
+ };
71
+ var handleOk = function () {
72
+ onClose();
73
+ };
74
+ (0, react_1.useEffect)(function () {
75
+ if (!isOpen)
76
+ return;
77
+ var handleMouseDownOutside = function (event) {
78
+ var target = event.target;
79
+ var inputEl = inputWrapperRef.current;
80
+ var triggerEl = triggerRef.current;
81
+ var popoverEl = popoverRef.current;
82
+ var insideInput = !!inputEl && inputEl.contains(target);
83
+ var insideTrigger = !!triggerEl && triggerEl.contains(target);
84
+ var insidePopover = !!popoverEl && popoverEl.contains(target);
85
+ if (!insideInput && !insideTrigger && !insidePopover) {
86
+ onClose();
87
+ }
88
+ };
89
+ document.addEventListener("mousedown", handleMouseDownOutside, true);
90
+ return function () {
91
+ document.removeEventListener("mousedown", handleMouseDownOutside, true);
92
+ };
93
+ }, [isOpen, onClose]);
94
+ var resolvedTempDate = tempDate !== null && tempDate !== void 0 ? tempDate : new Date((disableToday ? tomorrow : today).getFullYear(), (disableToday ? tomorrow : today).getMonth(), (disableToday ? tomorrow : today).getDate(), 0, 0, 0, 0);
95
+ return (react_1.default.createElement(react_2.FormControl, { id: id, isInvalid: error, isRequired: isRequired, isDisabled: disabled, width: width },
96
+ label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, isRequired: isRequired, isInformation: isInformation, informationMessage: informationMessage })),
97
+ react_1.default.createElement(react_2.Popover, { isLazy: true, isOpen: isOpen, onClose: onClose, placement: "bottom-start", closeOnBlur: false, returnFocusOnClose: false },
98
+ react_1.default.createElement(react_2.PopoverAnchor, null,
99
+ react_1.default.createElement(react_2.Box, { ref: triggerRef, as: "div" },
100
+ react_1.default.createElement(react_2.Box, { ref: inputWrapperRef },
101
+ react_1.default.createElement(TimePickerInput_1.TimePickerInput, { value: tempDate, onChange: function (date) {
102
+ handleTimeInputChange(date);
103
+ }, dateFormat: dateFormat, disabled: disabled, placeholder: placeholder, onFocus: function () {
104
+ if (!disabled && !isOpen)
105
+ onOpen();
106
+ } })))),
107
+ react_1.default.createElement(react_2.PopoverContent, { width: "auto", p: 4, ref: popoverRef, boxShadow: "lg" },
108
+ react_1.default.createElement(react_2.PopoverBody, null,
109
+ react_1.default.createElement(TimePicker_1.default, { date: resolvedTempDate, dateFormat: dateFormat, onChange: function (updatedDate) {
110
+ handleTimePickerChange(updatedDate);
111
+ } }),
112
+ react_1.default.createElement(react_2.Box, { display: "flex", justifyContent: "space-between", mt: 4, pt: 4, borderTop: "1px solid", borderColor: "gray.200" },
113
+ react_1.default.createElement(react_2.Button, { size: "sm", variant: "ghost", onClick: handleClear }, "Clear"),
114
+ react_1.default.createElement(react_2.Button, { size: "sm", colorScheme: "primary", onClick: handleOk }, "OK"))))),
115
+ error && errorMessage && react_1.default.createElement(ErrorMessage_1.default, { errorMessage: errorMessage }),
116
+ helperText && !error && react_1.default.createElement(HelperText_1.default, { helperText: helperText })));
117
+ };
118
+ exports.TimeOnlyPicker = TimeOnlyPicker;
119
+ exports.default = exports.TimeOnlyPicker;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ interface TimePickerInputProps {
3
+ value: Date | null;
4
+ onChange: (date: Date | null) => void;
5
+ dateFormat: string;
6
+ disabled?: boolean;
7
+ placeholder?: string;
8
+ onFocus?: () => void;
9
+ onBlur?: () => void;
10
+ }
11
+ export declare const TimePickerInput: React.FC<TimePickerInputProps>;
12
+ export {};
@@ -0,0 +1,362 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.TimePickerInput = void 0;
27
+ var react_1 = __importStar(require("react"));
28
+ var react_2 = require("@chakra-ui/react");
29
+ var date_fns_1 = require("date-fns");
30
+ var lucide_react_1 = require("lucide-react");
31
+ var useCustomTheme_1 = require("../../Theme/useCustomTheme");
32
+ var sanitizeDigits = function (input) { return input.replace(/\D/g, "").slice(0, 4); };
33
+ var adjustDigits = function (digits, is12Hour) {
34
+ var result = sanitizeDigits(digits);
35
+ if (!result)
36
+ return "";
37
+ var maxFirstHour = is12Hour ? 1 : 2;
38
+ var firstDigit = parseInt(result.charAt(0), 10);
39
+ if (!isNaN(firstDigit) && firstDigit > maxFirstHour) {
40
+ result = ("0" + firstDigit.toString() + result.slice(1)).slice(0, 4);
41
+ }
42
+ if (result.length >= 2) {
43
+ var hour = parseInt(result.slice(0, 2), 10);
44
+ if (isNaN(hour))
45
+ hour = 0;
46
+ if (is12Hour) {
47
+ if (hour < 1)
48
+ hour = 1;
49
+ if (hour > 12)
50
+ hour = 12;
51
+ }
52
+ else {
53
+ if (hour < 0)
54
+ hour = 0;
55
+ if (hour > 23)
56
+ hour = 23;
57
+ }
58
+ result = hour.toString().padStart(2, "0") + result.slice(2);
59
+ }
60
+ if (result.length >= 3) {
61
+ var firstMinuteDigit = parseInt(result.charAt(2), 10);
62
+ if (!isNaN(firstMinuteDigit) && firstMinuteDigit > 5) {
63
+ result = result.slice(0, 2) + "5" + result.slice(3);
64
+ }
65
+ }
66
+ if (result.length >= 4) {
67
+ var minute = parseInt(result.slice(2, 4), 10);
68
+ if (isNaN(minute))
69
+ minute = 0;
70
+ if (minute < 0)
71
+ minute = 0;
72
+ if (minute > 59)
73
+ minute = 59;
74
+ result = result.slice(0, 2) + minute.toString().padStart(2, "0") + result.slice(4);
75
+ }
76
+ return result.slice(0, 4);
77
+ };
78
+ var formatDigits = function (digits) {
79
+ if (!digits)
80
+ return "";
81
+ if (digits.length === 1)
82
+ return digits;
83
+ if (digits.length === 2)
84
+ return "".concat(digits, ":");
85
+ if (digits.length === 3)
86
+ return "".concat(digits.slice(0, 2), ":").concat(digits.slice(2, 3));
87
+ return "".concat(digits.slice(0, 2), ":").concat(digits.slice(2, 4));
88
+ };
89
+ var getDigitIndexFromCaret = function (formatted, caret) {
90
+ var digitIndex = 0;
91
+ for (var i = 0; i < caret && i < formatted.length; i++) {
92
+ if (/\d/.test(formatted[i]))
93
+ digitIndex++;
94
+ }
95
+ return digitIndex;
96
+ };
97
+ var caretFromDigitIndex = function (digitIndex, digitsLen) {
98
+ if (digitIndex < 0)
99
+ return 0;
100
+ if (digitsLen <= 1)
101
+ return Math.min(digitIndex, digitsLen);
102
+ if (digitsLen === 2) {
103
+ if (digitIndex <= 1)
104
+ return digitIndex;
105
+ return 3; // after colon
106
+ }
107
+ // digitsLen >= 3
108
+ if (digitIndex <= 1)
109
+ return digitIndex;
110
+ if (digitIndex === 2)
111
+ return 3;
112
+ return digitIndex + 1;
113
+ };
114
+ var formatToPlaceholder = function (formatStr) { return formatStr.replace(/h{1,2}/gi, "HH").replace(/m{1,2}/gi, "mm").replace(/a{1,2}/gi, "AM"); };
115
+ var TimePickerInput = function (_a) {
116
+ var value = _a.value, onChange = _a.onChange, dateFormat = _a.dateFormat, _b = _a.disabled, disabled = _b === void 0 ? false : _b, placeholder = _a.placeholder, onFocus = _a.onFocus, onBlur = _a.onBlur;
117
+ var theme = (0, useCustomTheme_1.useCustomTheme)();
118
+ var inputRef = (0, react_1.useRef)(null);
119
+ var _c = (0, react_1.useState)(""), digits = _c[0], setDigits = _c[1];
120
+ var digitsRef = (0, react_1.useRef)("");
121
+ var _d = (0, react_1.useState)(false), isFocused = _d[0], setIsFocused = _d[1];
122
+ var isFocusedRef = (0, react_1.useRef)(false);
123
+ var _e = (0, react_1.useState)("hour"), activeSegment = _e[0], setActiveSegment = _e[1];
124
+ var is12Hour = (0, react_1.useMemo)(function () { return /h{1,2}/i.test(dateFormat) && !/H{1,2}/.test(dateFormat); }, [dateFormat]);
125
+ var placeholderText = (0, react_1.useMemo)(function () { return placeholder || formatToPlaceholder(dateFormat); }, [placeholder, dateFormat]);
126
+ var setInputValueAndCaret = (0, react_1.useCallback)(function (formatted, caretDigitIndex) {
127
+ requestAnimationFrame(function () {
128
+ var el = inputRef.current;
129
+ if (!el)
130
+ return;
131
+ el.value = formatted;
132
+ var caretPos = Math.min(caretFromDigitIndex(caretDigitIndex, digitsRef.current.length), formatted.length);
133
+ el.setSelectionRange(caretPos, caretPos);
134
+ });
135
+ }, []);
136
+ var applyDigits = (0, react_1.useCallback)(function (rawDigits, desiredDigitIndex) {
137
+ var clamped = adjustDigits(rawDigits, is12Hour);
138
+ digitsRef.current = clamped;
139
+ setDigits(clamped);
140
+ var formatted = formatDigits(clamped);
141
+ var maxDigitIndex = clamped.length === 2 ? 2 : clamped.length;
142
+ var nextDigitIndex = Math.max(0, Math.min(desiredDigitIndex, maxDigitIndex));
143
+ setInputValueAndCaret(formatted, nextDigitIndex);
144
+ if (clamped.length === 4) {
145
+ var parsed = (0, date_fns_1.parse)(formatted, dateFormat, new Date());
146
+ if ((0, date_fns_1.isValid)(parsed))
147
+ onChange(parsed);
148
+ }
149
+ else if (clamped.length === 0) {
150
+ onChange(null);
151
+ }
152
+ return { digits: clamped, nextDigitIndex: nextDigitIndex };
153
+ }, [dateFormat, is12Hour, onChange, setInputValueAndCaret]);
154
+ var handleDigitInput = (0, react_1.useCallback)(function (digit) {
155
+ var _a, _b;
156
+ var el = inputRef.current;
157
+ var formatted = formatDigits(digitsRef.current);
158
+ var start = (_a = el === null || el === void 0 ? void 0 : el.selectionStart) !== null && _a !== void 0 ? _a : formatted.length;
159
+ var end = (_b = el === null || el === void 0 ? void 0 : el.selectionEnd) !== null && _b !== void 0 ? _b : start;
160
+ var startDigitIndex = getDigitIndexFromCaret(formatted, start);
161
+ var endDigitIndex = getDigitIndexFromCaret(formatted, end);
162
+ var newDigits = digitsRef.current;
163
+ newDigits = newDigits.slice(0, startDigitIndex) + newDigits.slice(endDigitIndex);
164
+ newDigits = newDigits.slice(0, startDigitIndex) + digit + newDigits.slice(startDigitIndex);
165
+ newDigits = newDigits.slice(0, 4);
166
+ var _c = applyDigits(newDigits, startDigitIndex + 1), finalDigits = _c.digits, nextDigitIndex = _c.nextDigitIndex;
167
+ if (startDigitIndex < 2 && finalDigits.length >= 2) {
168
+ setActiveSegment("minute");
169
+ }
170
+ else if (nextDigitIndex <= 2) {
171
+ setActiveSegment("hour");
172
+ }
173
+ else {
174
+ setActiveSegment("minute");
175
+ }
176
+ }, [applyDigits]);
177
+ var handleBackspace = (0, react_1.useCallback)(function () {
178
+ var _a, _b;
179
+ if (!digitsRef.current)
180
+ return;
181
+ var el = inputRef.current;
182
+ var formatted = formatDigits(digitsRef.current);
183
+ var start = (_a = el === null || el === void 0 ? void 0 : el.selectionStart) !== null && _a !== void 0 ? _a : formatted.length;
184
+ var end = (_b = el === null || el === void 0 ? void 0 : el.selectionEnd) !== null && _b !== void 0 ? _b : start;
185
+ var startDigitIndex = getDigitIndexFromCaret(formatted, start);
186
+ var endDigitIndex = getDigitIndexFromCaret(formatted, end);
187
+ if (startDigitIndex === endDigitIndex) {
188
+ if (startDigitIndex === 0)
189
+ return;
190
+ startDigitIndex -= 1;
191
+ }
192
+ var newDigits = digitsRef.current;
193
+ newDigits = newDigits.slice(0, startDigitIndex) + newDigits.slice(endDigitIndex);
194
+ var _c = applyDigits(newDigits, startDigitIndex), nextDigitIndex = _c.nextDigitIndex, finalDigits = _c.digits;
195
+ if (finalDigits.length < 2 || nextDigitIndex <= 2) {
196
+ setActiveSegment("hour");
197
+ }
198
+ else {
199
+ setActiveSegment("minute");
200
+ }
201
+ }, [applyDigits]);
202
+ var handleDelete = (0, react_1.useCallback)(function () {
203
+ var _a, _b;
204
+ if (!digitsRef.current)
205
+ return;
206
+ var el = inputRef.current;
207
+ var formatted = formatDigits(digitsRef.current);
208
+ var start = (_a = el === null || el === void 0 ? void 0 : el.selectionStart) !== null && _a !== void 0 ? _a : formatted.length;
209
+ var end = (_b = el === null || el === void 0 ? void 0 : el.selectionEnd) !== null && _b !== void 0 ? _b : start;
210
+ var startDigitIndex = getDigitIndexFromCaret(formatted, start);
211
+ var endDigitIndex = getDigitIndexFromCaret(formatted, end);
212
+ if (startDigitIndex === endDigitIndex) {
213
+ if (startDigitIndex >= digitsRef.current.length)
214
+ return;
215
+ endDigitIndex = startDigitIndex + 1;
216
+ }
217
+ var newDigits = digitsRef.current;
218
+ newDigits = newDigits.slice(0, startDigitIndex) + newDigits.slice(endDigitIndex);
219
+ var _c = applyDigits(newDigits, startDigitIndex), nextDigitIndex = _c.nextDigitIndex, finalDigits = _c.digits;
220
+ if (finalDigits.length < 2 || nextDigitIndex <= 2) {
221
+ setActiveSegment("hour");
222
+ }
223
+ else {
224
+ setActiveSegment("minute");
225
+ }
226
+ }, [applyDigits]);
227
+ var handleArrow = (0, react_1.useCallback)(function (direction) {
228
+ if (direction === "left") {
229
+ setActiveSegment("hour");
230
+ setInputValueAndCaret(formatDigits(digitsRef.current), 0);
231
+ }
232
+ else {
233
+ if (digitsRef.current.length >= 2) {
234
+ setActiveSegment("minute");
235
+ setInputValueAndCaret(formatDigits(digitsRef.current), 3);
236
+ }
237
+ }
238
+ }, [setInputValueAndCaret]);
239
+ var handleKeyDown = (0, react_1.useCallback)(function (e) {
240
+ if (disabled)
241
+ return;
242
+ var key = e.key;
243
+ if (/^[0-9]$/.test(key)) {
244
+ e.preventDefault();
245
+ handleDigitInput(key);
246
+ return;
247
+ }
248
+ if (key === "Backspace") {
249
+ e.preventDefault();
250
+ handleBackspace();
251
+ return;
252
+ }
253
+ if (key === "Delete") {
254
+ e.preventDefault();
255
+ handleDelete();
256
+ return;
257
+ }
258
+ if (key === ":") {
259
+ e.preventDefault();
260
+ return;
261
+ }
262
+ if (key === "ArrowLeft") {
263
+ e.preventDefault();
264
+ handleArrow("left");
265
+ return;
266
+ }
267
+ if (key === "ArrowRight") {
268
+ e.preventDefault();
269
+ handleArrow("right");
270
+ return;
271
+ }
272
+ if (key === "Tab" || key === "Shift" || key === "Enter" || key === "Escape") {
273
+ return;
274
+ }
275
+ e.preventDefault();
276
+ }, [disabled, handleDigitInput, handleBackspace, handleDelete, handleArrow]);
277
+ var handleFocus = (0, react_1.useCallback)(function () {
278
+ setIsFocused(true);
279
+ isFocusedRef.current = true;
280
+ setActiveSegment("hour");
281
+ requestAnimationFrame(function () {
282
+ var el = inputRef.current;
283
+ if (!el)
284
+ return;
285
+ el.focus();
286
+ el.setSelectionRange(0, Math.min(2, el.value.length));
287
+ });
288
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus();
289
+ }, [onFocus]);
290
+ var handleBlur = (0, react_1.useCallback)(function () {
291
+ setIsFocused(false);
292
+ isFocusedRef.current = false;
293
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur();
294
+ }, [onBlur]);
295
+ var handleClick = (0, react_1.useCallback)(function () {
296
+ var _a;
297
+ var el = inputRef.current;
298
+ if (!el)
299
+ return;
300
+ var caret = (_a = el.selectionStart) !== null && _a !== void 0 ? _a : 0;
301
+ var formatted = formatDigits(digitsRef.current);
302
+ var digitIndex = getDigitIndexFromCaret(formatted, caret);
303
+ if (digitIndex < 2) {
304
+ setActiveSegment("hour");
305
+ }
306
+ else {
307
+ if (digitsRef.current.length >= 2)
308
+ setActiveSegment("minute");
309
+ }
310
+ }, []);
311
+ var handleInput = (0, react_1.useCallback)(function (e) {
312
+ // Prevent uncontrolled edits – we manage value ourselves
313
+ var el = inputRef.current;
314
+ if (!el)
315
+ return;
316
+ var formatted = formatDigits(digitsRef.current);
317
+ if (el.value !== formatted) {
318
+ el.value = formatted;
319
+ }
320
+ }, []);
321
+ var handlePaste = (0, react_1.useCallback)(function (e) {
322
+ e.preventDefault();
323
+ var pasted = sanitizeDigits(e.clipboardData.getData("text"));
324
+ if (!pasted)
325
+ return;
326
+ applyDigits(pasted, pasted.length);
327
+ if (pasted.length >= 2) {
328
+ setActiveSegment("minute");
329
+ }
330
+ }, [applyDigits]);
331
+ (0, react_1.useEffect)(function () {
332
+ if (value) {
333
+ var newDigits = adjustDigits((0, date_fns_1.format)(value, dateFormat).replace(/\D/g, ""), is12Hour);
334
+ digitsRef.current = newDigits;
335
+ setDigits(newDigits);
336
+ if (!isFocusedRef.current) {
337
+ var formatted = formatDigits(newDigits);
338
+ if (inputRef.current) {
339
+ inputRef.current.value = formatted;
340
+ }
341
+ }
342
+ }
343
+ else {
344
+ digitsRef.current = "";
345
+ setDigits("");
346
+ if (inputRef.current && !isFocusedRef.current) {
347
+ inputRef.current.value = "";
348
+ }
349
+ }
350
+ }, [value, dateFormat, is12Hour]);
351
+ (0, react_1.useEffect)(function () {
352
+ var formatted = formatDigits(digits);
353
+ if (!isFocusedRef.current && inputRef.current) {
354
+ inputRef.current.value = formatted;
355
+ }
356
+ }, [digits]);
357
+ return (react_1.default.createElement(react_2.InputGroup, null,
358
+ react_1.default.createElement(react_2.Input, { ref: inputRef, defaultValue: "", onChange: handleInput, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur, onClick: handleClick, onPaste: handlePaste, placeholder: placeholderText, isDisabled: disabled, autoComplete: "off" }),
359
+ react_1.default.createElement(react_2.InputRightElement, { pointerEvents: "none" },
360
+ react_1.default.createElement(lucide_react_1.ClockIcon, { size: 18, color: theme.colors.gray[500] }))));
361
+ };
362
+ exports.TimePickerInput = TimePickerInput;
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
2
  import { NoteTextAreaProps } from "./NoteTextAreaProps";
3
- export default function NoteTextArea({ width, handleSubmit, handleCancel, value, title, file, isEditable, saveButtonLoading, maxFileSize, maxFilesSizeError, maxNoteWordCount, onChange, ref: inputRef, }: NoteTextAreaProps): React.JSX.Element;
3
+ export default function NoteTextArea({ width, handleSubmit, handleCancel, value, title, file, isEditable, saveButtonLoading, maxFileSize, maxFilesSizeError, maxNoteWordCount, onChange, ref: inputRef, customPlaceholder }: NoteTextAreaProps): React.JSX.Element;
@@ -45,16 +45,16 @@ var countWords = function (text) {
45
45
  };
46
46
  function NoteTextArea(_a) {
47
47
  var _b;
48
- var _c = _a.width, width = _c === void 0 ? "100%" : _c, handleSubmit = _a.handleSubmit, handleCancel = _a.handleCancel, value = _a.value, title = _a.title, file = _a.file, _d = _a.isEditable, isEditable = _d === void 0 ? false : _d, saveButtonLoading = _a.saveButtonLoading, _e = _a.maxFileSize, maxFileSize = _e === void 0 ? 1 * 1024 * 1024 : _e, _f = _a.maxFilesSizeError, maxFilesSizeError = _f === void 0 ? "Some files are too large. Maximum allowed size is" : _f, _g = _a.maxNoteWordCount, maxNoteWordCount = _g === void 0 ? 15 : _g, onChange = _a.onChange, inputRef = _a.ref;
48
+ var _c = _a.width, width = _c === void 0 ? "100%" : _c, handleSubmit = _a.handleSubmit, handleCancel = _a.handleCancel, value = _a.value, title = _a.title, file = _a.file, _d = _a.isEditable, isEditable = _d === void 0 ? false : _d, saveButtonLoading = _a.saveButtonLoading, _e = _a.maxFileSize, maxFileSize = _e === void 0 ? 1 * 1024 * 1024 : _e, _f = _a.maxFilesSizeError, maxFilesSizeError = _f === void 0 ? "Some files are too large. Maximum allowed size is" : _f, _g = _a.maxNoteWordCount, maxNoteWordCount = _g === void 0 ? 15 : _g, onChange = _a.onChange, inputRef = _a.ref, _h = _a.customPlaceholder, customPlaceholder = _h === void 0 ? "Add a note..." : _h;
49
49
  var theme = (0, useCustomTheme_1.useCustomTheme)();
50
50
  var noteAreaRef = (0, react_1.useRef)(null);
51
- var _h = (0, react_1.useState)(false), isActive = _h[0], setIsActive = _h[1];
52
- var _j = (0, react_1.useState)(""), noteValue = _j[0], setNoteValue = _j[1];
53
- var _k = (0, react_1.useState)(""), titleValue = _k[0], setTitleValue = _k[1];
54
- var _l = (0, react_1.useState)(false), titleShow = _l[0], setTitleShow = _l[1];
55
- var _m = (0, react_1.useState)([]), files = _m[0], setFiles = _m[1];
56
- var _o = (0, react_1.useState)(""), fileError = _o[0], setFileError = _o[1];
57
- var _p = (0, react_1.useState)(false), isSaveDisabled = _p[0], setIsSaveDisabled = _p[1];
51
+ var _j = (0, react_1.useState)(false), isActive = _j[0], setIsActive = _j[1];
52
+ var _k = (0, react_1.useState)(""), noteValue = _k[0], setNoteValue = _k[1];
53
+ var _l = (0, react_1.useState)(""), titleValue = _l[0], setTitleValue = _l[1];
54
+ var _m = (0, react_1.useState)(false), titleShow = _m[0], setTitleShow = _m[1];
55
+ var _o = (0, react_1.useState)([]), files = _o[0], setFiles = _o[1];
56
+ var _p = (0, react_1.useState)(""), fileError = _p[0], setFileError = _p[1];
57
+ var _q = (0, react_1.useState)(false), isSaveDisabled = _q[0], setIsSaveDisabled = _q[1];
58
58
  (0, react_1.useEffect)(function () {
59
59
  setIsSaveDisabled(countWords(titleValue) > maxNoteWordCount);
60
60
  }, [titleValue, maxNoteWordCount]);
@@ -151,7 +151,7 @@ function NoteTextArea(_a) {
151
151
  };
152
152
  return (react_1.default.createElement(react_2.Box, { w: width, borderRadius: "0.25rem", overflow: "hidden", border: "1px solid", borderColor: isActive ? theme.colors.primary[300] : theme.colors.gray[200], bg: isActive ? theme.colors.gray[50] : "transparent", boxShadow: isActive ? "0 0 0 0.125rem ".concat((_b = theme.colors.boxShadow) === null || _b === void 0 ? void 0 : _b.primary) : "none" },
153
153
  !isActive && (react_1.default.createElement(react_2.Flex, { px: 4, align: "center", cursor: "text", onClick: handleTextArea, bg: theme.colors.white, borderRadius: "0.25rem", minH: "44px" },
154
- react_1.default.createElement(react_2.Text, { color: theme.colors.gray[300], fontStyle: "italic", fontSize: "md" }, "Add a note..."))),
154
+ react_1.default.createElement(react_2.Text, { color: theme.colors.gray[300], fontStyle: "italic", fontSize: "md" }, customPlaceholder))),
155
155
  isActive && (react_1.default.createElement(react_1.default.Fragment, null,
156
156
  react_1.default.createElement(react_2.Box, { bg: theme.colors.white },
157
157
  titleShow && (react_1.default.createElement(react_2.Input, { ref: inputRef, value: titleValue, onChange: function (e) {
@@ -13,4 +13,5 @@ export type NoteTextAreaProps = {
13
13
  maxNoteWordCount?: number;
14
14
  onChange?: (value: string) => void;
15
15
  ref?: LegacyRef<HTMLInputElement>;
16
+ customPlaceholder?: string;
16
17
  };