@bigbinary/neeto-atoms 1.0.55 → 1.0.57
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/{Avatar-CJq2rlgk.js → Avatar-D1hEMHgh.js} +24 -2
- package/dist/Avatar-D1hEMHgh.js.map +1 -0
- package/dist/{DatePicker-D-0HMiNG.js → DatePicker-DGf2BiNq.js} +151 -125
- package/dist/DatePicker-DGf2BiNq.js.map +1 -0
- package/dist/Select-BiyQTuiQ.js.map +1 -1
- package/dist/TimePicker-DoL126Ql.js +444 -0
- package/dist/TimePicker-DoL126Ql.js.map +1 -0
- package/dist/{TimePickerPanel-zWmOy3Eo.js → TimePickerPanel--KDX5QwS.js} +116 -3
- package/dist/TimePickerPanel--KDX5QwS.js.map +1 -0
- package/dist/cjs/{Avatar-nG7vhAUS.js → Avatar-CHTb5RZ0.js} +24 -2
- package/dist/cjs/Avatar-CHTb5RZ0.js.map +1 -0
- package/dist/cjs/{DatePicker-JhQ7D2bu.js → DatePicker-Bg2LywGY.js} +150 -124
- package/dist/cjs/DatePicker-Bg2LywGY.js.map +1 -0
- package/dist/cjs/Select-DC23xcMU.js.map +1 -1
- package/dist/cjs/TimePicker-H3OpzvOm.js +446 -0
- package/dist/cjs/TimePicker-H3OpzvOm.js.map +1 -0
- package/dist/cjs/{TimePickerPanel-B5h5khbs.js → TimePickerPanel-DX6cjrSN.js} +130 -2
- package/dist/cjs/TimePickerPanel-DX6cjrSN.js.map +1 -0
- package/dist/cjs/components/Avatar.js +1 -1
- package/dist/cjs/components/DatePicker.js +5 -5
- package/dist/cjs/components/TimePicker.js +4 -2
- package/dist/cjs/components/TimePicker.js.map +1 -1
- package/dist/cjs/components/index.js +4 -4
- package/dist/cjs/formik/BlockNavigation.js.map +1 -1
- package/dist/cjs/index.js +6 -6
- package/dist/components/Avatar/Avatar.d.ts +2 -0
- package/dist/components/Avatar/utils.d.ts +2 -0
- package/dist/components/Avatar.js +1 -1
- package/dist/components/DatePicker/constants.d.ts +2 -0
- package/dist/components/DatePicker/types.d.ts +5 -1
- package/dist/components/DatePicker/utils.d.ts +1 -0
- package/dist/components/DatePicker.js +5 -5
- package/dist/components/TimePicker/constants.d.ts +17 -0
- package/dist/components/TimePicker/index.d.ts +1 -1
- package/dist/components/TimePicker/types.d.ts +19 -4
- package/dist/components/TimePicker/utils.d.ts +13 -0
- package/dist/components/TimePicker.js +4 -2
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Typography/Typography.d.ts +2 -2
- package/dist/components/index.js +4 -4
- package/dist/formik/BlockNavigation.js.map +1 -1
- package/dist/hooks/useControlledOpen.d.ts +5 -0
- package/dist/hooks/useCursorRestore.d.ts +8 -0
- package/dist/hooks/useOutsideClickClose.d.ts +8 -0
- package/dist/index.css +6 -0
- package/dist/index.js +6 -6
- package/dist/primitives/Badge.d.ts +1 -1
- package/dist/shadcn/components/input-group.d.ts +1 -1
- package/package.json +1 -1
- package/dist/Avatar-CJq2rlgk.js.map +0 -1
- package/dist/DatePicker-D-0HMiNG.js.map +0 -1
- package/dist/TimePicker-CSjiggpr.js +0 -301
- package/dist/TimePicker-CSjiggpr.js.map +0 -1
- package/dist/TimePickerPanel-zWmOy3Eo.js.map +0 -1
- package/dist/cjs/Avatar-nG7vhAUS.js.map +0 -1
- package/dist/cjs/DatePicker-JhQ7D2bu.js.map +0 -1
- package/dist/cjs/TimePicker-CU7qJpoT.js +0 -303
- package/dist/cjs/TimePicker-CU7qJpoT.js.map +0 -1
- package/dist/cjs/TimePickerPanel-B5h5khbs.js.map +0 -1
- /package/dist/{hooks → components/Select/hooks}/useAsyncOptions.d.ts +0 -0
- /package/dist/{hooks → components/Select/hooks}/useCreatableItems.d.ts +0 -0
- /package/dist/{hooks → components/Select/hooks}/useLazyLoadSentinel.d.ts +0 -0
- /package/dist/{hooks → components/Select/hooks}/useMultiSelectOptions.d.ts +0 -0
- /package/dist/{hooks → components/Select/hooks}/useMultiSelectState.d.ts +0 -0
- /package/dist/{hooks → components/Select/hooks}/useSelectState.d.ts +0 -0
- /package/dist/{hooks → formik/BlockNavigation/hooks}/useNavPrompt.d.ts +0 -0
|
@@ -22,6 +22,26 @@ function getInitials(name) {
|
|
|
22
22
|
if (!name) return "";
|
|
23
23
|
return name.split(/\s+/).slice(0, 2).map((word) => word.charAt(0).toUpperCase()).join("");
|
|
24
24
|
}
|
|
25
|
+
function cyrb53(str, seed = 0) {
|
|
26
|
+
let h1 = 3735928559 ^ seed;
|
|
27
|
+
let h2 = 1103547991 ^ seed;
|
|
28
|
+
for (let i = 0; i < str.length; i++) {
|
|
29
|
+
const ch = str.charCodeAt(i);
|
|
30
|
+
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
31
|
+
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
32
|
+
}
|
|
33
|
+
h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
|
|
34
|
+
h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
|
|
35
|
+
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
36
|
+
}
|
|
37
|
+
function getAvatarColorStyle(seed) {
|
|
38
|
+
if (!seed) return void 0;
|
|
39
|
+
const hue = cyrb53(seed) % 360;
|
|
40
|
+
return {
|
|
41
|
+
backgroundColor: `oklch(var(--avatar-l) var(--avatar-c) ${hue})`,
|
|
42
|
+
color: "var(--avatar-fg)"
|
|
43
|
+
};
|
|
44
|
+
}
|
|
25
45
|
|
|
26
46
|
const Avatar = forwardRef(
|
|
27
47
|
({
|
|
@@ -36,6 +56,8 @@ const Avatar = forwardRef(
|
|
|
36
56
|
const initials = getInitials(user?.name);
|
|
37
57
|
const isXl = size === "xl";
|
|
38
58
|
const primitiveSize = isXl ? "lg" : size;
|
|
59
|
+
const seed = user?.id != null ? String(user.id) : user?.email?.trim().toLowerCase() || user?.name;
|
|
60
|
+
const fallbackStyle = user?.imageUrl ? void 0 : getAvatarColorStyle(seed);
|
|
39
61
|
const avatarElement = /* @__PURE__ */ jsxs(
|
|
40
62
|
Avatar$1,
|
|
41
63
|
{
|
|
@@ -45,7 +67,7 @@ const Avatar = forwardRef(
|
|
|
45
67
|
...otherProps,
|
|
46
68
|
children: [
|
|
47
69
|
user?.imageUrl && /* @__PURE__ */ jsx(AvatarImage, { src: user.imageUrl, alt: user?.name ?? "" }),
|
|
48
|
-
/* @__PURE__ */ jsx(AvatarFallback, { children: initials }),
|
|
70
|
+
/* @__PURE__ */ jsx(AvatarFallback, { style: fallbackStyle, children: initials }),
|
|
49
71
|
status && /* @__PURE__ */ jsx(AvatarBadge, { className: cn(STATUS_COLOR_MAP[status]) })
|
|
50
72
|
]
|
|
51
73
|
}
|
|
@@ -68,4 +90,4 @@ const AvatarNamespace = Object.assign(Avatar, {
|
|
|
68
90
|
});
|
|
69
91
|
|
|
70
92
|
export { AvatarNamespace as A };
|
|
71
|
-
//# sourceMappingURL=Avatar-
|
|
93
|
+
//# sourceMappingURL=Avatar-D1hEMHgh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar-D1hEMHgh.js","sources":["../src/components/Avatar/constants.ts","../src/components/Avatar/utils.ts","../src/components/Avatar/Avatar.tsx"],"sourcesContent":["export const STATUS_COLOR_MAP: Record<string, string> = {\n online: \"bg-emerald-500 dark:bg-emerald-400\",\n idle: \"bg-amber-500 dark:bg-amber-400\",\n offline: \"bg-gray-400 dark:bg-gray-500\",\n};\n\nexport const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n auto: \"bottom\",\n};\n\nexport const XL_CLASSES =\n \"data-[size=lg]:size-16 [&>[data-slot=avatar-badge]]:size-4 [&>[data-slot=avatar-fallback]]:text-lg\";\n","import type { CSSProperties } from \"react\";\n\nexport function getInitials(name?: string): string {\n if (!name) return \"\";\n\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map(word => word.charAt(0).toUpperCase())\n .join(\"\");\n}\n\nfunction cyrb53(str: string, seed = 0): number {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^\n Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^\n Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nexport function getAvatarColorStyle(seed?: string): CSSProperties | undefined {\n if (!seed) return undefined;\n\n const hue = cyrb53(seed) % 360;\n\n return {\n backgroundColor: `oklch(var(--avatar-l) var(--avatar-c) ${hue})`,\n color: \"var(--avatar-fg)\",\n };\n}\n","import React, { forwardRef } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Avatar as PrimitiveAvatar,\n AvatarImage,\n AvatarFallback,\n AvatarBadge,\n AvatarGroup,\n AvatarGroupCount,\n} from \"src/primitives/Avatar\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\nimport { STATUS_COLOR_MAP, SIDE_MAP, XL_CLASSES } from \"./constants\";\nimport { getAvatarColorStyle, getInitials } from \"./utils\";\n\ntype AvatarSize = \"sm\" | \"default\" | \"lg\" | \"xl\";\n\ninterface AvatarTooltipProps {\n /** Tooltip content. Defaults to user.name if showTooltip is true. */\n content?: React.ReactNode;\n /** Tooltip position. */\n position?: string;\n}\n\nexport interface AvatarProps extends Omit<\n React.ComponentProps<typeof PrimitiveAvatar>,\n \"size\"\n> {\n /** User data for the avatar. */\n user?: {\n id?: string | number;\n name?: string;\n email?: string;\n imageUrl?: string;\n };\n /** Status indicator displayed as a colored badge. */\n status?: \"online\" | \"idle\" | \"offline\" | null;\n /** Show the user's name in a tooltip on hover. */\n showTooltip?: boolean;\n /** Tooltip configuration. Overrides showTooltip content. */\n tooltipProps?: AvatarTooltipProps;\n /** Size of the avatar. */\n size?: AvatarSize;\n /** Additional CSS class names. */\n className?: string;\n}\n\nconst Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n (\n {\n user,\n status,\n showTooltip = false,\n tooltipProps,\n size = \"default\",\n className,\n ...otherProps\n },\n ref\n ) => {\n const initials = getInitials(user?.name);\n const isXl = size === \"xl\";\n const primitiveSize = isXl ? \"lg\" : size;\n const seed =\n user?.id != null\n ? String(user.id)\n : user?.email?.trim().toLowerCase() || user?.name;\n const fallbackStyle = user?.imageUrl\n ? undefined\n : getAvatarColorStyle(seed);\n\n const avatarElement = (\n <PrimitiveAvatar\n ref={ref}\n size={primitiveSize}\n className={cn(isXl && XL_CLASSES, className)}\n {...otherProps}\n >\n {user?.imageUrl && (\n <AvatarImage src={user.imageUrl} alt={user?.name ?? \"\"} />\n )}\n <AvatarFallback style={fallbackStyle}>{initials}</AvatarFallback>\n {status && <AvatarBadge className={cn(STATUS_COLOR_MAP[status])} />}\n </PrimitiveAvatar>\n );\n\n const tooltipContent =\n tooltipProps?.content ?? (showTooltip ? user?.name : null);\n\n if (tooltipContent) {\n const side = SIDE_MAP[tooltipProps?.position ?? \"auto\"] ?? \"bottom\";\n\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex\">{avatarElement}</span>\n </TooltipTrigger>\n <TooltipContent side={side}>{tooltipContent}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return avatarElement;\n }\n);\n\nAvatar.displayName = \"Avatar\";\n\nconst AvatarNamespace = Object.assign(Avatar, {\n Group: AvatarGroup,\n GroupCount: AvatarGroupCount,\n});\n\nexport { AvatarNamespace as Avatar };\n"],"names":["PrimitiveAvatar"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useId, useRef, useState, useMemo, useCallback, useEffect
|
|
2
|
+
import { forwardRef, useId, useRef, useState, useMemo, useCallback, useEffect } from 'react';
|
|
3
3
|
import { Calendar as Calendar$1 } from './primitives/Calendar.js';
|
|
4
4
|
import { Popover, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
|
|
5
5
|
import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
|
|
6
6
|
import { c as cn } from './utils-BJnb9o5c.js';
|
|
7
|
+
import { u as useControlledOpen, l as isFixedWidthFormat, m as buildRangeMaskTemplate, d as buildMaskTemplate, b as useOutsideClickClose, e as useCursorRestore, T as TimePickerPanel, j as applyMask, n as dateToTimeValue } from './TimePickerPanel--KDX5QwS.js';
|
|
7
8
|
import pureDayjs from 'dayjs';
|
|
8
9
|
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
9
10
|
import { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
|
|
10
|
-
import { i as isFixedWidthFormat, c as buildRangeMaskTemplate, b as buildMaskTemplate, d as dateToTimeValue, T as TimePickerPanel, a as applyMask } from './TimePickerPanel-zWmOy3Eo.js';
|
|
11
11
|
import { Button } from './primitives/Button.js';
|
|
12
12
|
import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
|
|
13
13
|
import { X } from './x-_o2T3n6D.js';
|
|
@@ -30,6 +30,11 @@ const Calendar = createLucideIcon("calendar", __iconNode);
|
|
|
30
30
|
|
|
31
31
|
const DEFAULT_DATE_FORMAT = "dd/MM/yyyy";
|
|
32
32
|
const DEFAULT_TIME_FORMAT = "HH:mm:ss";
|
|
33
|
+
const INITIAL_TIME_VALUE = {
|
|
34
|
+
hours: 0,
|
|
35
|
+
minutes: 0,
|
|
36
|
+
seconds: 0
|
|
37
|
+
};
|
|
33
38
|
const SIZE_CONFIG = {
|
|
34
39
|
small: {
|
|
35
40
|
trigger: "h-8 md:h-7",
|
|
@@ -123,6 +128,10 @@ const getDisplayFormat = (dateFormat, timeFormat, showTime) => {
|
|
|
123
128
|
const fmt = showTime ? `${dateFormat} ${timeFormat}` : dateFormat;
|
|
124
129
|
return normalizeToDateFnsFormat(fmt);
|
|
125
130
|
};
|
|
131
|
+
const getDatePlaceholder = (dateFormat, timeFormat, showTime, type) => {
|
|
132
|
+
const single = showTime ? `${dateFormat.toUpperCase()} ${timeFormat}` : dateFormat.toUpperCase();
|
|
133
|
+
return type === "range" ? `${single} - ${single}` : single;
|
|
134
|
+
};
|
|
126
135
|
const isDatePartComplete = (part, maskEnabled, singleDateLen) => maskEnabled ? part.length >= singleDateLen : part.length > 0;
|
|
127
136
|
const parseRangeText = (text, displayFormat, maskEnabled, singleDateLen) => {
|
|
128
137
|
const parts = text.split(" - ");
|
|
@@ -200,6 +209,7 @@ const DatePicker = forwardRef(
|
|
|
200
209
|
value,
|
|
201
210
|
defaultValue,
|
|
202
211
|
onChange,
|
|
212
|
+
onBlur,
|
|
203
213
|
type = "date",
|
|
204
214
|
dateFormat = DEFAULT_DATE_FORMAT,
|
|
205
215
|
timeFormat = DEFAULT_TIME_FORMAT,
|
|
@@ -220,6 +230,7 @@ const DatePicker = forwardRef(
|
|
|
220
230
|
onTimezoneChange,
|
|
221
231
|
onOk,
|
|
222
232
|
needConfirm = false,
|
|
233
|
+
open: openProp,
|
|
223
234
|
onOpenChange,
|
|
224
235
|
className,
|
|
225
236
|
labelProps
|
|
@@ -233,9 +244,10 @@ const DatePicker = forwardRef(
|
|
|
233
244
|
const popoverContentId = useRef(
|
|
234
245
|
`datepicker-popover-${generatedId}`
|
|
235
246
|
).current;
|
|
236
|
-
const
|
|
237
|
-
const [internalValue, setInternalValue] = useState(
|
|
238
|
-
|
|
247
|
+
const { open, setOpen } = useControlledOpen(openProp, onOpenChange);
|
|
248
|
+
const [internalValue, setInternalValue] = useState(
|
|
249
|
+
coerceDateValue(defaultValue, type) ?? null
|
|
250
|
+
);
|
|
239
251
|
const [calendarMonth, setCalendarMonth] = useState(
|
|
240
252
|
(type === "date" ? value ?? defaultValue : null) ?? /* @__PURE__ */ new Date()
|
|
241
253
|
);
|
|
@@ -243,65 +255,46 @@ const DatePicker = forwardRef(
|
|
|
243
255
|
"from"
|
|
244
256
|
);
|
|
245
257
|
const [pendingDate, setPendingDate] = useState(null);
|
|
246
|
-
const [pendingTime, setPendingTime] = useState(
|
|
247
|
-
|
|
248
|
-
minutes: 0,
|
|
249
|
-
seconds: 0
|
|
250
|
-
});
|
|
258
|
+
const [pendingTime, setPendingTime] = useState(INITIAL_TIME_VALUE);
|
|
259
|
+
const currentValue = value !== void 0 ? coerceDateValue(value, type) : internalValue;
|
|
251
260
|
const displayFormat = getDisplayFormat(dateFormat, timeFormat, showTime);
|
|
252
261
|
const sizeConfig = SIZE_CONFIG[size];
|
|
253
262
|
const maskEnabled = isFixedWidthFormat(displayFormat);
|
|
263
|
+
const defaultPlaceholder = getDatePlaceholder(
|
|
264
|
+
dateFormat,
|
|
265
|
+
timeFormat,
|
|
266
|
+
showTime,
|
|
267
|
+
type
|
|
268
|
+
);
|
|
254
269
|
const maskTemplate = useMemo(
|
|
255
270
|
() => maskEnabled ? type === "range" ? buildRangeMaskTemplate(displayFormat) : buildMaskTemplate(displayFormat) : null,
|
|
256
271
|
[displayFormat, type, maskEnabled]
|
|
257
272
|
);
|
|
258
|
-
const
|
|
259
|
-
|
|
273
|
+
const singleDateLen = useMemo(
|
|
274
|
+
() => buildMaskTemplate(displayFormat).pattern.length,
|
|
275
|
+
[displayFormat]
|
|
276
|
+
);
|
|
277
|
+
const calendarDisabled = useCallback(
|
|
278
|
+
(date) => {
|
|
279
|
+
if (minDate && date < new Date(minDate.setHours(0, 0, 0, 0)))
|
|
280
|
+
return true;
|
|
281
|
+
if (maxDate && date > new Date(maxDate.setHours(23, 59, 59, 999)))
|
|
282
|
+
return true;
|
|
283
|
+
return false;
|
|
284
|
+
},
|
|
285
|
+
[minDate, maxDate]
|
|
286
|
+
);
|
|
260
287
|
const getDisplayText = useCallback(() => {
|
|
261
|
-
if (type
|
|
262
|
-
|
|
263
|
-
if (!rangeValue || !rangeValue[0] && !rangeValue[1]) return "";
|
|
264
|
-
const from = rangeValue[0] ? formatDate(rangeValue[0], displayFormat) : "";
|
|
265
|
-
const to = rangeValue[1] ? formatDate(rangeValue[1], displayFormat) : "";
|
|
266
|
-
return `${from} - ${to}`;
|
|
288
|
+
if (type !== "range") {
|
|
289
|
+
return formatDate(currentValue, displayFormat);
|
|
267
290
|
}
|
|
268
|
-
|
|
291
|
+
const rangeValue = currentValue;
|
|
292
|
+
if (!rangeValue || !rangeValue[0] && !rangeValue[1]) return "";
|
|
293
|
+
const from = rangeValue[0] ? formatDate(rangeValue[0], displayFormat) : "";
|
|
294
|
+
const to = rangeValue[1] ? formatDate(rangeValue[1], displayFormat) : "";
|
|
295
|
+
return `${from} - ${to}`;
|
|
269
296
|
}, [currentValue, displayFormat, type]);
|
|
270
297
|
const [inputText, setInputText] = useState(() => getDisplayText());
|
|
271
|
-
useEffect(() => {
|
|
272
|
-
if (!open) setInputText(getDisplayText());
|
|
273
|
-
}, [getDisplayText, open]);
|
|
274
|
-
const closePopover = useCallback(() => {
|
|
275
|
-
setOpen(false);
|
|
276
|
-
onOpenChange?.(false);
|
|
277
|
-
setInputText(getDisplayText());
|
|
278
|
-
}, [onOpenChange, getDisplayText]);
|
|
279
|
-
const openPopover = useCallback(() => {
|
|
280
|
-
setOpen(true);
|
|
281
|
-
onOpenChange?.(true);
|
|
282
|
-
setRangeSelectionStep("from");
|
|
283
|
-
const dateVal = type === "date" ? currentValue : null;
|
|
284
|
-
if (dateVal) {
|
|
285
|
-
setCalendarMonth(dateVal);
|
|
286
|
-
setPendingDate(dateVal);
|
|
287
|
-
setPendingTime(dateToTimeValue(dateVal));
|
|
288
|
-
} else {
|
|
289
|
-
setPendingDate(null);
|
|
290
|
-
setPendingTime({ hours: 0, minutes: 0, seconds: 0 });
|
|
291
|
-
}
|
|
292
|
-
}, [type, currentValue, onOpenChange]);
|
|
293
|
-
useEffect(() => {
|
|
294
|
-
if (!open) return;
|
|
295
|
-
const handlePointerDown = (e) => {
|
|
296
|
-
const target = e.target;
|
|
297
|
-
if (containerRef.current?.contains(target)) return;
|
|
298
|
-
const popoverEl = document.getElementById(popoverContentId);
|
|
299
|
-
if (popoverEl?.contains(target)) return;
|
|
300
|
-
closePopover();
|
|
301
|
-
};
|
|
302
|
-
document.addEventListener("pointerdown", handlePointerDown);
|
|
303
|
-
return () => document.removeEventListener("pointerdown", handlePointerDown);
|
|
304
|
-
}, [open, closePopover]);
|
|
305
298
|
const commitValue = (date) => {
|
|
306
299
|
if (date === null) {
|
|
307
300
|
setInternalValue(null);
|
|
@@ -329,16 +322,76 @@ const DatePicker = forwardRef(
|
|
|
329
322
|
onChange?.(toDayjs(converted), formatted);
|
|
330
323
|
setInputText(formatted);
|
|
331
324
|
};
|
|
325
|
+
const parseAndApplyRange = (text) => {
|
|
326
|
+
const parts = text.split(" - ");
|
|
327
|
+
if (!isDatePartComplete(parts[0] ?? "", maskEnabled, singleDateLen))
|
|
328
|
+
return;
|
|
329
|
+
const from = parseDate(parts[0], displayFormat);
|
|
330
|
+
if (from) setCalendarMonth(from);
|
|
331
|
+
const range = parseRangeText(
|
|
332
|
+
text,
|
|
333
|
+
displayFormat,
|
|
334
|
+
maskEnabled,
|
|
335
|
+
singleDateLen
|
|
336
|
+
);
|
|
337
|
+
if (range) commitValue(range);
|
|
338
|
+
};
|
|
339
|
+
const commitPendingOnClose = useCallback(() => {
|
|
340
|
+
const hasOkButton = showTime || needConfirm;
|
|
341
|
+
if (!hasOkButton || !pendingDate) {
|
|
342
|
+
setInputText(getDisplayText());
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const finalDate = showTime ? applyTimeToDate(pendingDate, pendingTime) : pendingDate;
|
|
346
|
+
const currentSingle = type === "date" ? currentValue : null;
|
|
347
|
+
const isSame = currentSingle && finalDate.getTime() === currentSingle.getTime();
|
|
348
|
+
if (isSame) {
|
|
349
|
+
setInputText(getDisplayText());
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
commitValue(finalDate);
|
|
353
|
+
}, [
|
|
354
|
+
showTime,
|
|
355
|
+
needConfirm,
|
|
356
|
+
pendingDate,
|
|
357
|
+
pendingTime,
|
|
358
|
+
type,
|
|
359
|
+
currentValue,
|
|
360
|
+
getDisplayText,
|
|
361
|
+
onChange
|
|
362
|
+
]);
|
|
363
|
+
const closePopover = useCallback(() => {
|
|
364
|
+
commitPendingOnClose();
|
|
365
|
+
setOpen(false);
|
|
366
|
+
}, [commitPendingOnClose, setOpen]);
|
|
367
|
+
useOutsideClickClose({
|
|
368
|
+
enabled: open,
|
|
369
|
+
containerRef,
|
|
370
|
+
popoverElementId: popoverContentId,
|
|
371
|
+
onClose: closePopover
|
|
372
|
+
});
|
|
373
|
+
const openPopover = () => {
|
|
374
|
+
setOpen(true);
|
|
375
|
+
setRangeSelectionStep("from");
|
|
376
|
+
const dateVal = type === "date" ? currentValue : null;
|
|
377
|
+
if (!dateVal) {
|
|
378
|
+
setPendingDate(null);
|
|
379
|
+
setPendingTime(INITIAL_TIME_VALUE);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
setCalendarMonth(dateVal);
|
|
383
|
+
setPendingDate(dateVal);
|
|
384
|
+
setPendingTime(dateToTimeValue(dateVal));
|
|
385
|
+
};
|
|
332
386
|
const handleDateSelect = (selected) => {
|
|
333
387
|
if (!selected) return;
|
|
334
388
|
setCalendarMonth(selected);
|
|
335
389
|
if (showTime || needConfirm) {
|
|
336
390
|
setPendingDate(selected);
|
|
337
|
-
|
|
338
|
-
commitValue(selected);
|
|
339
|
-
setOpen(false);
|
|
340
|
-
onOpenChange?.(false);
|
|
391
|
+
return;
|
|
341
392
|
}
|
|
393
|
+
commitValue(selected);
|
|
394
|
+
setOpen(false);
|
|
342
395
|
};
|
|
343
396
|
const handleRangeSelect = (range) => {
|
|
344
397
|
if (!range) return;
|
|
@@ -347,34 +400,29 @@ const DatePicker = forwardRef(
|
|
|
347
400
|
if (rangeSelectionStep === "from") {
|
|
348
401
|
setInternalValue([from, null]);
|
|
349
402
|
setRangeSelectionStep("to");
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
onOpenChange?.(false);
|
|
358
|
-
}
|
|
359
|
-
} else if (from) {
|
|
360
|
-
setInternalValue([from, null]);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
setRangeSelectionStep("from");
|
|
406
|
+
if (from && to) {
|
|
407
|
+
if (showTime || needConfirm) {
|
|
408
|
+
setPendingDate(from);
|
|
409
|
+
return;
|
|
361
410
|
}
|
|
362
|
-
|
|
411
|
+
commitValue([from, to]);
|
|
412
|
+
setOpen(false);
|
|
413
|
+
return;
|
|
363
414
|
}
|
|
364
|
-
|
|
365
|
-
const handleTimeChange = (time) => {
|
|
366
|
-
setPendingTime(time);
|
|
415
|
+
if (from) setInternalValue([from, null]);
|
|
367
416
|
};
|
|
368
417
|
const handleNow = () => {
|
|
369
418
|
const now = toBrowserLocalDate(/* @__PURE__ */ new Date());
|
|
370
419
|
if (showTime || needConfirm) {
|
|
371
420
|
setPendingDate(now);
|
|
372
421
|
setPendingTime(dateToTimeValue(now));
|
|
373
|
-
|
|
374
|
-
commitValue(now);
|
|
375
|
-
setOpen(false);
|
|
376
|
-
onOpenChange?.(false);
|
|
422
|
+
return;
|
|
377
423
|
}
|
|
424
|
+
commitValue(now);
|
|
425
|
+
setOpen(false);
|
|
378
426
|
};
|
|
379
427
|
const handleOk = () => {
|
|
380
428
|
if (pendingDate) {
|
|
@@ -383,40 +431,12 @@ const DatePicker = forwardRef(
|
|
|
383
431
|
onOk?.(finalDate);
|
|
384
432
|
}
|
|
385
433
|
setOpen(false);
|
|
386
|
-
onOpenChange?.(false);
|
|
387
434
|
};
|
|
388
435
|
const handleClear = (e) => {
|
|
389
436
|
e.stopPropagation();
|
|
390
437
|
e.preventDefault();
|
|
391
438
|
commitValue(null);
|
|
392
439
|
};
|
|
393
|
-
useLayoutEffect(() => {
|
|
394
|
-
if (cursorPosRef.current !== null && inputRef.current && document.activeElement === inputRef.current) {
|
|
395
|
-
inputRef.current.setSelectionRange(
|
|
396
|
-
cursorPosRef.current,
|
|
397
|
-
cursorPosRef.current
|
|
398
|
-
);
|
|
399
|
-
cursorPosRef.current = null;
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
const singleDateLen = useMemo(
|
|
403
|
-
() => buildMaskTemplate(displayFormat).pattern.length,
|
|
404
|
-
[displayFormat]
|
|
405
|
-
);
|
|
406
|
-
const parseAndApplyRange = (text) => {
|
|
407
|
-
const parts = text.split(" - ");
|
|
408
|
-
if (!isDatePartComplete(parts[0] ?? "", maskEnabled, singleDateLen))
|
|
409
|
-
return;
|
|
410
|
-
const from = parseDate(parts[0], displayFormat);
|
|
411
|
-
if (from) setCalendarMonth(from);
|
|
412
|
-
const range = parseRangeText(
|
|
413
|
-
text,
|
|
414
|
-
displayFormat,
|
|
415
|
-
maskEnabled,
|
|
416
|
-
singleDateLen
|
|
417
|
-
);
|
|
418
|
-
if (range) commitValue(range);
|
|
419
|
-
};
|
|
420
440
|
const handleInputChange = (e) => {
|
|
421
441
|
let text = e.target.value;
|
|
422
442
|
if (maskTemplate) {
|
|
@@ -442,12 +462,18 @@ const DatePicker = forwardRef(
|
|
|
442
462
|
if (showTime || needConfirm) {
|
|
443
463
|
setPendingDate(parsed);
|
|
444
464
|
setPendingTime(dateToTimeValue(parsed));
|
|
445
|
-
|
|
446
|
-
commitValue(parsed);
|
|
465
|
+
return;
|
|
447
466
|
}
|
|
467
|
+
commitValue(parsed);
|
|
448
468
|
};
|
|
449
469
|
const handleInputKeyDown = (e) => {
|
|
450
|
-
if (e.key === "Escape")
|
|
470
|
+
if (e.key === "Escape") {
|
|
471
|
+
setPendingDate(null);
|
|
472
|
+
setPendingTime(INITIAL_TIME_VALUE);
|
|
473
|
+
setInputText(getDisplayText());
|
|
474
|
+
setOpen(false);
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
451
477
|
if (e.key !== "Enter") return;
|
|
452
478
|
if (type === "range") {
|
|
453
479
|
const range = parseRangeText(
|
|
@@ -462,29 +488,26 @@ const DatePicker = forwardRef(
|
|
|
462
488
|
if (parsed) commitValue(parsed);
|
|
463
489
|
}
|
|
464
490
|
setOpen(false);
|
|
465
|
-
onOpenChange?.(false);
|
|
466
491
|
};
|
|
467
|
-
const
|
|
468
|
-
|
|
492
|
+
const handleInputBlur = (e) => {
|
|
493
|
+
const next = e.relatedTarget;
|
|
494
|
+
if (next && containerRef.current?.contains(next)) return;
|
|
495
|
+
const popoverEl = document.getElementById(popoverContentId);
|
|
496
|
+
if (next && popoverEl?.contains(next)) return;
|
|
497
|
+
onBlur?.(e);
|
|
469
498
|
};
|
|
499
|
+
useEffect(() => {
|
|
500
|
+
if (!open) setInputText(getDisplayText());
|
|
501
|
+
}, [getDisplayText, open]);
|
|
502
|
+
useCursorRestore([{ inputRef, cursorRef: cursorPosRef }]);
|
|
470
503
|
const hasField = !!(label || error || helpText);
|
|
471
504
|
const showFooter = showTime || needConfirm || !!onTimezoneChange;
|
|
472
505
|
const todayDate = toBrowserLocalDate(/* @__PURE__ */ new Date());
|
|
473
506
|
const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
|
|
474
|
-
const
|
|
475
|
-
(date) => {
|
|
476
|
-
if (minDate && date < new Date(minDate.setHours(0, 0, 0, 0)))
|
|
477
|
-
return true;
|
|
478
|
-
if (maxDate && date > new Date(maxDate.setHours(23, 59, 59, 999)))
|
|
479
|
-
return true;
|
|
480
|
-
return false;
|
|
481
|
-
},
|
|
482
|
-
[minDate, maxDate]
|
|
483
|
-
);
|
|
484
|
-
const calendarSelected = useCallback(() => {
|
|
507
|
+
const calendarSelected = () => {
|
|
485
508
|
if (showTime || needConfirm) return pendingDate ?? void 0;
|
|
486
509
|
return currentValue ?? void 0;
|
|
487
|
-
}
|
|
510
|
+
};
|
|
488
511
|
const triggerContent = /* @__PURE__ */ jsxs(Popover, { open, children: [
|
|
489
512
|
/* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
490
513
|
"div",
|
|
@@ -518,7 +541,10 @@ const DatePicker = forwardRef(
|
|
|
518
541
|
value: inputText,
|
|
519
542
|
onChange: handleInputChange,
|
|
520
543
|
onKeyDown: handleInputKeyDown,
|
|
521
|
-
onFocus:
|
|
544
|
+
onFocus: () => {
|
|
545
|
+
if (!open) openPopover();
|
|
546
|
+
},
|
|
547
|
+
onBlur: handleInputBlur,
|
|
522
548
|
className: cn(
|
|
523
549
|
"min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground",
|
|
524
550
|
"disabled:cursor-not-allowed",
|
|
@@ -595,7 +621,7 @@ const DatePicker = forwardRef(
|
|
|
595
621
|
TimePickerPanel,
|
|
596
622
|
{
|
|
597
623
|
value: pendingTime,
|
|
598
|
-
onChange:
|
|
624
|
+
onChange: setPendingTime,
|
|
599
625
|
format: timePickerFormat,
|
|
600
626
|
showSeconds,
|
|
601
627
|
disabled
|
|
@@ -651,4 +677,4 @@ const DatePicker = forwardRef(
|
|
|
651
677
|
DatePicker.displayName = "DatePicker";
|
|
652
678
|
|
|
653
679
|
export { DatePicker as D };
|
|
654
|
-
//# sourceMappingURL=DatePicker-
|
|
680
|
+
//# sourceMappingURL=DatePicker-DGf2BiNq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker-DGf2BiNq.js","sources":["../node_modules/lucide-react/dist/esm/icons/calendar.js","../src/components/DatePicker/constants.ts","../src/components/DatePicker/utils.ts","../src/components/DatePicker/TimezoneSelect.tsx","../src/components/DatePicker/DatePickerFooter.tsx","../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n];\nconst Calendar = createLucideIcon(\"calendar\", __iconNode);\n\nexport { __iconNode, Calendar as default };\n//# sourceMappingURL=calendar.js.map\n","import type { TimeValue } from \"../TimePicker/types\";\n\nexport const DEFAULT_DATE_FORMAT = \"dd/MM/yyyy\";\nexport const DEFAULT_TIME_FORMAT = \"HH:mm:ss\";\n\nexport const INITIAL_TIME_VALUE: TimeValue = {\n hours: 0,\n minutes: 0,\n seconds: 0,\n};\n\nexport const SIZE_CONFIG = {\n small: {\n trigger: \"h-8 md:h-7\",\n input: \"text-base md:text-xs\",\n icon: \"size-3.5\",\n },\n medium: {\n trigger: \"h-8\",\n input: \"text-base md:text-sm\",\n icon: \"size-4\",\n },\n large: {\n trigger: \"h-10\",\n input: \"text-base md:text-sm\",\n icon: \"size-5\",\n },\n} as const;\n","import pureDayjs from \"dayjs\";\nimport type { Dayjs } from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport { dayjs } from \"@bigbinary/neeto-commons-frontend/utils\";\n\nimport type { TimeValue } from \"../TimePicker/types\";\n\npureDayjs.extend(customParseFormat);\n\n/**\n * Reverse timezone conversion: extract date/time values from a timezone-aware\n * dayjs and create a browser-local Date. This undoes applyTimezone so that\n * Calendar and input display the correct date after a controlled round-trip.\n */\nexport const toBrowserLocalDate = (date: Date): Date => {\n const d = dayjs(date);\n\n return new Date(\n d.year(),\n d.month(),\n d.date(),\n d.hour(),\n d.minute(),\n d.second()\n );\n};\n\nconst toNativeDate = (value: unknown): Date | null => {\n if (value == null) return null;\n if (value instanceof Date) return value;\n\n if (typeof (value as { toDate?: () => Date }).toDate === \"function\") {\n return toBrowserLocalDate((value as { toDate: () => Date }).toDate());\n }\n\n if (typeof value === \"string\") {\n const parsed = new Date(value);\n if (!isNaN(parsed.getTime())) return toBrowserLocalDate(parsed);\n }\n\n return null;\n};\n\nexport const coerceDateValue = (\n value: unknown,\n type: \"date\" | \"range\"\n): Date | [Date | null, Date | null] | null => {\n if (value == null) return null;\n if (type === \"range\" && Array.isArray(value)) {\n return [toNativeDate(value[0]), toNativeDate(value[1])];\n }\n\n return toNativeDate(value);\n};\n\nconst normalizeToDayjsFormat = (fmt: string): string =>\n fmt\n .replace(/\\byyyy\\b/g, \"YYYY\")\n .replace(/\\byy\\b/g, \"YY\")\n .replace(/\\bdd\\b/g, \"DD\")\n .replace(/\\bd\\b/g, \"D\");\n\nconst normalizeToDateFnsFormat = (fmt: string): string =>\n fmt\n .replace(/YYYY/g, \"yyyy\")\n .replace(/YY/g, \"yy\")\n .replace(/DD/g, \"dd\")\n .replace(/\\bD\\b/g, \"d\");\n\n/**\n * Format a date for display using browser-local time.\n * Calendar and input always show browser-local dates.\n */\nexport const formatDate = (date: Date | null, formatStr: string): string => {\n if (!date) return \"\";\n\n try {\n return pureDayjs(date).format(normalizeToDayjsFormat(formatStr));\n } catch {\n return \"\";\n }\n};\n\n/**\n * Parse a date string using browser-local pureDayjs (not timezone-aware).\n * The user types in browser-local time; timezone conversion happens\n * later in commitValue via applyTimezone.\n */\nexport const parseDate = (str: string, formatStr: string): Date | null => {\n if (!str) return null;\n\n const dayjsFmt = normalizeToDayjsFormat(formatStr);\n const parsed = pureDayjs(str, dayjsFmt);\n if (parsed.isValid()) return parsed.toDate();\n\n const fallbackFormats = [\n \"DD/MM/YYYY\",\n \"MM/DD/YYYY\",\n \"YYYY-MM-DD\",\n \"DD-MM-YYYY\",\n \"DD/MM/YYYY HH:mm:ss\",\n \"DD/MM/YYYY HH:mm\",\n ];\n\n for (const fmt of fallbackFormats) {\n if (fmt === dayjsFmt) continue;\n\n const attempt = pureDayjs(str, fmt);\n if (attempt.isValid()) return attempt.toDate();\n }\n\n return null;\n};\n\nexport const applyTimeToDate = (date: Date, time: TimeValue): Date => {\n const result = new Date(date);\n result.setHours(time.hours, time.minutes, time.seconds ?? 0, 0);\n\n return result;\n};\n\n/**\n * Reinterpret a native Date's browser-local time values in the user's configured timezone.\n * Formats in browser-local time (pureDayjs), then reparses through timezone-aware dayjs.\n * Matches neetoUI's getTimezoneAppliedDateTime behavior.\n */\nexport const applyTimezone = (date: Date): Date => {\n const dateStr = pureDayjs(date).format(\"YYYY-MM-DD HH:mm:ss\");\n\n return dayjs(dateStr).toDate();\n};\n\nexport const toDayjs = (date: Date): Dayjs => dayjs(date);\n\nexport const getDisplayFormat = (\n dateFormat: string,\n timeFormat: string,\n showTime: boolean\n): string => {\n const fmt = showTime ? `${dateFormat} ${timeFormat}` : dateFormat;\n\n return normalizeToDateFnsFormat(fmt);\n};\n\nexport const getDatePlaceholder = (\n dateFormat: string,\n timeFormat: string,\n showTime: boolean,\n type: \"date\" | \"range\"\n): string => {\n const single = showTime\n ? `${dateFormat.toUpperCase()} ${timeFormat}`\n : dateFormat.toUpperCase();\n\n return type === \"range\" ? `${single} - ${single}` : single;\n};\n\nexport const isDatePartComplete = (\n part: string,\n maskEnabled: boolean,\n singleDateLen: number\n): boolean => (maskEnabled ? part.length >= singleDateLen : part.length > 0);\n\nexport const parseRangeText = (\n text: string,\n displayFormat: string,\n maskEnabled: boolean,\n singleDateLen: number\n): [Date, Date] | null => {\n const parts = text.split(\" - \");\n if (parts.length !== 2) return null;\n\n if (\n !isDatePartComplete(parts[0], maskEnabled, singleDateLen) ||\n !isDatePartComplete(parts[1], maskEnabled, singleDateLen)\n )\n return null;\n\n const from = parseDate(parts[0], displayFormat);\n const to = parseDate(parts[1], displayFormat);\n\n return from && to ? [from, to] : null;\n};\n","import React from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\ninterface TimezoneSelectProps {\n value?: string;\n onChange: (tz: string | undefined) => void;\n className?: string;\n}\n\nconst TIMEZONE_OPTIONS = [\n { label: \"Local\", value: \"\" },\n { label: \"UTC\", value: \"utc\" },\n] as const;\n\nconst TimezoneSelect: React.FC<TimezoneSelectProps> = ({\n value,\n onChange,\n className,\n}) => (\n <div className={cn(\"flex items-center gap-1.5 text-sm\", className)}>\n <span className=\"text-muted-foreground text-xs\">Timezone</span>\n <select\n value={value ?? \"\"}\n onChange={e => onChange(e.target.value || undefined)}\n className={cn(\n \"rounded-md border border-input bg-background px-2 py-0.5 text-xs\",\n \"focus:outline-none focus:ring-1 focus:ring-ring\"\n )}\n aria-label=\"Select timezone\"\n >\n {TIMEZONE_OPTIONS.map(opt => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n);\n\nTimezoneSelect.displayName = \"TimezoneSelect\";\n\nexport { TimezoneSelect };\n","import React from \"react\";\n\nimport { Button } from \"src/primitives/Button\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { TimezoneSelect } from \"./TimezoneSelect\";\n\ninterface DatePickerFooterProps {\n showTime?: boolean;\n needConfirm?: boolean;\n timezone?: string;\n onTimezoneChange?: (tz: string | undefined) => void;\n onNow: () => void;\n onOk: () => void;\n className?: string;\n}\n\nconst DatePickerFooter: React.FC<DatePickerFooterProps> = ({\n showTime,\n needConfirm,\n timezone,\n onTimezoneChange,\n onNow,\n onOk,\n className,\n}) => {\n const showOkButton = showTime || needConfirm;\n\n return (\n <div\n className={cn(\n \"flex items-center border-t border-border px-3 py-2\",\n className\n )}\n >\n <Button variant=\"ghost\" size=\"sm\" onClick={onNow} className=\"text-xs\">\n Now\n </Button>\n <div className=\"flex-1\" />\n {onTimezoneChange && (\n <TimezoneSelect\n value={timezone}\n onChange={onTimezoneChange}\n className=\"me-2\"\n />\n )}\n {showOkButton && (\n <Button size=\"sm\" onClick={onOk} className=\"text-xs\">\n OK\n </Button>\n )}\n </div>\n );\n};\n\nDatePickerFooter.displayName = \"DatePickerFooter\";\n\nexport { DatePickerFooter };\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { CalendarIcon, X } from \"lucide-react\";\nimport { Calendar } from \"src/primitives/Calendar\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"src/primitives/Popover\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { useControlledOpen } from \"src/hooks/useControlledOpen\";\nimport { useCursorRestore } from \"src/hooks/useCursorRestore\";\nimport { useOutsideClickClose } from \"src/hooks/useOutsideClickClose\";\n\nimport type { DatePickerProps } from \"./types\";\nimport {\n DEFAULT_DATE_FORMAT,\n DEFAULT_TIME_FORMAT,\n INITIAL_TIME_VALUE,\n SIZE_CONFIG,\n} from \"./constants\";\nimport {\n applyTimeToDate,\n applyTimezone,\n toBrowserLocalDate,\n coerceDateValue,\n formatDate,\n getDatePlaceholder,\n getDisplayFormat,\n isDatePartComplete,\n parseDate,\n parseRangeText,\n toDayjs,\n} from \"./utils\";\nimport {\n applyMask,\n buildMaskTemplate,\n buildRangeMaskTemplate,\n isFixedWidthFormat,\n} from \"src/utils/inputMask\";\nimport { DatePickerFooter } from \"./DatePickerFooter\";\nimport { TimePickerPanel } from \"../TimePicker/TimePickerPanel\";\nimport { dateToTimeValue } from \"../TimePicker/utils\";\n\nconst DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onBlur,\n type = \"date\",\n dateFormat = DEFAULT_DATE_FORMAT,\n timeFormat = DEFAULT_TIME_FORMAT,\n showTime = false,\n timePickerFormat = \"24\",\n showSeconds = false,\n minDate,\n maxDate,\n placeholder,\n label,\n error,\n helpText,\n size = \"medium\",\n disabled = false,\n allowClear = true,\n required = false,\n timezone,\n onTimezoneChange,\n onOk,\n needConfirm = false,\n open: openProp,\n onOpenChange,\n className,\n labelProps,\n },\n ref\n ) => {\n const generatedId = useId();\n const errorId = `error_${generatedId}`;\n const helpTextId = `helpText_${generatedId}`;\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPosRef = useRef<number | null>(null);\n\n const popoverContentId = useRef(\n `datepicker-popover-${generatedId}`\n ).current;\n\n const { open, setOpen } = useControlledOpen(openProp, onOpenChange);\n\n const [internalValue, setInternalValue] = useState(\n coerceDateValue(defaultValue, type) ?? null\n );\n\n const [calendarMonth, setCalendarMonth] = useState(\n (type === \"date\"\n ? ((value as Date | null) ?? (defaultValue as Date | null))\n : null) ?? new Date()\n );\n\n const [rangeSelectionStep, setRangeSelectionStep] = useState<\"from\" | \"to\">(\n \"from\"\n );\n\n const [pendingDate, setPendingDate] = useState<Date | null>(null);\n const [pendingTime, setPendingTime] = useState(INITIAL_TIME_VALUE);\n\n const currentValue =\n value !== undefined ? coerceDateValue(value, type) : internalValue;\n\n const displayFormat = getDisplayFormat(dateFormat, timeFormat, showTime);\n const sizeConfig = SIZE_CONFIG[size];\n const maskEnabled = isFixedWidthFormat(displayFormat);\n\n const defaultPlaceholder = getDatePlaceholder(\n dateFormat,\n timeFormat,\n showTime,\n type\n );\n\n const maskTemplate = useMemo(\n () =>\n maskEnabled\n ? type === \"range\"\n ? buildRangeMaskTemplate(displayFormat)\n : buildMaskTemplate(displayFormat)\n : null,\n [displayFormat, type, maskEnabled]\n );\n\n const singleDateLen = useMemo(\n () => buildMaskTemplate(displayFormat).pattern.length,\n [displayFormat]\n );\n\n const calendarDisabled = useCallback(\n (date: Date) => {\n if (minDate && date < new Date(minDate.setHours(0, 0, 0, 0)))\n return true;\n if (maxDate && date > new Date(maxDate.setHours(23, 59, 59, 999)))\n return true;\n\n return false;\n },\n [minDate, maxDate]\n );\n\n const getDisplayText = useCallback(() => {\n if (type !== \"range\") {\n return formatDate(currentValue as Date | null, displayFormat);\n }\n\n const rangeValue = currentValue as [Date | null, Date | null] | null;\n if (!rangeValue || (!rangeValue[0] && !rangeValue[1])) return \"\";\n\n const from = rangeValue[0]\n ? formatDate(rangeValue[0], displayFormat)\n : \"\";\n const to = rangeValue[1] ? formatDate(rangeValue[1], displayFormat) : \"\";\n\n return `${from} - ${to}`;\n }, [currentValue, displayFormat, type]);\n\n const [inputText, setInputText] = useState(() => getDisplayText());\n\n const commitValue = (date: Date | [Date, Date] | null) => {\n if (date === null) {\n setInternalValue(null);\n onChange?.(null, \"\");\n setInputText(\"\");\n\n return;\n }\n\n // Store the unshifted date for Calendar display (uses browser-local timezone).\n // Only pass timezone-converted values to onChange.\n if (Array.isArray(date)) {\n setInternalValue(date);\n const converted: [Date, Date] = [\n applyTimezone(date[0]),\n applyTimezone(date[1]),\n ];\n const formatted: [string, string] = [\n formatDate(date[0], displayFormat),\n formatDate(date[1], displayFormat),\n ];\n onChange?.([toDayjs(converted[0]), toDayjs(converted[1])], formatted);\n setInputText(`${formatted[0]} - ${formatted[1]}`);\n\n return;\n }\n\n setInternalValue(date);\n const converted = applyTimezone(date);\n const formatted = formatDate(date, displayFormat);\n onChange?.(toDayjs(converted), formatted);\n setInputText(formatted);\n };\n\n const parseAndApplyRange = (text: string) => {\n const parts = text.split(\" - \");\n if (!isDatePartComplete(parts[0] ?? \"\", maskEnabled, singleDateLen))\n return;\n\n const from = parseDate(parts[0], displayFormat);\n if (from) setCalendarMonth(from);\n\n const range = parseRangeText(\n text,\n displayFormat,\n maskEnabled,\n singleDateLen\n );\n\n if (range) commitValue(range);\n };\n\n const commitPendingOnClose = useCallback(() => {\n const hasOkButton = showTime || needConfirm;\n if (!hasOkButton || !pendingDate) {\n setInputText(getDisplayText());\n\n return;\n }\n\n const finalDate = showTime\n ? applyTimeToDate(pendingDate, pendingTime)\n : pendingDate;\n\n const currentSingle =\n type === \"date\" ? (currentValue as Date | null) : null;\n\n const isSame =\n currentSingle && finalDate.getTime() === currentSingle.getTime();\n\n if (isSame) {\n setInputText(getDisplayText());\n\n return;\n }\n\n commitValue(finalDate);\n }, [\n showTime,\n needConfirm,\n pendingDate,\n pendingTime,\n type,\n currentValue,\n getDisplayText,\n onChange,\n ]);\n\n const closePopover = useCallback(() => {\n commitPendingOnClose();\n setOpen(false);\n }, [commitPendingOnClose, setOpen]);\n\n useOutsideClickClose({\n enabled: open,\n containerRef,\n popoverElementId: popoverContentId,\n onClose: closePopover,\n });\n\n const openPopover = () => {\n setOpen(true);\n setRangeSelectionStep(\"from\");\n\n const dateVal = type === \"date\" ? (currentValue as Date | null) : null;\n if (!dateVal) {\n setPendingDate(null);\n setPendingTime(INITIAL_TIME_VALUE);\n\n return;\n }\n\n setCalendarMonth(dateVal);\n setPendingDate(dateVal);\n setPendingTime(dateToTimeValue(dateVal));\n };\n\n const handleDateSelect = (selected: Date | undefined) => {\n if (!selected) return;\n\n setCalendarMonth(selected);\n\n if (showTime || needConfirm) {\n setPendingDate(selected);\n\n return;\n }\n\n commitValue(selected);\n setOpen(false);\n };\n\n const handleRangeSelect = (\n range: { from?: Date; to?: Date } | undefined\n ) => {\n if (!range) return;\n\n const from = range.from ?? null;\n const to = range.to ?? null;\n\n if (rangeSelectionStep === \"from\") {\n setInternalValue([from, null]);\n setRangeSelectionStep(\"to\");\n\n return;\n }\n\n setRangeSelectionStep(\"from\");\n\n if (from && to) {\n if (showTime || needConfirm) {\n setPendingDate(from);\n\n return;\n }\n\n commitValue([from, to]);\n setOpen(false);\n\n return;\n }\n\n if (from) setInternalValue([from, null]);\n };\n\n const handleNow = () => {\n const now = toBrowserLocalDate(new Date());\n\n if (showTime || needConfirm) {\n setPendingDate(now);\n setPendingTime(dateToTimeValue(now));\n\n return;\n }\n\n commitValue(now);\n setOpen(false);\n };\n\n const handleOk = () => {\n if (pendingDate) {\n const finalDate = showTime\n ? applyTimeToDate(pendingDate, pendingTime)\n : pendingDate;\n\n commitValue(finalDate);\n onOk?.(finalDate);\n }\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n commitValue(null);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let text = e.target.value;\n\n if (maskTemplate) {\n const masked = applyMask(\n text,\n maskTemplate,\n inputText,\n e.target.selectionStart\n );\n\n text = masked.text;\n cursorPosRef.current = masked.cursorPosition;\n }\n\n setInputText(text);\n\n if (type === \"range\") {\n parseAndApplyRange(text);\n\n return;\n }\n\n const isComplete = maskTemplate\n ? text.length >= maskTemplate.pattern.length\n : true;\n\n if (!isComplete) return;\n\n const parsed = parseDate(text, displayFormat);\n if (!parsed) return;\n\n setCalendarMonth(parsed);\n\n if (showTime || needConfirm) {\n setPendingDate(parsed);\n setPendingTime(dateToTimeValue(parsed));\n\n return;\n }\n\n commitValue(parsed);\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n setPendingDate(null);\n setPendingTime(INITIAL_TIME_VALUE);\n setInputText(getDisplayText());\n setOpen(false);\n\n return;\n }\n\n if (e.key !== \"Enter\") return;\n\n if (type === \"range\") {\n const range = parseRangeText(\n inputText,\n displayFormat,\n maskEnabled,\n singleDateLen\n );\n if (range) commitValue(range);\n } else {\n const parsed = parseDate(inputText, displayFormat);\n if (parsed) commitValue(parsed);\n }\n\n setOpen(false);\n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const next = e.relatedTarget as HTMLElement | null;\n if (next && containerRef.current?.contains(next)) return;\n\n const popoverEl = document.getElementById(popoverContentId);\n if (next && popoverEl?.contains(next)) return;\n\n onBlur?.(e);\n };\n\n useEffect(() => {\n if (!open) setInputText(getDisplayText());\n }, [getDisplayText, open]);\n\n useCursorRestore([{ inputRef, cursorRef: cursorPosRef }]);\n\n const hasField = !!(label || error || helpText);\n const showFooter = showTime || needConfirm || !!onTimezoneChange;\n const todayDate = toBrowserLocalDate(new Date());\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const calendarSelected = () => {\n if (showTime || needConfirm) return pendingDate ?? undefined;\n\n return (currentValue as Date | undefined) ?? undefined;\n };\n\n const triggerContent = (\n <Popover open={open}>\n <PopoverAnchor asChild>\n <div\n ref={containerRef}\n className={cn(\n \"relative flex w-full items-center gap-2 rounded-md border border-input bg-background pe-8 ps-3\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\n disabled && \"cursor-not-allowed opacity-50\",\n !!error && \"border-destructive ring-destructive/20 ring-3\",\n sizeConfig.trigger,\n !hasField && className\n )}\n >\n <CalendarIcon\n className={cn(\"shrink-0 text-muted-foreground\", sizeConfig.icon)}\n />\n <input\n ref={inputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={label || \"Pick a date\"}\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? defaultPlaceholder}\n value={inputText}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onFocus={() => {\n if (!open) openPopover();\n }}\n onBlur={handleInputBlur}\n className={cn(\n \"min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeConfig.input\n )}\n />\n {timezone && (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">\n {timezone.toUpperCase()}\n </span>\n )}\n {allowClear && (\n <button\n type=\"button\"\n onPointerDown={e => e.preventDefault()}\n onClick={handleClear}\n className={cn(\n \"absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none\",\n !(inputText && !disabled) && \"invisible\"\n )}\n aria-label=\"Clear date\"\n tabIndex={-1}\n >\n <X className={sizeConfig.icon} />\n </button>\n )}\n </div>\n </PopoverAnchor>\n {open && (\n <PopoverContent\n id={popoverContentId}\n className=\"w-auto p-0\"\n align=\"start\"\n onOpenAutoFocus={e => e.preventDefault()}\n onCloseAutoFocus={e => e.preventDefault()}\n onPointerDownOutside={e => e.preventDefault()}\n onInteractOutside={e => e.preventDefault()}\n >\n <div className={cn(\"flex\", showTime && \"flex-row\")}>\n {type === \"date\" ? (\n <Calendar\n mode=\"single\"\n captionLayout=\"dropdown\"\n today={todayDate}\n month={calendarMonth}\n onMonthChange={setCalendarMonth}\n selected={calendarSelected()}\n onSelect={handleDateSelect}\n disabled={calendarDisabled}\n {...(minDate && { fromDate: minDate })}\n {...(maxDate && { toDate: maxDate })}\n />\n ) : (\n <Calendar\n mode=\"range\"\n numberOfMonths={2}\n captionLayout=\"dropdown\"\n today={todayDate}\n className=\"[&_[data-outside][data-selected=true]]:!bg-transparent [&_[data-outside][data-selected=true]]:after:!bg-transparent [&_[data-outside]_button]:!bg-transparent [&_[data-outside]_button]:!text-muted-foreground\"\n month={calendarMonth}\n onMonthChange={setCalendarMonth}\n selected={\n currentValue\n ? {\n from:\n (currentValue as [Date | null, Date | null])[0] ??\n undefined,\n to:\n (currentValue as [Date | null, Date | null])[1] ??\n undefined,\n }\n : undefined\n }\n onSelect={handleRangeSelect}\n disabled={calendarDisabled}\n {...(minDate && { fromDate: minDate })}\n {...(maxDate && { toDate: maxDate })}\n />\n )}\n {showTime && (\n <div className=\"border-inline-start border-border\">\n <TimePickerPanel\n value={pendingTime}\n onChange={setPendingTime}\n format={timePickerFormat}\n showSeconds={showSeconds}\n disabled={disabled}\n />\n </div>\n )}\n </div>\n {showFooter && (\n <DatePickerFooter\n showTime={showTime}\n needConfirm={needConfirm}\n timezone={timezone}\n onTimezoneChange={onTimezoneChange}\n onNow={handleNow}\n onOk={handleOk}\n />\n )}\n </PopoverContent>\n )}\n </Popover>\n );\n\n if (!hasField) {\n return (\n <div ref={ref} className={className}>\n {triggerContent}\n </div>\n );\n }\n\n return (\n <Field\n ref={ref}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {label && (\n <FieldLabel\n {...(labelProps as React.ComponentProps<typeof FieldLabel>)}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n <FieldContent>\n {triggerContent}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nDatePicker.displayName = \"DatePicker\";\n\nexport { DatePicker };\n"],"names":["converted","formatted","CalendarIcon","Calendar"],"mappings":"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","x_google_ignoreList":[0]}
|