@osdk/react-components 0.21.0 → 0.21.1-main-d20976242ef20c16cb57f76e9439ab3d4a9fd36e
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/CHANGELOG.md +6 -0
- package/build/browser/shared/calendar/DateCalendar.js +27 -4
- package/build/browser/shared/calendar/DateCalendar.js.map +1 -1
- package/build/browser/shared/calendar/DatePicker.js +4 -17
- package/build/browser/shared/calendar/DatePicker.js.map +1 -1
- package/build/browser/shared/calendar/DatePicker.module.css +0 -5
- package/build/browser/shared/calendar/DatePicker.module.css.js +1 -2
- package/build/browser/shared/calendar/DateRangePicker.js +4 -2
- package/build/browser/shared/calendar/DateRangePicker.js.map +1 -1
- package/build/browser/shared/calendar/TimePicker.js +24 -45
- package/build/browser/shared/calendar/TimePicker.js.map +1 -1
- package/build/browser/styles.css +0 -5
- package/build/browser/util/UserAgent.js +1 -1
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/cjs/{DateCalendar-OLI4WF2E.cjs → DateCalendar-PZO23MYM.cjs} +6 -6
- package/build/cjs/{DateCalendar-OLI4WF2E.cjs.map → DateCalendar-PZO23MYM.cjs.map} +1 -1
- package/build/cjs/{DateCalendar-7E5ZCI7U.css → DateCalendar-XTX3RI6O.css} +35 -1
- package/build/cjs/DateCalendar-XTX3RI6O.css.map +1 -0
- package/build/cjs/DateRangeCalendar-2MBQAU3Z.cjs +12 -0
- package/build/cjs/{DateRangeCalendar-TC7G2J2D.cjs.map → DateRangeCalendar-2MBQAU3Z.cjs.map} +1 -1
- package/build/cjs/{DateRangeCalendar-R3RYMAD4.css → DateRangeCalendar-R7KHDKJT.css} +35 -1
- package/build/cjs/DateRangeCalendar-R7KHDKJT.css.map +1 -0
- package/build/cjs/{chunk-53QFFROW.cjs → chunk-3H7C6RMF.cjs} +4 -4
- package/build/cjs/{chunk-53QFFROW.cjs.map → chunk-3H7C6RMF.cjs.map} +1 -1
- package/build/cjs/{chunk-Y6BGC7DP.cjs → chunk-3S52UDZM.cjs} +22 -22
- package/build/cjs/{chunk-Y6BGC7DP.cjs.map → chunk-3S52UDZM.cjs.map} +1 -1
- package/build/cjs/{chunk-TIFUKHW7.cjs → chunk-4TXNAWFI.cjs} +3 -3
- package/build/cjs/chunk-4TXNAWFI.cjs.map +1 -0
- package/build/cjs/{chunk-RHIG474S.cjs → chunk-5LAEKDKK.cjs} +4 -4
- package/build/cjs/{chunk-RHIG474S.cjs.map → chunk-5LAEKDKK.cjs.map} +1 -1
- package/build/cjs/{chunk-MZPKV7JC.cjs → chunk-5MKZ3BOU.cjs} +4 -4
- package/build/cjs/{chunk-MZPKV7JC.cjs.map → chunk-5MKZ3BOU.cjs.map} +1 -1
- package/build/cjs/chunk-767V4XT2.cjs +11 -0
- package/build/cjs/{chunk-DUQXYBH2.cjs.map → chunk-767V4XT2.cjs.map} +1 -1
- package/build/cjs/{chunk-FIM67ZE2.cjs → chunk-DAB2LPFK.cjs} +51 -51
- package/build/cjs/{chunk-FIM67ZE2.cjs.map → chunk-DAB2LPFK.cjs.map} +1 -1
- package/build/cjs/chunk-DE2WFN67.cjs +11 -0
- package/build/cjs/{chunk-VA2HOEKY.cjs.map → chunk-DE2WFN67.cjs.map} +1 -1
- package/build/cjs/{chunk-XA3S7YAO.cjs → chunk-E5OKIBYJ.cjs} +145 -317
- package/build/cjs/chunk-E5OKIBYJ.cjs.map +1 -0
- package/build/cjs/chunk-FAB2KBRR.cjs +11 -0
- package/build/cjs/{chunk-F2WUXH2W.cjs.map → chunk-FAB2KBRR.cjs.map} +1 -1
- package/build/cjs/{chunk-ZGW2CPEY.cjs → chunk-FTYNB3YF.cjs} +11 -11
- package/build/cjs/{chunk-ZGW2CPEY.cjs.map → chunk-FTYNB3YF.cjs.map} +1 -1
- package/build/cjs/{chunk-LBWASTWS.cjs → chunk-KPLJJZUF.cjs} +12 -12
- package/build/cjs/{chunk-LBWASTWS.cjs.map → chunk-KPLJJZUF.cjs.map} +1 -1
- package/build/cjs/chunk-NE7GRF7G.cjs +366 -0
- package/build/cjs/chunk-NE7GRF7G.cjs.map +1 -0
- package/build/cjs/chunk-PG46DLZI.cjs +11 -0
- package/build/cjs/{chunk-XBIJFLHM.cjs.map → chunk-PG46DLZI.cjs.map} +1 -1
- package/build/cjs/{chunk-5XDYMIRI.cjs → chunk-QSVNGTXV.cjs} +17 -17
- package/build/cjs/{chunk-5XDYMIRI.cjs.map → chunk-QSVNGTXV.cjs.map} +1 -1
- package/build/cjs/chunk-S67TNE3N.cjs +11 -0
- package/build/cjs/{chunk-JOVWU475.cjs.map → chunk-S67TNE3N.cjs.map} +1 -1
- package/build/cjs/{chunk-7NQZT4VM.cjs → chunk-XKD7L2LV.cjs} +4 -4
- package/build/cjs/{chunk-7NQZT4VM.cjs.map → chunk-XKD7L2LV.cjs.map} +1 -1
- package/build/cjs/public/experimental/action-form.cjs +8 -8
- package/build/cjs/public/experimental/action-form.css +34 -38
- package/build/cjs/public/experimental/action-form.css.map +1 -1
- package/build/cjs/public/experimental/document-viewer.cjs +4 -4
- package/build/cjs/public/experimental/email-viewer.cjs +3 -3
- package/build/cjs/public/experimental/excel-viewer.cjs +3 -3
- package/build/cjs/public/experimental/filter-list.cjs +17 -17
- package/build/cjs/public/experimental/filter-list.css +34 -38
- package/build/cjs/public/experimental/filter-list.css.map +1 -1
- package/build/cjs/public/experimental/image-viewer.cjs +3 -3
- package/build/cjs/public/experimental/markdown-renderer.cjs +3 -3
- package/build/cjs/public/experimental/object-table.cjs +12 -12
- package/build/cjs/public/experimental/object-table.css +34 -38
- package/build/cjs/public/experimental/object-table.css.map +1 -1
- package/build/cjs/public/experimental/pdf-viewer.cjs +7 -7
- package/build/cjs/public/experimental/tiff-renderer.cjs +3 -3
- package/build/cjs/public/experimental/video-viewer.cjs +3 -3
- package/build/cjs/public/experimental/xml-viewer.cjs +3 -3
- package/build/cjs/public/experimental.cjs +51 -51
- package/build/cjs/public/experimental.css +34 -38
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/esm/shared/calendar/DateCalendar.js +27 -4
- package/build/esm/shared/calendar/DateCalendar.js.map +1 -1
- package/build/esm/shared/calendar/DatePicker.js +4 -17
- package/build/esm/shared/calendar/DatePicker.js.map +1 -1
- package/build/esm/shared/calendar/DatePicker.module.css +0 -5
- package/build/esm/shared/calendar/DateRangePicker.js +4 -2
- package/build/esm/shared/calendar/DateRangePicker.js.map +1 -1
- package/build/esm/shared/calendar/TimePicker.js +24 -45
- package/build/esm/shared/calendar/TimePicker.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/types/shared/calendar/DateCalendar.d.ts +2 -2
- package/build/types/shared/calendar/DateCalendar.d.ts.map +1 -1
- package/build/types/shared/calendar/DatePicker.d.ts.map +1 -1
- package/build/types/shared/calendar/TimePicker.d.ts.map +1 -1
- package/package.json +4 -4
- package/build/cjs/DateCalendar-7E5ZCI7U.css.map +0 -1
- package/build/cjs/DateRangeCalendar-R3RYMAD4.css.map +0 -1
- package/build/cjs/DateRangeCalendar-TC7G2J2D.cjs +0 -12
- package/build/cjs/chunk-DUQXYBH2.cjs +0 -11
- package/build/cjs/chunk-F2WUXH2W.cjs +0 -11
- package/build/cjs/chunk-JBRNNWYC.cjs +0 -197
- package/build/cjs/chunk-JBRNNWYC.cjs.map +0 -1
- package/build/cjs/chunk-JOVWU475.cjs +0 -11
- package/build/cjs/chunk-TIFUKHW7.cjs.map +0 -1
- package/build/cjs/chunk-VA2HOEKY.cjs +0 -11
- package/build/cjs/chunk-XA3S7YAO.cjs.map +0 -1
- package/build/cjs/chunk-XBIJFLHM.cjs +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -22,6 +22,7 @@ import { ActionButton } from "../../base-components/action-button/ActionButton.j
|
|
|
22
22
|
import { isDateInRange } from "../../shared/dateUtils.js";
|
|
23
23
|
import { buildDisabledMatchers, DEFAULT_FROM_YEAR, DEFAULT_TO_YEAR } from "./calendarShared.js";
|
|
24
24
|
import styles from "./DateCalendar.module.css.js";
|
|
25
|
+
import { TimePicker } from "./TimePicker.js";
|
|
25
26
|
export const CLASS_NAMES = {
|
|
26
27
|
root: styles.calendar,
|
|
27
28
|
months: styles.calendarMonths,
|
|
@@ -65,16 +66,17 @@ export const CALENDAR_COMPONENTS = {
|
|
|
65
66
|
export default function DateCalendar({
|
|
66
67
|
dateSelected,
|
|
67
68
|
onSelect,
|
|
69
|
+
onTimeChange,
|
|
68
70
|
onClear,
|
|
69
71
|
month,
|
|
70
72
|
onMonthChange,
|
|
71
73
|
min,
|
|
72
74
|
max,
|
|
73
|
-
footer,
|
|
74
75
|
todayButtonText = "Today",
|
|
75
76
|
clearButtonText = "Clear"
|
|
76
77
|
}) {
|
|
77
78
|
const disabled = useMemo(() => buildDisabledMatchers(min, max), [min, max]);
|
|
79
|
+
const showTime = onTimeChange != null;
|
|
78
80
|
const fromYear = min != null ? min.getFullYear() : DEFAULT_FROM_YEAR;
|
|
79
81
|
const toYear = max != null ? max.getFullYear() : DEFAULT_TO_YEAR;
|
|
80
82
|
const today = new Date();
|
|
@@ -82,15 +84,36 @@ export default function DateCalendar({
|
|
|
82
84
|
// set to today's date at midnight (the common case for date-only bounds).
|
|
83
85
|
const todayMidnight = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
84
86
|
const isTodaySelectable = isDateInRange(todayMidnight, min, max);
|
|
87
|
+
const applySelectedTime = useCallback(selected => {
|
|
88
|
+
// Calendar day buttons provide local-midnight dates. In datetime mode,
|
|
89
|
+
// keep the currently visible time when the user changes only the day.
|
|
90
|
+
// The Today action intentionally bypasses this path and uses wall-clock
|
|
91
|
+
// time from `new Date()`.
|
|
92
|
+
if (!showTime) {
|
|
93
|
+
return selected;
|
|
94
|
+
}
|
|
95
|
+
if (dateSelected == null) {
|
|
96
|
+
return selected;
|
|
97
|
+
}
|
|
98
|
+
const date = new Date(selected.getTime());
|
|
99
|
+
date.setHours(dateSelected.getHours(), dateSelected.getMinutes(), 0, 0);
|
|
100
|
+
return date;
|
|
101
|
+
}, [dateSelected, showTime]);
|
|
102
|
+
const handleSelect = useCallback(selected => {
|
|
103
|
+
onSelect(selected == null ? undefined : applySelectedTime(selected));
|
|
104
|
+
}, [applySelectedTime, onSelect]);
|
|
85
105
|
const handleTodayClick = useCallback(() => {
|
|
86
106
|
if (!isTodaySelectable) {
|
|
87
107
|
return;
|
|
88
108
|
}
|
|
89
109
|
onSelect(new Date());
|
|
90
110
|
}, [isTodaySelectable, onSelect]);
|
|
91
|
-
const calendarFooter = /*#__PURE__*/React.createElement(React.Fragment, null,
|
|
111
|
+
const calendarFooter = /*#__PURE__*/React.createElement(React.Fragment, null, showTime && /*#__PURE__*/React.createElement("div", {
|
|
92
112
|
className: styles.calendarTimeFooter
|
|
93
|
-
},
|
|
113
|
+
}, /*#__PURE__*/React.createElement(TimePicker, {
|
|
114
|
+
value: dateSelected ?? null,
|
|
115
|
+
onChange: onTimeChange
|
|
116
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
94
117
|
className: styles.calendarActionBar
|
|
95
118
|
}, /*#__PURE__*/React.createElement(ActionButton, {
|
|
96
119
|
type: "button",
|
|
@@ -105,7 +128,7 @@ export default function DateCalendar({
|
|
|
105
128
|
return /*#__PURE__*/React.createElement(DayPicker, {
|
|
106
129
|
mode: "single",
|
|
107
130
|
selected: dateSelected,
|
|
108
|
-
onSelect:
|
|
131
|
+
onSelect: handleSelect,
|
|
109
132
|
month: month,
|
|
110
133
|
onMonthChange: onMonthChange,
|
|
111
134
|
disabled: disabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateCalendar.js","names":["ChevronLeft","ChevronRight","classnames","React","useCallback","useMemo","DayPicker","ActionButton","isDateInRange","buildDisabledMatchers","DEFAULT_FROM_YEAR","DEFAULT_TO_YEAR","styles","CLASS_NAMES","root","calendar","months","calendarMonths","table","calendarMonthGrid","head_cell","calendarWeekday","cell","calendarDay","day","calendarDayButton","day_selected","calendarSelected","day_today","calendarToday","day_outside","calendarOutside","day_disabled","calendarDisabled","day_hidden","calendarHidden","nav","calendarNav","nav_button_previous","calendarNavButton","calendarNavPrev","nav_button_next","calendarNavNext","caption","calendarMonthCaption","caption_label","calendarVhidden","caption_dropdowns","calendarCaptionDropdowns","dropdown","calendarDropdown","dropdown_month","dropdown_year","nav_icon","calendarChevron","vhidden","tfoot","calendarFooter","NAV_ICON_SIZE","IconLeft","createElement","size","IconRight","CALENDAR_COMPONENTS","DateCalendar","dateSelected","onSelect","onClear","month","onMonthChange","min","max","footer","todayButtonText","clearButtonText","disabled","fromYear","getFullYear","toYear","today","Date","todayMidnight","getMonth","getDate","isTodaySelectable","handleTodayClick","Fragment","className","calendarTimeFooter","calendarActionBar","type","appearance","onClick","mode","selected","defaultMonth","classNames","components","captionLayout","showOutsideDays","fixedWeeks"],"sources":["DateCalendar.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChevronLeft, ChevronRight } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { ClassNames } from \"react-day-picker\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ActionButton } from \"../../base-components/action-button/ActionButton.js\";\nimport { isDateInRange } from \"../../shared/dateUtils.js\";\nimport {\n buildDisabledMatchers,\n DEFAULT_FROM_YEAR,\n DEFAULT_TO_YEAR,\n} from \"./calendarShared.js\";\nimport styles from \"./DateCalendar.module.css\";\n\nexport const CLASS_NAMES: ClassNames = {\n root: styles.calendar,\n months: styles.calendarMonths,\n table: styles.calendarMonthGrid,\n head_cell: styles.calendarWeekday,\n cell: styles.calendarDay,\n day: styles.calendarDayButton,\n day_selected: styles.calendarSelected,\n day_today: styles.calendarToday,\n day_outside: styles.calendarOutside,\n day_disabled: styles.calendarDisabled,\n day_hidden: styles.calendarHidden,\n nav: styles.calendarNav,\n nav_button_previous: classnames(\n styles.calendarNavButton,\n styles.calendarNavPrev,\n ),\n nav_button_next: classnames(styles.calendarNavButton, styles.calendarNavNext),\n caption: styles.calendarMonthCaption,\n caption_label: styles.calendarVhidden,\n caption_dropdowns: styles.calendarCaptionDropdowns,\n dropdown: styles.calendarDropdown,\n dropdown_month: styles.calendarDropdown,\n dropdown_year: styles.calendarDropdown,\n nav_icon: styles.calendarChevron,\n vhidden: styles.calendarVhidden,\n tfoot: styles.calendarFooter,\n};\n\nconst NAV_ICON_SIZE = 12;\n\nfunction IconLeft(): React.ReactElement {\n return <ChevronLeft size={NAV_ICON_SIZE} />;\n}\n\nfunction IconRight(): React.ReactElement {\n return <ChevronRight size={NAV_ICON_SIZE} />;\n}\n\nexport const CALENDAR_COMPONENTS: {\n IconLeft: () => React.ReactElement;\n IconRight: () => React.ReactElement;\n} = { IconLeft, IconRight };\n\nexport interface DateCalendarProps {\n dateSelected: Date | undefined;\n onSelect: (date: Date | undefined) => void;\n onClear?: () => void;\n month?: Date;\n onMonthChange?: (month: Date) => void;\n min?: Date;\n max?: Date;\n footer?: React.ReactNode;\n todayButtonText?: string;\n clearButtonText?: string;\n}\n\nexport default function DateCalendar({\n dateSelected,\n onSelect,\n onClear,\n month,\n onMonthChange,\n min,\n max,\n footer,\n todayButtonText = \"Today\",\n clearButtonText = \"Clear\",\n}: DateCalendarProps): React.ReactElement {\n const disabled = useMemo(() => buildDisabledMatchers(min, max), [min, max]);\n\n const fromYear = min != null ? min.getFullYear() : DEFAULT_FROM_YEAR;\n const toYear = max != null ? max.getFullYear() : DEFAULT_TO_YEAR;\n const today = new Date();\n // Compare at midnight so the Today button stays enabled when min/max are\n // set to today's date at midnight (the common case for date-only bounds).\n const todayMidnight = new Date(\n today.getFullYear(),\n today.getMonth(),\n today.getDate(),\n );\n const isTodaySelectable = isDateInRange(todayMidnight, min, max);\n const handleTodayClick = useCallback(() => {\n if (!isTodaySelectable) {\n return;\n }\n onSelect(new Date());\n }, [isTodaySelectable, onSelect]);\n\n const calendarFooter = (\n <>\n {footer != null && (\n <div className={styles.calendarTimeFooter}>{footer}</div>\n )}\n <div className={styles.calendarActionBar}>\n <ActionButton\n type=\"button\"\n appearance=\"minimal\"\n disabled={!isTodaySelectable}\n onClick={handleTodayClick}\n >\n {todayButtonText}\n </ActionButton>\n {onClear != null && (\n <ActionButton type=\"button\" appearance=\"minimal\" onClick={onClear}>\n {clearButtonText}\n </ActionButton>\n )}\n </div>\n </>\n );\n\n return (\n <DayPicker\n mode=\"single\"\n selected={dateSelected}\n onSelect={onSelect}\n month={month}\n onMonthChange={onMonthChange}\n disabled={disabled}\n defaultMonth={dateSelected}\n classNames={CLASS_NAMES}\n components={CALENDAR_COMPONENTS}\n footer={calendarFooter}\n // Render month/year as dropdown selects + prev/next arrows,\n // so users can jump directly to any month/year without paging.\n captionLayout=\"dropdown-buttons\"\n fromYear={fromYear}\n toYear={toYear}\n showOutsideDays={true}\n // Always render 6 rows so the calendar height doesn't jump between months.\n fixedWeeks={true}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DateCalendar.js","names":["ChevronLeft","ChevronRight","classnames","React","useCallback","useMemo","DayPicker","ActionButton","isDateInRange","buildDisabledMatchers","DEFAULT_FROM_YEAR","DEFAULT_TO_YEAR","styles","TimePicker","CLASS_NAMES","root","calendar","months","calendarMonths","table","calendarMonthGrid","head_cell","calendarWeekday","cell","calendarDay","day","calendarDayButton","day_selected","calendarSelected","day_today","calendarToday","day_outside","calendarOutside","day_disabled","calendarDisabled","day_hidden","calendarHidden","nav","calendarNav","nav_button_previous","calendarNavButton","calendarNavPrev","nav_button_next","calendarNavNext","caption","calendarMonthCaption","caption_label","calendarVhidden","caption_dropdowns","calendarCaptionDropdowns","dropdown","calendarDropdown","dropdown_month","dropdown_year","nav_icon","calendarChevron","vhidden","tfoot","calendarFooter","NAV_ICON_SIZE","IconLeft","createElement","size","IconRight","CALENDAR_COMPONENTS","DateCalendar","dateSelected","onSelect","onTimeChange","onClear","month","onMonthChange","min","max","todayButtonText","clearButtonText","disabled","showTime","fromYear","getFullYear","toYear","today","Date","todayMidnight","getMonth","getDate","isTodaySelectable","applySelectedTime","selected","date","getTime","setHours","getHours","getMinutes","handleSelect","undefined","handleTodayClick","Fragment","className","calendarTimeFooter","value","onChange","calendarActionBar","type","appearance","onClick","mode","defaultMonth","classNames","components","footer","captionLayout","showOutsideDays","fixedWeeks"],"sources":["DateCalendar.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChevronLeft, ChevronRight } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { ClassNames } from \"react-day-picker\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ActionButton } from \"../../base-components/action-button/ActionButton.js\";\nimport { isDateInRange } from \"../../shared/dateUtils.js\";\nimport {\n buildDisabledMatchers,\n DEFAULT_FROM_YEAR,\n DEFAULT_TO_YEAR,\n} from \"./calendarShared.js\";\nimport styles from \"./DateCalendar.module.css\";\nimport { TimePicker } from \"./TimePicker.js\";\n\nexport const CLASS_NAMES: ClassNames = {\n root: styles.calendar,\n months: styles.calendarMonths,\n table: styles.calendarMonthGrid,\n head_cell: styles.calendarWeekday,\n cell: styles.calendarDay,\n day: styles.calendarDayButton,\n day_selected: styles.calendarSelected,\n day_today: styles.calendarToday,\n day_outside: styles.calendarOutside,\n day_disabled: styles.calendarDisabled,\n day_hidden: styles.calendarHidden,\n nav: styles.calendarNav,\n nav_button_previous: classnames(\n styles.calendarNavButton,\n styles.calendarNavPrev,\n ),\n nav_button_next: classnames(styles.calendarNavButton, styles.calendarNavNext),\n caption: styles.calendarMonthCaption,\n caption_label: styles.calendarVhidden,\n caption_dropdowns: styles.calendarCaptionDropdowns,\n dropdown: styles.calendarDropdown,\n dropdown_month: styles.calendarDropdown,\n dropdown_year: styles.calendarDropdown,\n nav_icon: styles.calendarChevron,\n vhidden: styles.calendarVhidden,\n tfoot: styles.calendarFooter,\n};\n\nconst NAV_ICON_SIZE = 12;\n\nfunction IconLeft(): React.ReactElement {\n return <ChevronLeft size={NAV_ICON_SIZE} />;\n}\n\nfunction IconRight(): React.ReactElement {\n return <ChevronRight size={NAV_ICON_SIZE} />;\n}\n\nexport const CALENDAR_COMPONENTS: {\n IconLeft: () => React.ReactElement;\n IconRight: () => React.ReactElement;\n} = { IconLeft, IconRight };\n\nexport interface DateCalendarProps {\n dateSelected: Date | undefined;\n onSelect: (date: Date | undefined) => void;\n onTimeChange?: (date: Date) => void;\n onClear?: () => void;\n month?: Date;\n onMonthChange?: (month: Date) => void;\n min?: Date;\n max?: Date;\n todayButtonText?: string;\n clearButtonText?: string;\n}\n\nexport default function DateCalendar({\n dateSelected,\n onSelect,\n onTimeChange,\n onClear,\n month,\n onMonthChange,\n min,\n max,\n todayButtonText = \"Today\",\n clearButtonText = \"Clear\",\n}: DateCalendarProps): React.ReactElement {\n const disabled = useMemo(() => buildDisabledMatchers(min, max), [min, max]);\n const showTime = onTimeChange != null;\n\n const fromYear = min != null ? min.getFullYear() : DEFAULT_FROM_YEAR;\n const toYear = max != null ? max.getFullYear() : DEFAULT_TO_YEAR;\n const today = new Date();\n // Compare at midnight so the Today button stays enabled when min/max are\n // set to today's date at midnight (the common case for date-only bounds).\n const todayMidnight = new Date(\n today.getFullYear(),\n today.getMonth(),\n today.getDate(),\n );\n const isTodaySelectable = isDateInRange(todayMidnight, min, max);\n const applySelectedTime = useCallback(\n (selected: Date): Date => {\n // Calendar day buttons provide local-midnight dates. In datetime mode,\n // keep the currently visible time when the user changes only the day.\n // The Today action intentionally bypasses this path and uses wall-clock\n // time from `new Date()`.\n if (!showTime) {\n return selected;\n }\n if (dateSelected == null) {\n return selected;\n }\n const date = new Date(selected.getTime());\n date.setHours(dateSelected.getHours(), dateSelected.getMinutes(), 0, 0);\n return date;\n },\n [dateSelected, showTime],\n );\n const handleSelect = useCallback(\n (selected: Date | undefined) => {\n onSelect(selected == null ? undefined : applySelectedTime(selected));\n },\n [applySelectedTime, onSelect],\n );\n const handleTodayClick = useCallback(() => {\n if (!isTodaySelectable) {\n return;\n }\n onSelect(new Date());\n }, [isTodaySelectable, onSelect]);\n\n const calendarFooter = (\n <>\n {showTime && (\n <div className={styles.calendarTimeFooter}>\n <TimePicker value={dateSelected ?? null} onChange={onTimeChange} />\n </div>\n )}\n <div className={styles.calendarActionBar}>\n <ActionButton\n type=\"button\"\n appearance=\"minimal\"\n disabled={!isTodaySelectable}\n onClick={handleTodayClick}\n >\n {todayButtonText}\n </ActionButton>\n {onClear != null && (\n <ActionButton type=\"button\" appearance=\"minimal\" onClick={onClear}>\n {clearButtonText}\n </ActionButton>\n )}\n </div>\n </>\n );\n\n return (\n <DayPicker\n mode=\"single\"\n selected={dateSelected}\n onSelect={handleSelect}\n month={month}\n onMonthChange={onMonthChange}\n disabled={disabled}\n defaultMonth={dateSelected}\n classNames={CLASS_NAMES}\n components={CALENDAR_COMPONENTS}\n footer={calendarFooter}\n // Render month/year as dropdown selects + prev/next arrows,\n // so users can jump directly to any month/year without paging.\n captionLayout=\"dropdown-buttons\"\n fromYear={fromYear}\n toYear={toYear}\n showOutsideDays={true}\n // Always render 6 rows so the calendar height doesn't jump between months.\n fixedWeeks={true}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,7 +24,6 @@ import { stopPropagation } from "./calendarShared.js";
|
|
|
24
24
|
import styles from "./DatePicker.module.css.js";
|
|
25
25
|
import commonStyles from "./DatePickerCommon.module.css.js";
|
|
26
26
|
import { LazyDateCalendar } from "./LazyDateCalendar.js";
|
|
27
|
-
import { TimePicker } from "./TimePicker.js";
|
|
28
27
|
import { useDateEditState } from "./useDateEditState.js";
|
|
29
28
|
|
|
30
29
|
/**
|
|
@@ -116,6 +115,7 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
|
|
|
116
115
|
max,
|
|
117
116
|
onChange: handleChange
|
|
118
117
|
});
|
|
118
|
+
const activeDateValue = isEditing && inputError == null ? dateValue : value ?? undefined;
|
|
119
119
|
|
|
120
120
|
// --- Input event handlers ---
|
|
121
121
|
|
|
@@ -208,16 +208,13 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
|
|
|
208
208
|
return;
|
|
209
209
|
}
|
|
210
210
|
const date = new Date(selected.getTime());
|
|
211
|
-
if (showTime && value != null) {
|
|
212
|
-
date.setHours(value.getHours(), value.getMinutes());
|
|
213
|
-
}
|
|
214
211
|
handleChange(date);
|
|
215
212
|
setDateValue(date);
|
|
216
213
|
setVisibleCalendarMonth(date);
|
|
217
214
|
if (shouldCloseOnSelection) {
|
|
218
215
|
closePopover();
|
|
219
216
|
}
|
|
220
|
-
}, [handleChange,
|
|
217
|
+
}, [handleChange, shouldCloseOnSelection, setDateValue, setInputValue, closePopover]);
|
|
221
218
|
const handleTimeChange = useCallback(time => {
|
|
222
219
|
handleChange(time);
|
|
223
220
|
setDateValue(time);
|
|
@@ -251,16 +248,6 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
|
|
|
251
248
|
lastButton?.focus();
|
|
252
249
|
}
|
|
253
250
|
}, [stopEditing]);
|
|
254
|
-
|
|
255
|
-
// --- Time picker ---
|
|
256
|
-
|
|
257
|
-
const activeDateValue = isEditing && inputError == null ? dateValue : value ?? undefined;
|
|
258
|
-
const timeFooter = showTime ? /*#__PURE__*/React.createElement("div", {
|
|
259
|
-
className: styles.osdkDatetimeTimeFooter
|
|
260
|
-
}, /*#__PURE__*/React.createElement(TimePicker, {
|
|
261
|
-
value: activeDateValue ?? null,
|
|
262
|
-
onChange: handleTimeChange
|
|
263
|
-
})) : undefined;
|
|
264
251
|
const wrapperClassName = classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDatetimeInputWrapper, inputError != null && commonStyles.osdkDatePickerInputWrapperError);
|
|
265
252
|
const isPopoverOpen = !disabled && isOpen;
|
|
266
253
|
|
|
@@ -334,12 +321,12 @@ export const DatePicker = /*#__PURE__*/React.memo(function ({
|
|
|
334
321
|
}), /*#__PURE__*/React.createElement(LazyDateCalendar, {
|
|
335
322
|
dateSelected: activeDateValue,
|
|
336
323
|
onSelect: handleCalendarSelect,
|
|
324
|
+
onTimeChange: showTime ? handleTimeChange : undefined,
|
|
337
325
|
onClear: handleCalendarClear,
|
|
338
326
|
month: visibleCalendarMonth,
|
|
339
327
|
onMonthChange: setVisibleCalendarMonth,
|
|
340
328
|
min: min,
|
|
341
|
-
max: max
|
|
342
|
-
footer: timeFooter
|
|
329
|
+
max: max
|
|
343
330
|
}), isModal && /*#__PURE__*/React.createElement("div", {
|
|
344
331
|
onFocus: handleEndFocusBoundary,
|
|
345
332
|
tabIndex: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","isDateInRange","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","styles","commonStyles","LazyDateCalendar","TimePicker","useDateEditState","DatePicker","memo","id","value","onChange","error","min","max","placeholder","formatDate","parseDate","showTime","closeOnSelection","portalRef","portalContainer","ariaLabel","modal","disabled","isModal","shouldCloseOnSelection","popoverId","wrapperRef","inputRef","popoverRef","isOpen","setIsOpen","visibleCalendarMonth","setVisibleCalendarMonth","Date","skipReopenRef","editFormatFn","displayFormatFn","parseFn","handleChange","date","dateOnly","getFullYear","getMonth","getDate","isEditing","displayedValue","inputError","dateValue","startEditing","stopEditing","commitAndStopEditing","setInputValue","setDateValue","handleFocus","current","undefined","handlePointerDown","focus","handleInputValueChange","nextValue","parsedDate","handleBlur","e","relatedTarget","document","activeElement","contains","closePopover","blur","handleKeyDown","key","preventDefault","shiftKey","firstFocusable","querySelector","handleOpenChange","nextOpen","handleCalendarSelect","selected","getTime","setHours","getHours","getMinutes","handleTimeChange","time","handleCalendarClear","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","activeDateValue","timeFooter","createElement","className","osdkDatetimeTimeFooter","wrapperClassName","osdkDatePickerInputWrapper","osdkDatetimeInputWrapper","osdkDatePickerInputWrapperError","isPopoverOpen","Root","open","onOpenChange","ref","Trigger","nativeButton","render","osdkDatePickerInput","type","onValueChange","onFocus","onPointerDown","onBlur","onClick","onKeyDown","autoComplete","role","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","dateSelected","onSelect","onClear","month","onMonthChange","footer"],"sources":["DatePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n isDateInRange,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport styles from \"./DatePicker.module.css\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport { LazyDateCalendar } from \"./LazyDateCalendar.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * Props for the shared DatePicker. Used directly by filter-list and\n * object-table; wrapped by action-form's FormFieldRenderer for the\n * `DATETIME_PICKER` field kind. `id` and `error` are optional so non-form\n * callers can omit them.\n *\n * When `formatDate` is omitted, ISO-like format is used (YYYY-MM-DD /\n * YYYY-MM-DD HH:mm).\n */\nexport interface DatePickerProps {\n /**\n * The HTML `id` attribute for the input element. Used for `<label htmlFor>`\n * association in form contexts. Optional in non-form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the input. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected Date, or `null` for empty. */\n value: Date | null;\n\n /** Called when the user selects or types a new date. */\n onChange?: (value: Date | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest date the user can select. */\n min?: Date;\n\n /** The latest date the user can select. */\n max?: Date;\n\n /** Whether to show a time picker alongside the date. */\n showTime?: boolean;\n\n /**\n * Whether to close the popover after selecting a date.\n * @default true when `showTime` is false, false when `showTime` is true\n */\n closeOnSelection?: boolean;\n\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n\n /**\n * Formats a Date for display in the input field when not editing.\n * When typing, the input shows the parsable format (YYYY-MM-DD or\n * YYYY-MM-DD HH:mm). Provide a matching `parseDate` if using a custom\n * format.\n */\n formatDate?: (date: Date) => string;\n\n /**\n * Parses a user-typed string back into a Date. Must be the inverse of\n * `formatDate` — if `formatDate(d)` produces string `s`, then\n * `parseDate(s)` must return an equivalent Date. When omitted, defaults\n * to parsing \"YYYY-MM-DD\" (date-only) or \"YYYY-MM-DD HH:mm\" (with time).\n */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Ref forwarded to the portal container element. Used to track portaled\n * content for click-outside detection.\n */\n portalRef?: React.Ref<HTMLDivElement>;\n\n /**\n * Element that receives the date picker portal. Use this when rendering\n * inside modal dialogs so popovers stay in the dialog's stacking and\n * focus context instead of being appended directly to document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Accessible label for the input when there is no adjacent `<label>`\n * element.\n */\n ariaLabel?: string;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\nexport const DatePicker: React.NamedExoticComponent<\n DatePickerProps\n> = React.memo(function DatePicker({\n id,\n value,\n onChange,\n error,\n min,\n max,\n placeholder,\n formatDate,\n parseDate,\n showTime = false,\n closeOnSelection,\n portalRef,\n portalContainer,\n ariaLabel,\n modal = \"trap-focus\",\n disabled = false,\n}: DatePickerProps) {\n const isModal = modal !== false;\n const shouldCloseOnSelection = closeOnSelection ?? !showTime;\n const popoverId = useId();\n // The wrapper is only a visual/positioning anchor. The input itself remains\n // the Popover.Trigger so axe does not see an interactive wrapper around an\n // interactive combobox.\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // activeDateValue is the selected/typed date; visibleCalendarMonth is only\n // the calendar viewport. Keeping the viewport separate lets typed dates jump\n // the calendar while next/previous month navigation still works.\n const [visibleCalendarMonth, setVisibleCalendarMonth] = useState<\n Date | undefined\n >(value ?? new Date());\n // When true, the next handleFocus call skips reopening the popover.\n // Set before focusing the input from a popover boundary exit so that\n // Tab/Shift-Tab proceeds to the adjacent form field naturally.\n const skipReopenRef = useRef(false);\n\n // Format/parse: pick between date-only and datetime variants.\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Single normalization gate: when the time picker is hidden, strip\n // hours/minutes/seconds so consumers receive a pure calendar date (local\n // midnight). Defined before useDateEditState so the hook's commit path also\n // goes through this gate.\n const handleChange = useCallback(\n (date: Date | null) => {\n if (onChange == null) {\n return;\n }\n if (date != null && !showTime) {\n const dateOnly = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n );\n onChange(dateOnly);\n } else {\n onChange(date);\n }\n },\n [onChange, showTime],\n );\n\n const {\n isEditing,\n displayedValue,\n inputError,\n dateValue,\n startEditing,\n stopEditing,\n commitAndStopEditing,\n setInputValue,\n setDateValue,\n } = useDateEditState({\n value,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: handleChange,\n });\n\n // --- Input event handlers ---\n\n const handleFocus = useCallback(() => {\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n startEditing();\n return;\n }\n startEditing();\n setVisibleCalendarMonth(value ?? undefined);\n setIsOpen(true);\n }, [startEditing, value]);\n\n const handlePointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n inputRef.current?.focus();\n handleFocus();\n }, [handleFocus]);\n\n const handleInputValueChange = useCallback(\n (nextValue: string) => {\n setInputValue(nextValue);\n const parsedDate = nextValue !== \"\" ? parseFn(nextValue) : undefined;\n if (parsedDate != null && isDateInRange(parsedDate, min, max)) {\n setVisibleCalendarMonth(parsedDate);\n }\n },\n [max, min, parseFn, setInputValue],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Focus moved into the popover portal (e.g. clicking a calendar day).\n // The field is still logically active, so suppress the blur from\n // bubbling — parent containers should not treat this as a field exit.\n e.stopPropagation();\n return;\n }\n commitAndStopEditing();\n },\n [commitAndStopEditing],\n );\n\n // Shared close sequence: dismiss the popover, reset editing state, and\n // blur the input so focus doesn't linger after the calendar disappears.\n // Uses stopEditing (not commitAndStopEditing) to avoid double-firing\n // onChange when called from calendar-select or after Enter already committed.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopEditing();\n inputRef.current?.blur();\n }, [stopEditing]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAndStopEditing();\n setIsOpen(false);\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen && isModal) {\n // Move focus from the text input into the calendar popover.\n // The popover doesn't auto-focus on open (to keep the cursor in the input),\n // so Tab manually bridges focus to the first interactive calendar element.\n // Only meaningful when the popover traps focus; when non-modal we let\n // the browser advance focus naturally to the next document element.\n const firstFocusable = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstFocusable != null) {\n e.preventDefault();\n firstFocusable.focus();\n }\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitAndStopEditing, closePopover, isOpen, isModal],\n );\n\n // --- Popover handlers ---\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleCalendarSelect = useCallback(\n (selected: Date | undefined) => {\n if (selected == null) {\n handleChange(null);\n setInputValue(\"\");\n return;\n }\n\n const date = new Date(selected.getTime());\n if (showTime && value != null) {\n date.setHours(value.getHours(), value.getMinutes());\n }\n\n handleChange(date);\n setDateValue(date);\n setVisibleCalendarMonth(date);\n\n if (shouldCloseOnSelection) {\n closePopover();\n }\n },\n [\n handleChange,\n showTime,\n value,\n shouldCloseOnSelection,\n setDateValue,\n setInputValue,\n closePopover,\n ],\n );\n\n const handleTimeChange = useCallback(\n (time: Date) => {\n handleChange(time);\n setDateValue(time);\n },\n [handleChange, setDateValue],\n );\n\n const handleCalendarClear = useCallback(() => {\n handleChange(null);\n setDateValue(null);\n }, [handleChange, setDateValue]);\n\n // --- Focus boundary handlers ---\n // Visually-hidden elements at the start/end of the popover that trap Tab\n // cycling between the text input and calendar. Without these, Tab would\n // escape the popover into the page behind it.\n\n const handleStartFocusBoundary = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Tab reached the end of the popover. Close the popover and\n // return focus to the input without reopening it, so the next\n // Tab advances to the next form field.\n skipReopenRef.current = true;\n setIsOpen(false);\n stopEditing();\n inputRef.current?.focus();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [stopEditing],\n );\n\n // --- Time picker ---\n\n const activeDateValue = isEditing && inputError == null\n ? dateValue\n : (value ?? undefined);\n\n const timeFooter = showTime\n ? (\n <div className={styles.osdkDatetimeTimeFooter}>\n <TimePicker\n value={activeDateValue ?? null}\n onChange={handleTimeChange}\n />\n </div>\n )\n : undefined;\n\n const wrapperClassName = classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDatetimeInputWrapper,\n inputError != null && commonStyles.osdkDatePickerInputWrapperError,\n );\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on the input itself. Moving it to the wrapper would\n // make click handling simpler, but it would also nest an interactive combobox\n // inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n // When `modal === \"trap-focus\"`, base-ui traps Tab cycling and we render\n // a transparent dismiss layer for outside-click. When `false`, we rely\n // on base-ui's default outside-click — required for nested popover use\n // (e.g. inside FilterPopover) where a fullscreen dismiss layer would\n // intercept clicks intended for the parent.\n modal={modal}\n >\n <div\n ref={wrapperRef}\n className={wrapperClassName}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={inputRef}\n id={id}\n className={commonStyles.osdkDatePickerInput}\n type=\"text\"\n value={displayedValue}\n onValueChange={handleInputValueChange}\n disabled={disabled}\n onFocus={handleFocus}\n onPointerDown={handlePointerDown}\n onBlur={handleBlur}\n onClick={stopPropagation}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={popoverId}\n aria-haspopup=\"dialog\"\n aria-label={ariaLabel}\n />\n }\n />\n </div>\n <Popover.Portal ref={portalRef} container={portalContainer}>\n {isModal && (\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n )}\n <Popover.Positioner\n anchor={wrapperRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"Date picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the input.\n finalFocus={false}\n >\n {isModal && (\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n <LazyDateCalendar\n dateSelected={activeDateValue}\n onSelect={handleCalendarSelect}\n onClear={handleCalendarClear}\n month={visibleCalendarMonth}\n onMonthChange={setVisibleCalendarMonth}\n min={min}\n max={max}\n footer={timeFooter}\n />\n {isModal && (\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DatePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","isDateInRange","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","styles","commonStyles","LazyDateCalendar","useDateEditState","DatePicker","memo","id","value","onChange","error","min","max","placeholder","formatDate","parseDate","showTime","closeOnSelection","portalRef","portalContainer","ariaLabel","modal","disabled","isModal","shouldCloseOnSelection","popoverId","wrapperRef","inputRef","popoverRef","isOpen","setIsOpen","visibleCalendarMonth","setVisibleCalendarMonth","Date","skipReopenRef","editFormatFn","displayFormatFn","parseFn","handleChange","date","dateOnly","getFullYear","getMonth","getDate","isEditing","displayedValue","inputError","dateValue","startEditing","stopEditing","commitAndStopEditing","setInputValue","setDateValue","activeDateValue","undefined","handleFocus","current","handlePointerDown","focus","handleInputValueChange","nextValue","parsedDate","handleBlur","e","relatedTarget","document","activeElement","contains","closePopover","blur","handleKeyDown","key","preventDefault","shiftKey","firstFocusable","querySelector","handleOpenChange","nextOpen","handleCalendarSelect","selected","getTime","handleTimeChange","time","handleCalendarClear","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","wrapperClassName","osdkDatePickerInputWrapper","osdkDatetimeInputWrapper","osdkDatePickerInputWrapperError","isPopoverOpen","createElement","Root","open","onOpenChange","ref","className","Trigger","nativeButton","render","osdkDatePickerInput","type","onValueChange","onFocus","onPointerDown","onBlur","onClick","onKeyDown","autoComplete","role","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","dateSelected","onSelect","onTimeChange","onClear","month","onMonthChange"],"sources":["DatePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n isDateInRange,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport styles from \"./DatePicker.module.css\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport { LazyDateCalendar } from \"./LazyDateCalendar.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * Props for the shared DatePicker. Used directly by filter-list and\n * object-table; wrapped by action-form's FormFieldRenderer for the\n * `DATETIME_PICKER` field kind. `id` and `error` are optional so non-form\n * callers can omit them.\n *\n * When `formatDate` is omitted, ISO-like format is used (YYYY-MM-DD /\n * YYYY-MM-DD HH:mm).\n */\nexport interface DatePickerProps {\n /**\n * The HTML `id` attribute for the input element. Used for `<label htmlFor>`\n * association in form contexts. Optional in non-form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the input. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected Date, or `null` for empty. */\n value: Date | null;\n\n /** Called when the user selects or types a new date. */\n onChange?: (value: Date | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest date the user can select. */\n min?: Date;\n\n /** The latest date the user can select. */\n max?: Date;\n\n /** Whether to show a time picker alongside the date. */\n showTime?: boolean;\n\n /**\n * Whether to close the popover after selecting a date.\n * @default true when `showTime` is false, false when `showTime` is true\n */\n closeOnSelection?: boolean;\n\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n\n /**\n * Formats a Date for display in the input field when not editing.\n * When typing, the input shows the parsable format (YYYY-MM-DD or\n * YYYY-MM-DD HH:mm). Provide a matching `parseDate` if using a custom\n * format.\n */\n formatDate?: (date: Date) => string;\n\n /**\n * Parses a user-typed string back into a Date. Must be the inverse of\n * `formatDate` — if `formatDate(d)` produces string `s`, then\n * `parseDate(s)` must return an equivalent Date. When omitted, defaults\n * to parsing \"YYYY-MM-DD\" (date-only) or \"YYYY-MM-DD HH:mm\" (with time).\n */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Ref forwarded to the portal container element. Used to track portaled\n * content for click-outside detection.\n */\n portalRef?: React.Ref<HTMLDivElement>;\n\n /**\n * Element that receives the date picker portal. Use this when rendering\n * inside modal dialogs so popovers stay in the dialog's stacking and\n * focus context instead of being appended directly to document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Accessible label for the input when there is no adjacent `<label>`\n * element.\n */\n ariaLabel?: string;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\nexport const DatePicker: React.NamedExoticComponent<DatePickerProps> = React\n .memo(function DatePicker({\n id,\n value,\n onChange,\n error,\n min,\n max,\n placeholder,\n formatDate,\n parseDate,\n showTime = false,\n closeOnSelection,\n portalRef,\n portalContainer,\n ariaLabel,\n modal = \"trap-focus\",\n disabled = false,\n }: DatePickerProps) {\n const isModal = modal !== false;\n const shouldCloseOnSelection = closeOnSelection ?? !showTime;\n const popoverId = useId();\n // The wrapper is only a visual/positioning anchor. The input itself remains\n // the Popover.Trigger so axe does not see an interactive wrapper around an\n // interactive combobox.\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // activeDateValue is the selected/typed date; visibleCalendarMonth is only\n // the calendar viewport. Keeping the viewport separate lets typed dates jump\n // the calendar while next/previous month navigation still works.\n const [visibleCalendarMonth, setVisibleCalendarMonth] = useState<\n Date | undefined\n >(value ?? new Date());\n // When true, the next handleFocus call skips reopening the popover.\n // Set before focusing the input from a popover boundary exit so that\n // Tab/Shift-Tab proceeds to the adjacent form field naturally.\n const skipReopenRef = useRef(false);\n\n // Format/parse: pick between date-only and datetime variants.\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Single normalization gate: when the time picker is hidden, strip\n // hours/minutes/seconds so consumers receive a pure calendar date (local\n // midnight). Defined before useDateEditState so the hook's commit path also\n // goes through this gate.\n const handleChange = useCallback(\n (date: Date | null) => {\n if (onChange == null) {\n return;\n }\n if (date != null && !showTime) {\n const dateOnly = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n );\n onChange(dateOnly);\n } else {\n onChange(date);\n }\n },\n [onChange, showTime],\n );\n\n const {\n isEditing,\n displayedValue,\n inputError,\n dateValue,\n startEditing,\n stopEditing,\n commitAndStopEditing,\n setInputValue,\n setDateValue,\n } = useDateEditState({\n value,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: handleChange,\n });\n\n const activeDateValue = isEditing && inputError == null\n ? dateValue\n : (value ?? undefined);\n\n // --- Input event handlers ---\n\n const handleFocus = useCallback(() => {\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n startEditing();\n return;\n }\n startEditing();\n setVisibleCalendarMonth(value ?? undefined);\n setIsOpen(true);\n }, [startEditing, value]);\n\n const handlePointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n inputRef.current?.focus();\n handleFocus();\n }, [handleFocus]);\n\n const handleInputValueChange = useCallback(\n (nextValue: string) => {\n setInputValue(nextValue);\n const parsedDate = nextValue !== \"\" ? parseFn(nextValue) : undefined;\n if (parsedDate != null && isDateInRange(parsedDate, min, max)) {\n setVisibleCalendarMonth(parsedDate);\n }\n },\n [max, min, parseFn, setInputValue],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Focus moved into the popover portal (e.g. clicking a calendar day).\n // The field is still logically active, so suppress the blur from\n // bubbling — parent containers should not treat this as a field exit.\n e.stopPropagation();\n return;\n }\n commitAndStopEditing();\n },\n [commitAndStopEditing],\n );\n\n // Shared close sequence: dismiss the popover, reset editing state, and\n // blur the input so focus doesn't linger after the calendar disappears.\n // Uses stopEditing (not commitAndStopEditing) to avoid double-firing\n // onChange when called from calendar-select or after Enter already committed.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopEditing();\n inputRef.current?.blur();\n }, [stopEditing]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAndStopEditing();\n setIsOpen(false);\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen && isModal) {\n // Move focus from the text input into the calendar popover.\n // The popover doesn't auto-focus on open (to keep the cursor in the input),\n // so Tab manually bridges focus to the first interactive calendar element.\n // Only meaningful when the popover traps focus; when non-modal we let\n // the browser advance focus naturally to the next document element.\n const firstFocusable = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstFocusable != null) {\n e.preventDefault();\n firstFocusable.focus();\n }\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitAndStopEditing, closePopover, isOpen, isModal],\n );\n\n // --- Popover handlers ---\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleCalendarSelect = useCallback(\n (selected: Date | undefined) => {\n if (selected == null) {\n handleChange(null);\n setInputValue(\"\");\n return;\n }\n\n const date = new Date(selected.getTime());\n handleChange(date);\n setDateValue(date);\n setVisibleCalendarMonth(date);\n\n if (shouldCloseOnSelection) {\n closePopover();\n }\n },\n [\n handleChange,\n shouldCloseOnSelection,\n setDateValue,\n setInputValue,\n closePopover,\n ],\n );\n\n const handleTimeChange = useCallback(\n (time: Date) => {\n handleChange(time);\n setDateValue(time);\n },\n [handleChange, setDateValue],\n );\n\n const handleCalendarClear = useCallback(() => {\n handleChange(null);\n setDateValue(null);\n }, [handleChange, setDateValue]);\n\n // --- Focus boundary handlers ---\n // Visually-hidden elements at the start/end of the popover that trap Tab\n // cycling between the text input and calendar. Without these, Tab would\n // escape the popover into the page behind it.\n\n const handleStartFocusBoundary = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Tab reached the end of the popover. Close the popover and\n // return focus to the input without reopening it, so the next\n // Tab advances to the next form field.\n skipReopenRef.current = true;\n setIsOpen(false);\n stopEditing();\n inputRef.current?.focus();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [stopEditing],\n );\n\n const wrapperClassName = classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDatetimeInputWrapper,\n inputError != null && commonStyles.osdkDatePickerInputWrapperError,\n );\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on the input itself. Moving it to the wrapper would\n // make click handling simpler, but it would also nest an interactive combobox\n // inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n // When `modal === \"trap-focus\"`, base-ui traps Tab cycling and we render\n // a transparent dismiss layer for outside-click. When `false`, we rely\n // on base-ui's default outside-click — required for nested popover use\n // (e.g. inside FilterPopover) where a fullscreen dismiss layer would\n // intercept clicks intended for the parent.\n modal={modal}\n >\n <div\n ref={wrapperRef}\n className={wrapperClassName}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={inputRef}\n id={id}\n className={commonStyles.osdkDatePickerInput}\n type=\"text\"\n value={displayedValue}\n onValueChange={handleInputValueChange}\n disabled={disabled}\n onFocus={handleFocus}\n onPointerDown={handlePointerDown}\n onBlur={handleBlur}\n onClick={stopPropagation}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={popoverId}\n aria-haspopup=\"dialog\"\n aria-label={ariaLabel}\n />\n }\n />\n </div>\n <Popover.Portal ref={portalRef} container={portalContainer}>\n {isModal && (\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n )}\n <Popover.Positioner\n anchor={wrapperRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"Date picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the input.\n finalFocus={false}\n >\n {isModal && (\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n <LazyDateCalendar\n dateSelected={activeDateValue}\n onSelect={handleCalendarSelect}\n onTimeChange={showTime ? handleTimeChange : undefined}\n onClear={handleCalendarClear}\n month={visibleCalendarMonth}\n onMonthChange={setVisibleCalendarMonth}\n min={min}\n max={max}\n />\n {isModal && (\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n });\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// CSS Module proxy for DatePicker.module.css
|
|
2
2
|
const styles = {
|
|
3
|
-
"osdkDatetimeInputWrapper": "DatePicker-module__osdkDatetimeInputWrapper___r6opEKtb"
|
|
4
|
-
"osdkDatetimeTimeFooter": "DatePicker-module__osdkDatetimeTimeFooter___BJGF9UWo"
|
|
3
|
+
"osdkDatetimeInputWrapper": "DatePicker-module__osdkDatetimeInputWrapper___r6opEKtb"
|
|
5
4
|
};
|
|
6
5
|
|
|
7
6
|
export default styles;
|
|
@@ -162,6 +162,8 @@ export const DateRangePicker = /*#__PURE__*/React.memo(function ({
|
|
|
162
162
|
})();
|
|
163
163
|
const startInvalid = startInputError != null || hasOverlapError;
|
|
164
164
|
const endInvalid = endInputError != null || hasOverlapError;
|
|
165
|
+
const activeStartDateValue = startInputError == null && startParsedValue != null ? startParsedValue : startDate ?? undefined;
|
|
166
|
+
const activeEndDateValue = endInputError == null && endParsedValue != null ? endParsedValue : endDate ?? undefined;
|
|
165
167
|
|
|
166
168
|
// --- Focus handlers ---
|
|
167
169
|
|
|
@@ -359,11 +361,11 @@ export const DateRangePicker = /*#__PURE__*/React.memo(function ({
|
|
|
359
361
|
to: endDate ?? undefined
|
|
360
362
|
} : undefined;
|
|
361
363
|
const timeFooter = showTime ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TimePicker, {
|
|
362
|
-
value:
|
|
364
|
+
value: activeStartDateValue ?? null,
|
|
363
365
|
onChange: handleStartTimeChange,
|
|
364
366
|
label: "Start time"
|
|
365
367
|
}), /*#__PURE__*/React.createElement(TimePicker, {
|
|
366
|
-
value:
|
|
368
|
+
value: activeEndDateValue ?? null,
|
|
367
369
|
onChange: handleEndTimeChange,
|
|
368
370
|
label: "End time"
|
|
369
371
|
})) : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","TimePicker","useDateEditState","EMPTY_RANGE","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangePicker","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","modal","disabled","shouldCloseOnSelection","popoverId","triggerRef","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartPointerDown","handleEndPointerDown","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","time","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","Fragment","label","sharedInputProps","isPopoverOpen","Root","open","onOpenChange","ref","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","Trigger","nativeButton","render","_extends","onValueChange","onFocus","onPointerDown","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","footer","start","end","getTime"],"sources":["DateRangePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangePicker.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * A date range represented as a start/end tuple. Either element may be\n * `null` when the range is partially selected.\n */\nexport type DateRange = readonly [Date | null, Date | null];\n\n/** Default empty range — both bounds are null. */\nexport const EMPTY_RANGE: DateRange = [null, null];\n\n/**\n * Props for the shared DateRangePicker. Used by filter-list's date-range\n * histogram and action-form's `DATE_RANGE_INPUT` field kind. `id` and\n * `error` are optional so non-form callers can omit them.\n *\n * Renders two text inputs (start / end) with a shared calendar popover\n * supporting range selection.\n */\nexport interface DateRangePickerProps {\n /**\n * The HTML `id` attribute for the start input element. Used for\n * `<label htmlFor>` association in form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the inputs. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected range, or `null` for empty. */\n value: DateRange | null;\n\n /** Called when the user selects or types a new range. */\n onChange?: (value: DateRange | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest selectable date. */\n min?: Date;\n\n /** The latest selectable date. */\n max?: Date;\n\n /** Whether to show time pickers for both dates. */\n showTime?: boolean;\n\n /** Placeholder text for the start date input. */\n placeholderStart?: string;\n\n /** Placeholder text for the end date input. */\n placeholderEnd?: string;\n\n /** Whether to allow start and end on the same day. @default true */\n allowSingleDayRange?: boolean;\n\n /** Formats a Date for display. Defaults to \"YYYY-MM-DD\". */\n formatDate?: (date: Date) => string;\n\n /** Parses a user-typed string back into a Date. */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Element that receives the date range picker portal. Use this when\n * rendering inside modal dialogs so popovers stay in the dialog's\n * stacking and focus context instead of being appended directly to\n * document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangePicker: React.NamedExoticComponent<\n DateRangePickerProps\n> = React.memo(function DateRangePicker({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n modal = \"trap-focus\",\n disabled = false,\n}: DateRangePickerProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n // The range container anchors the shared popover without becoming a trigger.\n // Each input is its own Popover.Trigger so the comboboxes are not nested in an\n // interactive wrapper.\n const triggerRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n const handleStartPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n startInputRef.current?.focus();\n handleStartFocus();\n }, [handleStartFocus]);\n\n const handleEndPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n endInputRef.current?.focus();\n handleEndFocus();\n }, [handleEndFocus]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (time: Date) => {\n onChange?.([time, endDate ?? null]);\n setStartDateValue(time);\n },\n [endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (time: Date) => {\n onChange?.([startDate ?? null, time]);\n setEndDateValue(time);\n },\n [startDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <>\n <TimePicker\n value={startDate}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={endDate}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on each input itself. Moving it to the range wrapper\n // would make click handling simpler, but it would also nest interactive\n // comboboxes inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n <div\n ref={triggerRef}\n className={styles.osdkDateRangeContainer}\n data-disabled={disabled || undefined}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n disabled={disabled}\n onFocus={handleStartFocus}\n onPointerDown={handleStartPointerDown}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isPopoverOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n disabled={disabled}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n onFocus={handleEndFocus}\n onPointerDown={handleEndPointerDown}\n placeholder={placeholderEnd}\n aria-expanded={isPopoverOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n </div>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={triggerRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DateRangePicker.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","parseDateFromInput","parseDatetimeFromInput","PortalDismissLayer","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","TimePicker","useDateEditState","EMPTY_RANGE","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangePicker","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","modal","disabled","shouldCloseOnSelection","popoverId","triggerRef","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","activeStartDateValue","activeEndDateValue","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartPointerDown","handleEndPointerDown","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","time","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","Fragment","label","sharedInputProps","isPopoverOpen","Root","open","onOpenChange","ref","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","Trigger","nativeButton","render","_extends","onValueChange","onFocus","onPointerDown","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","side","align","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","footer","start","end","getTime"],"sources":["DateRangePicker.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../dateUtils.js\";\nimport {\n type PortalContainer,\n PortalDismissLayer,\n} from \"../PortalDismissLayer.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangePicker.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\n/**\n * A date range represented as a start/end tuple. Either element may be\n * `null` when the range is partially selected.\n */\nexport type DateRange = readonly [Date | null, Date | null];\n\n/** Default empty range — both bounds are null. */\nexport const EMPTY_RANGE: DateRange = [null, null];\n\n/**\n * Props for the shared DateRangePicker. Used by filter-list's date-range\n * histogram and action-form's `DATE_RANGE_INPUT` field kind. `id` and\n * `error` are optional so non-form callers can omit them.\n *\n * Renders two text inputs (start / end) with a shared calendar popover\n * supporting range selection.\n */\nexport interface DateRangePickerProps {\n /**\n * The HTML `id` attribute for the start input element. Used for\n * `<label htmlFor>` association in form contexts.\n */\n id?: string;\n\n /**\n * Visual error state for the inputs. Set by form validation in\n * action-form contexts; non-form callers typically omit it.\n */\n error?: string;\n\n /** The currently-selected range, or `null` for empty. */\n value: DateRange | null;\n\n /** Called when the user selects or types a new range. */\n onChange?: (value: DateRange | null) => void;\n\n /** Whether the picker is disabled. */\n disabled?: boolean;\n\n /** The earliest selectable date. */\n min?: Date;\n\n /** The latest selectable date. */\n max?: Date;\n\n /** Whether to show time pickers for both dates. */\n showTime?: boolean;\n\n /** Placeholder text for the start date input. */\n placeholderStart?: string;\n\n /** Placeholder text for the end date input. */\n placeholderEnd?: string;\n\n /** Whether to allow start and end on the same day. @default true */\n allowSingleDayRange?: boolean;\n\n /** Formats a Date for display. Defaults to \"YYYY-MM-DD\". */\n formatDate?: (date: Date) => string;\n\n /** Parses a user-typed string back into a Date. */\n parseDate?: (text: string) => Date | undefined;\n\n /**\n * Element that receives the date range picker portal. Use this when\n * rendering inside modal dialogs so popovers stay in the dialog's\n * stacking and focus context instead of being appended directly to\n * document.body.\n */\n portalContainer?: PortalContainer;\n\n /**\n * Popover modality. Defaults to `\"trap-focus\"`, which traps Tab cycling\n * inside the calendar and renders a transparent dismiss layer over the\n * page. Pass `false` when nesting this picker inside another popover so\n * the inner dismiss layer doesn't intercept clicks intended for the\n * outer popover and base-ui's default outside-click handles dismissal\n * instead.\n */\n modal?: \"trap-focus\" | false;\n}\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangePicker: React.NamedExoticComponent<\n DateRangePickerProps\n> = React.memo(function DateRangePicker({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n modal = \"trap-focus\",\n disabled = false,\n}: DateRangePickerProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n // The range container anchors the shared popover without becoming a trigger.\n // Each input is its own Popover.Trigger so the comboboxes are not nested in an\n // interactive wrapper.\n const triggerRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n const activeStartDateValue =\n startInputError == null && startParsedValue != null\n ? startParsedValue\n : (startDate ?? undefined);\n const activeEndDateValue = endInputError == null && endParsedValue != null\n ? endParsedValue\n : (endDate ?? undefined);\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n const handleStartPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n startInputRef.current?.focus();\n handleStartFocus();\n }, [handleStartFocus]);\n\n const handleEndPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n endInputRef.current?.focus();\n handleEndFocus();\n }, [handleEndFocus]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (time: Date) => {\n onChange?.([time, endDate ?? null]);\n setStartDateValue(time);\n },\n [endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (time: Date) => {\n onChange?.([startDate ?? null, time]);\n setEndDateValue(time);\n },\n [startDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <>\n <TimePicker\n value={activeStartDateValue ?? null}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={activeEndDateValue ?? null}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n const isPopoverOpen = !disabled && isOpen;\n\n // Keep Popover.Trigger on each input itself. Moving it to the range wrapper\n // would make click handling simpler, but it would also nest interactive\n // comboboxes inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isPopoverOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n <div\n ref={triggerRef}\n className={styles.osdkDateRangeContainer}\n data-disabled={disabled || undefined}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n disabled={disabled}\n onFocus={handleStartFocus}\n onPointerDown={handleStartPointerDown}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isPopoverOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n data-disabled={disabled || undefined}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n disabled={disabled}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n onFocus={handleEndFocus}\n onPointerDown={handleEndPointerDown}\n placeholder={placeholderEnd}\n aria-expanded={isPopoverOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n </div>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={triggerRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n side=\"bottom\"\n align=\"start\"\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
|