@salt-ds/date-components 0.0.0-snapshot-20260330155807
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 +109 -0
- package/README.md +63 -0
- package/css/salt-date-components.css +633 -0
- package/dist-cjs/calendar/Calendar.css.js +6 -0
- package/dist-cjs/calendar/Calendar.css.js.map +1 -0
- package/dist-cjs/calendar/Calendar.js +154 -0
- package/dist-cjs/calendar/Calendar.js.map +1 -0
- package/dist-cjs/calendar/CalendarGrid.js +85 -0
- package/dist-cjs/calendar/CalendarGrid.js.map +1 -0
- package/dist-cjs/calendar/CalendarMonthHeader.css.js +6 -0
- package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +1 -0
- package/dist-cjs/calendar/CalendarMonthHeader.js +41 -0
- package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -0
- package/dist-cjs/calendar/CalendarNavigation.css.js +6 -0
- package/dist-cjs/calendar/CalendarNavigation.css.js.map +1 -0
- package/dist-cjs/calendar/CalendarNavigation.js +334 -0
- package/dist-cjs/calendar/CalendarNavigation.js.map +1 -0
- package/dist-cjs/calendar/CalendarWeekHeader.css.js +6 -0
- package/dist-cjs/calendar/CalendarWeekHeader.css.js.map +1 -0
- package/dist-cjs/calendar/CalendarWeekHeader.js +46 -0
- package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -0
- package/dist-cjs/calendar/internal/CalendarContext.js +23 -0
- package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -0
- package/dist-cjs/calendar/internal/CalendarDay.css.js +6 -0
- package/dist-cjs/calendar/internal/CalendarDay.css.js.map +1 -0
- package/dist-cjs/calendar/internal/CalendarDay.js +98 -0
- package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -0
- package/dist-cjs/calendar/internal/CalendarMonth.css.js +6 -0
- package/dist-cjs/calendar/internal/CalendarMonth.css.js.map +1 -0
- package/dist-cjs/calendar/internal/CalendarMonth.js +81 -0
- package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -0
- package/dist-cjs/calendar/internal/createAnnouncement.js +90 -0
- package/dist-cjs/calendar/internal/createAnnouncement.js.map +1 -0
- package/dist-cjs/calendar/internal/useFocusManagement.js +66 -0
- package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -0
- package/dist-cjs/calendar/internal/utils.js +50 -0
- package/dist-cjs/calendar/internal/utils.js.map +1 -0
- package/dist-cjs/calendar/useCalendar.js +464 -0
- package/dist-cjs/calendar/useCalendar.js.map +1 -0
- package/dist-cjs/calendar/useCalendarDay.js +84 -0
- package/dist-cjs/calendar/useCalendarDay.js.map +1 -0
- package/dist-cjs/calendar/useCalendarSelection.js +353 -0
- package/dist-cjs/calendar/useCalendarSelection.js.map +1 -0
- package/dist-cjs/calendar/useDateSelectionAnnouncer.js +52 -0
- package/dist-cjs/calendar/useDateSelectionAnnouncer.js.map +1 -0
- package/dist-cjs/date-input/DateInput.css.js +6 -0
- package/dist-cjs/date-input/DateInput.css.js.map +1 -0
- package/dist-cjs/date-input/DateInputRange.js +353 -0
- package/dist-cjs/date-input/DateInputRange.js.map +1 -0
- package/dist-cjs/date-input/DateInputSingle.js +237 -0
- package/dist-cjs/date-input/DateInputSingle.js.map +1 -0
- package/dist-cjs/date-picker/DatePicker.js +83 -0
- package/dist-cjs/date-picker/DatePicker.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerActions.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerActions.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerActions.js +119 -0
- package/dist-cjs/date-picker/DatePickerActions.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerContext.js +36 -0
- package/dist-cjs/date-picker/DatePickerContext.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerHelperText.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerHelperText.js +36 -0
- package/dist-cjs/date-picker/DatePickerHelperText.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerOverlay.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerOverlay.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerOverlay.js +49 -0
- package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js +164 -0
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerPanel.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerPanel.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +250 -0
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerRangeInput.js +206 -0
- package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerRangePanel.js +365 -0
- package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +262 -0
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerSingleInput.js +150 -0
- package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerSinglePanel.js +20 -0
- package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerTrigger.js +32 -0
- package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -0
- package/dist-cjs/date-picker/useDatePicker.js +222 -0
- package/dist-cjs/date-picker/useDatePicker.js.map +1 -0
- package/dist-cjs/date-picker/useFocusOut.js +43 -0
- package/dist-cjs/date-picker/useFocusOut.js.map +1 -0
- package/dist-cjs/date-picker/useKeyboard.js +22 -0
- package/dist-cjs/date-picker/useKeyboard.js.map +1 -0
- package/dist-cjs/index.js +64 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/localization-provider/LocalizationProvider.js +51 -0
- package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -0
- package/dist-es/calendar/Calendar.css.js +4 -0
- package/dist-es/calendar/Calendar.css.js.map +1 -0
- package/dist-es/calendar/Calendar.js +152 -0
- package/dist-es/calendar/Calendar.js.map +1 -0
- package/dist-es/calendar/CalendarGrid.js +83 -0
- package/dist-es/calendar/CalendarGrid.js.map +1 -0
- package/dist-es/calendar/CalendarMonthHeader.css.js +4 -0
- package/dist-es/calendar/CalendarMonthHeader.css.js.map +1 -0
- package/dist-es/calendar/CalendarMonthHeader.js +39 -0
- package/dist-es/calendar/CalendarMonthHeader.js.map +1 -0
- package/dist-es/calendar/CalendarNavigation.css.js +4 -0
- package/dist-es/calendar/CalendarNavigation.css.js.map +1 -0
- package/dist-es/calendar/CalendarNavigation.js +332 -0
- package/dist-es/calendar/CalendarNavigation.js.map +1 -0
- package/dist-es/calendar/CalendarWeekHeader.css.js +4 -0
- package/dist-es/calendar/CalendarWeekHeader.css.js.map +1 -0
- package/dist-es/calendar/CalendarWeekHeader.js +44 -0
- package/dist-es/calendar/CalendarWeekHeader.js.map +1 -0
- package/dist-es/calendar/internal/CalendarContext.js +20 -0
- package/dist-es/calendar/internal/CalendarContext.js.map +1 -0
- package/dist-es/calendar/internal/CalendarDay.css.js +4 -0
- package/dist-es/calendar/internal/CalendarDay.css.js.map +1 -0
- package/dist-es/calendar/internal/CalendarDay.js +96 -0
- package/dist-es/calendar/internal/CalendarDay.js.map +1 -0
- package/dist-es/calendar/internal/CalendarMonth.css.js +4 -0
- package/dist-es/calendar/internal/CalendarMonth.css.js.map +1 -0
- package/dist-es/calendar/internal/CalendarMonth.js +79 -0
- package/dist-es/calendar/internal/CalendarMonth.js.map +1 -0
- package/dist-es/calendar/internal/createAnnouncement.js +87 -0
- package/dist-es/calendar/internal/createAnnouncement.js.map +1 -0
- package/dist-es/calendar/internal/useFocusManagement.js +64 -0
- package/dist-es/calendar/internal/useFocusManagement.js.map +1 -0
- package/dist-es/calendar/internal/utils.js +44 -0
- package/dist-es/calendar/internal/utils.js.map +1 -0
- package/dist-es/calendar/useCalendar.js +462 -0
- package/dist-es/calendar/useCalendar.js.map +1 -0
- package/dist-es/calendar/useCalendarDay.js +82 -0
- package/dist-es/calendar/useCalendarDay.js.map +1 -0
- package/dist-es/calendar/useCalendarSelection.js +349 -0
- package/dist-es/calendar/useCalendarSelection.js.map +1 -0
- package/dist-es/calendar/useDateSelectionAnnouncer.js +50 -0
- package/dist-es/calendar/useDateSelectionAnnouncer.js.map +1 -0
- package/dist-es/date-input/DateInput.css.js +4 -0
- package/dist-es/date-input/DateInput.css.js.map +1 -0
- package/dist-es/date-input/DateInputRange.js +350 -0
- package/dist-es/date-input/DateInputRange.js.map +1 -0
- package/dist-es/date-input/DateInputSingle.js +235 -0
- package/dist-es/date-input/DateInputSingle.js.map +1 -0
- package/dist-es/date-picker/DatePicker.js +80 -0
- package/dist-es/date-picker/DatePicker.js.map +1 -0
- package/dist-es/date-picker/DatePickerActions.css.js +4 -0
- package/dist-es/date-picker/DatePickerActions.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerActions.js +117 -0
- package/dist-es/date-picker/DatePickerActions.js.map +1 -0
- package/dist-es/date-picker/DatePickerContext.js +32 -0
- package/dist-es/date-picker/DatePickerContext.js.map +1 -0
- package/dist-es/date-picker/DatePickerHelperText.css.js +4 -0
- package/dist-es/date-picker/DatePickerHelperText.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerHelperText.js +34 -0
- package/dist-es/date-picker/DatePickerHelperText.js.map +1 -0
- package/dist-es/date-picker/DatePickerOverlay.css.js +4 -0
- package/dist-es/date-picker/DatePickerOverlay.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerOverlay.js +47 -0
- package/dist-es/date-picker/DatePickerOverlay.js.map +1 -0
- package/dist-es/date-picker/DatePickerOverlayProvider.js +161 -0
- package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -0
- package/dist-es/date-picker/DatePickerPanel.css.js +4 -0
- package/dist-es/date-picker/DatePickerPanel.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerRangeGridPanel.js +248 -0
- package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerRangeInput.js +203 -0
- package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -0
- package/dist-es/date-picker/DatePickerRangePanel.js +363 -0
- package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerSingleGridPanel.js +260 -0
- package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerSingleInput.js +148 -0
- package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -0
- package/dist-es/date-picker/DatePickerSinglePanel.js +18 -0
- package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerTrigger.js +30 -0
- package/dist-es/date-picker/DatePickerTrigger.js.map +1 -0
- package/dist-es/date-picker/useDatePicker.js +220 -0
- package/dist-es/date-picker/useDatePicker.js.map +1 -0
- package/dist-es/date-picker/useFocusOut.js +41 -0
- package/dist-es/date-picker/useFocusOut.js.map +1 -0
- package/dist-es/date-picker/useKeyboard.js +20 -0
- package/dist-es/date-picker/useKeyboard.js.map +1 -0
- package/dist-es/index.js +25 -0
- package/dist-es/index.js.map +1 -0
- package/dist-es/localization-provider/LocalizationProvider.js +47 -0
- package/dist-es/localization-provider/LocalizationProvider.js.map +1 -0
- package/dist-types/calendar/Calendar.d.ts +105 -0
- package/dist-types/calendar/CalendarGrid.d.ts +27 -0
- package/dist-types/calendar/CalendarMonthHeader.d.ts +17 -0
- package/dist-types/calendar/CalendarNavigation.d.ts +43 -0
- package/dist-types/calendar/CalendarWeekHeader.d.ts +6 -0
- package/dist-types/calendar/index.d.ts +9 -0
- package/dist-types/calendar/internal/CalendarContext.d.ts +6 -0
- package/dist-types/calendar/internal/CalendarDay.d.ts +33 -0
- package/dist-types/calendar/internal/CalendarMonth.d.ts +14 -0
- package/dist-types/calendar/internal/createAnnouncement.d.ts +24 -0
- package/dist-types/calendar/internal/useFocusManagement.d.ts +9 -0
- package/dist-types/calendar/internal/utils.d.ts +6 -0
- package/dist-types/calendar/useCalendar.d.ts +335 -0
- package/dist-types/calendar/useCalendarDay.d.ts +67 -0
- package/dist-types/calendar/useCalendarSelection.d.ts +145 -0
- package/dist-types/calendar/useDateSelectionAnnouncer.d.ts +6 -0
- package/dist-types/date-input/DateInputRange.d.ts +131 -0
- package/dist-types/date-input/DateInputSingle.d.ts +99 -0
- package/dist-types/date-input/index.d.ts +2 -0
- package/dist-types/date-picker/DatePicker.d.ts +52 -0
- package/dist-types/date-picker/DatePickerActions.d.ts +79 -0
- package/dist-types/date-picker/DatePickerContext.d.ts +172 -0
- package/dist-types/date-picker/DatePickerHelperText.d.ts +4 -0
- package/dist-types/date-picker/DatePickerOverlay.d.ts +11 -0
- package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +106 -0
- package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +14 -0
- package/dist-types/date-picker/DatePickerRangeInput.d.ts +17 -0
- package/dist-types/date-picker/DatePickerRangePanel.d.ts +83 -0
- package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +63 -0
- package/dist-types/date-picker/DatePickerSingleInput.d.ts +15 -0
- package/dist-types/date-picker/DatePickerSinglePanel.d.ts +8 -0
- package/dist-types/date-picker/DatePickerTrigger.d.ts +9 -0
- package/dist-types/date-picker/index.d.ts +13 -0
- package/dist-types/date-picker/useDatePicker.d.ts +121 -0
- package/dist-types/date-picker/useFocusOut.d.ts +9 -0
- package/dist-types/date-picker/useKeyboard.d.ts +20 -0
- package/dist-types/index.d.ts +4 -0
- package/dist-types/localization-provider/LocalizationProvider.d.ts +62 -0
- package/dist-types/localization-provider/index.d.ts +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@salt-ds/core');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
require('../calendar/Calendar.js');
|
|
6
|
+
require('../calendar/CalendarGrid.js');
|
|
7
|
+
require('../calendar/CalendarNavigation.js');
|
|
8
|
+
require('../calendar/CalendarWeekHeader.js');
|
|
9
|
+
var LocalizationProvider = require('../localization-provider/LocalizationProvider.js');
|
|
10
|
+
var createAnnouncement = require('../calendar/internal/createAnnouncement.js');
|
|
11
|
+
require('../calendar/useCalendarSelection.js');
|
|
12
|
+
var useDateSelectionAnnouncer = require('../calendar/useDateSelectionAnnouncer.js');
|
|
13
|
+
require('../calendar/internal/CalendarContext.js');
|
|
14
|
+
var DatePickerOverlayProvider = require('./DatePickerOverlayProvider.js');
|
|
15
|
+
|
|
16
|
+
function useDatePicker(props, ref) {
|
|
17
|
+
const {
|
|
18
|
+
dateAdapter,
|
|
19
|
+
defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate }
|
|
20
|
+
} = LocalizationProvider.useLocalization();
|
|
21
|
+
const {
|
|
22
|
+
createAnnouncement: createAnnouncement$1,
|
|
23
|
+
readOnly = false,
|
|
24
|
+
disabled,
|
|
25
|
+
selectionVariant,
|
|
26
|
+
defaultSelectedDate,
|
|
27
|
+
isDayHighlighted,
|
|
28
|
+
isDayUnselectable,
|
|
29
|
+
selectedDate: selectedDateProp,
|
|
30
|
+
onSelectionChange,
|
|
31
|
+
onApply,
|
|
32
|
+
minDate = defaultMinDate,
|
|
33
|
+
maxDate = defaultMaxDate,
|
|
34
|
+
onCancel,
|
|
35
|
+
timezone
|
|
36
|
+
} = props;
|
|
37
|
+
const previousSelectedDate = react.useRef();
|
|
38
|
+
const datePickerRef = react.useRef(null);
|
|
39
|
+
const containerRef = core.useForkRef(ref, datePickerRef);
|
|
40
|
+
const { announce } = useDateSelectionAnnouncer.useDateSelectionAnnouncer(
|
|
41
|
+
createAnnouncement$1 ?? (selectionVariant === "single" ? createAnnouncement.createSingleSelectionAnnouncement : createAnnouncement.createRangeSelectionAnnouncement),
|
|
42
|
+
dateAdapter
|
|
43
|
+
);
|
|
44
|
+
const {
|
|
45
|
+
state: { open },
|
|
46
|
+
helpers: { setOpen, setOnDismiss }
|
|
47
|
+
} = DatePickerOverlayProvider.useDatePickerOverlay();
|
|
48
|
+
const [selectedDate, setSelectedDate] = core.useControlled({
|
|
49
|
+
controlled: selectedDateProp,
|
|
50
|
+
default: defaultSelectedDate,
|
|
51
|
+
name: "DatePicker",
|
|
52
|
+
state: "selectedDate"
|
|
53
|
+
});
|
|
54
|
+
const [enableApply, setEnableApply] = react.useState(false);
|
|
55
|
+
const [cancelled, setCancelled] = react.useState(false);
|
|
56
|
+
react.useEffect(() => {
|
|
57
|
+
if (open) {
|
|
58
|
+
previousSelectedDate.current = selectedDate;
|
|
59
|
+
if (enableApply) {
|
|
60
|
+
setOnDismiss(cancel);
|
|
61
|
+
}
|
|
62
|
+
setCancelled(false);
|
|
63
|
+
}
|
|
64
|
+
}, [enableApply, open, setOnDismiss, setCancelled]);
|
|
65
|
+
react.useEffect(() => {
|
|
66
|
+
if (cancelled) {
|
|
67
|
+
setSelectedDate(previousSelectedDate == null ? void 0 : previousSelectedDate.current);
|
|
68
|
+
}
|
|
69
|
+
}, [cancelled, setSelectedDate]);
|
|
70
|
+
const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } = core.useFormFieldProps();
|
|
71
|
+
const isReadOnly = readOnly || formFieldReadOnly || false;
|
|
72
|
+
const isDisabled = disabled || formFieldDisabled || false;
|
|
73
|
+
const applySingle = react.useCallback(
|
|
74
|
+
(event, date) => {
|
|
75
|
+
setCancelled(false);
|
|
76
|
+
setOpen(false, event.nativeEvent, "apply");
|
|
77
|
+
announce("dateSelected", { multiselect: false, selectedDate: date });
|
|
78
|
+
if (selectionVariant === "single") {
|
|
79
|
+
onApply == null ? void 0 : onApply(event, date);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
[announce, selectionVariant, setOpen, onApply]
|
|
83
|
+
);
|
|
84
|
+
const checkAndAddError = react.useCallback(
|
|
85
|
+
(date, checkFunction, errorType, details = {}) => {
|
|
86
|
+
const errorMessage = date ? checkFunction == null ? void 0 : checkFunction(date) : false;
|
|
87
|
+
if (errorMessage) {
|
|
88
|
+
details.errors = details.errors ?? [];
|
|
89
|
+
details.errors.push({
|
|
90
|
+
type: errorType,
|
|
91
|
+
message: errorMessage
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
[]
|
|
96
|
+
);
|
|
97
|
+
const selectSingle = react.useCallback(
|
|
98
|
+
(event, date, details) => {
|
|
99
|
+
var _a;
|
|
100
|
+
const canBeApplied = dateAdapter.isValid(date) && !((_a = details == null ? void 0 : details.errors) == null ? void 0 : _a.length);
|
|
101
|
+
setSelectedDate(date);
|
|
102
|
+
checkAndAddError(date, isDayUnselectable, "unselectable", details);
|
|
103
|
+
if (selectionVariant === "single") {
|
|
104
|
+
onSelectionChange == null ? void 0 : onSelectionChange(event, date, details);
|
|
105
|
+
}
|
|
106
|
+
if (!enableApply && canBeApplied) {
|
|
107
|
+
applySingle(event, date);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
[
|
|
111
|
+
checkAndAddError,
|
|
112
|
+
dateAdapter,
|
|
113
|
+
applySingle,
|
|
114
|
+
isDayUnselectable,
|
|
115
|
+
enableApply,
|
|
116
|
+
onSelectionChange,
|
|
117
|
+
selectionVariant
|
|
118
|
+
]
|
|
119
|
+
);
|
|
120
|
+
const applyRange = react.useCallback(
|
|
121
|
+
(event, date) => {
|
|
122
|
+
setCancelled(false);
|
|
123
|
+
setOpen(false, event.nativeEvent, "apply");
|
|
124
|
+
announce("dateSelected", {
|
|
125
|
+
multiselect: false,
|
|
126
|
+
selectedDate: date ? {
|
|
127
|
+
startDate: date.startDate ?? void 0,
|
|
128
|
+
endDate: date.endDate ?? void 0
|
|
129
|
+
} : null
|
|
130
|
+
});
|
|
131
|
+
if (selectionVariant === "range") {
|
|
132
|
+
onApply == null ? void 0 : onApply(event, date);
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
[announce, onApply, setOpen, selectionVariant]
|
|
136
|
+
);
|
|
137
|
+
const selectRange = react.useCallback(
|
|
138
|
+
(event, date, details) => {
|
|
139
|
+
var _a, _b, _c, _d;
|
|
140
|
+
setSelectedDate(date);
|
|
141
|
+
checkAndAddError(
|
|
142
|
+
date == null ? void 0 : date.startDate,
|
|
143
|
+
isDayUnselectable,
|
|
144
|
+
"unselectable",
|
|
145
|
+
details == null ? void 0 : details.startDate
|
|
146
|
+
);
|
|
147
|
+
checkAndAddError(
|
|
148
|
+
date == null ? void 0 : date.endDate,
|
|
149
|
+
isDayUnselectable,
|
|
150
|
+
"unselectable",
|
|
151
|
+
details == null ? void 0 : details.endDate
|
|
152
|
+
);
|
|
153
|
+
if (selectionVariant === "range") {
|
|
154
|
+
onSelectionChange == null ? void 0 : onSelectionChange(event, date, details);
|
|
155
|
+
}
|
|
156
|
+
const isAValidRange = dateAdapter.isValid(date == null ? void 0 : date.startDate) && dateAdapter.isValid(date == null ? void 0 : date.endDate);
|
|
157
|
+
const isValidSelection = !((_b = (_a = details == null ? void 0 : details.startDate) == null ? void 0 : _a.errors) == null ? void 0 : _b.length) && !((_d = (_c = details == null ? void 0 : details.endDate) == null ? void 0 : _c.errors) == null ? void 0 : _d.length);
|
|
158
|
+
const canBeApplied = isAValidRange && isValidSelection;
|
|
159
|
+
if (!enableApply && canBeApplied) {
|
|
160
|
+
applyRange(event, date);
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
[
|
|
164
|
+
checkAndAddError,
|
|
165
|
+
dateAdapter,
|
|
166
|
+
applyRange,
|
|
167
|
+
isDayUnselectable,
|
|
168
|
+
enableApply,
|
|
169
|
+
onSelectionChange,
|
|
170
|
+
selectionVariant
|
|
171
|
+
]
|
|
172
|
+
);
|
|
173
|
+
const cancel = react.useCallback(
|
|
174
|
+
(event) => {
|
|
175
|
+
setCancelled(true);
|
|
176
|
+
setOpen(false, event, "cancel");
|
|
177
|
+
onCancel == null ? void 0 : onCancel();
|
|
178
|
+
},
|
|
179
|
+
[setOpen, onCancel]
|
|
180
|
+
);
|
|
181
|
+
const returnValue = {
|
|
182
|
+
state: {
|
|
183
|
+
selectionVariant,
|
|
184
|
+
selectedDate,
|
|
185
|
+
cancelled,
|
|
186
|
+
enableApply,
|
|
187
|
+
disabled: isDisabled,
|
|
188
|
+
readOnly: isReadOnly,
|
|
189
|
+
containerRef,
|
|
190
|
+
minDate,
|
|
191
|
+
maxDate,
|
|
192
|
+
timezone
|
|
193
|
+
},
|
|
194
|
+
helpers: {
|
|
195
|
+
cancel,
|
|
196
|
+
isDayHighlighted,
|
|
197
|
+
isDayUnselectable,
|
|
198
|
+
setEnableApply
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
if (props.selectionVariant === "range") {
|
|
202
|
+
return {
|
|
203
|
+
...returnValue,
|
|
204
|
+
helpers: {
|
|
205
|
+
...returnValue.helpers,
|
|
206
|
+
apply: applyRange,
|
|
207
|
+
select: selectRange
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
...returnValue,
|
|
213
|
+
helpers: {
|
|
214
|
+
...returnValue.helpers,
|
|
215
|
+
apply: applySingle,
|
|
216
|
+
select: selectSingle
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
exports.useDatePicker = useDatePicker;
|
|
222
|
+
//# sourceMappingURL=useDatePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDatePicker.js","sources":["../src/date-picker/useDatePicker.ts"],"sourcesContent":["import { useControlled, useForkRef, useFormFieldProps } from \"@salt-ds/core\";\nimport type { DateFrameworkType, Timezone } from \"@salt-ds/date-adapters\";\nimport {\n type SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport {\n type CreateAnnouncement,\n useDateSelectionAnnouncer,\n} from \"../calendar\";\nimport {\n createRangeSelectionAnnouncement,\n createSingleSelectionAnnouncement,\n} from \"../calendar/internal/createAnnouncement\";\nimport type {\n DateInputRangeDetails,\n DateInputSingleDetails,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport type {\n RangeDatePickerState,\n SingleDatePickerState,\n} from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\ninterface UseDatePickerBaseProps {\n /**\n * Factory method for date selection live announcements or null to silence announcements\n */\n createAnnouncement?: CreateAnnouncement | null;\n /**\n * If `true`, the component is disabled.\n */\n disabled?: boolean;\n /**\n * Function to determine if a day is highlighted.\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted?: (date: DateFrameworkType) => string | false | undefined;\n /**\n * Function to determine if a day is unselectable.\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable?: (date: DateFrameworkType) => string | false | undefined;\n /** If `true`, the component is read-only. */\n readOnly?: boolean;\n /**\n * The minimum date for the range, default is 1900.\n */\n minDate?: DateFrameworkType;\n /**\n * The maximum date for the range, default is 2100.\n */\n maxDate?: DateFrameworkType;\n /**\n * Handler for when the date selection is cancelled.\n */\n onCancel?: () => void;\n /**\n * Timezone, if un-defined will take the timezone from passed date (or defaultSelectedDate/selectedDate)\n * Can also be set to \"default\" to use the default timezone of the date library\n * Can also be set to \"system\" to take the timezone of the local system.\n */\n timezone?: Timezone;\n}\n\n/**\n * Props for single date selection.\n */\nexport interface UseDatePickerSingleProps extends UseDatePickerBaseProps {\n /**\n * Single date selection.\n */\n selectionVariant: \"single\";\n /**\n * The selected date. The selected date will be controlled when this prop is provided.\n */\n selectedDate?: SingleDateSelection | null;\n /**\n * The initial selected date, when the selected date is uncontrolled.\n */\n defaultSelectedDate?: SingleDateSelection | null;\n /**\n * Handler called when the selected date changes.\n * @param event - The synthetic event.\n * @param date - The selected date or null.\n * @param details - The selected date details.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n date: SingleDateSelection | null,\n details?: DateInputSingleDetails,\n ) => void;\n /**\n * Handler called when the selected date is confirmed/applied.\n * @param event - The synthetic event.\n * @param date - The selected date or null.\n */\n onApply?: (event: SyntheticEvent, date: SingleDateSelection | null) => void;\n}\n\n/**\n * Props for date range selection.\n */\nexport interface UseDatePickerRangeProps extends UseDatePickerBaseProps {\n /**\n * Date range selection.\n */\n selectionVariant: \"range\";\n /**\n * The selected date range. The selected date will be controlled when this prop is provided.\n */\n selectedDate?: DateRangeSelection | null;\n /**\n * The initial selected date range, when the selected date is uncontrolled.\n */\n defaultSelectedDate?: DateRangeSelection | null;\n /**\n * Handler called when the selected date range changes.\n * @param event - The synthetic event.\n * @param date - The selected date range or null.\n * @param details - The selected date range details.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n date: DateRangeSelection | null,\n details?: DateInputRangeDetails,\n ) => void;\n /**\n * Handler called when the selected date range is confirmed/applied.\n * @param event - The synthetic event.\n * @param date - The selected date range.\n */\n onApply?: (event: SyntheticEvent, date: DateRangeSelection | null) => void;\n}\n\n/**\n * Props for the useDatePicker hook.\n */\nexport type UseDatePickerProps =\n | UseDatePickerSingleProps\n | UseDatePickerRangeProps;\n\n/**\n * Custom hook for managing date picker state.\n * @template SelectionVariant - The selection variant, either \"single\" or \"range\".\n * @param props - The props for the date picker.\n * @param ref - The ref for the date picker container.\n * @returns The date picker state and helpers.\n */\nexport function useDatePicker(\n props: UseDatePickerProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n): SingleDatePickerState | RangeDatePickerState {\n const {\n dateAdapter,\n defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate },\n } = useLocalization<DateFrameworkType>();\n const {\n createAnnouncement,\n readOnly = false,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n isDayHighlighted,\n isDayUnselectable,\n selectedDate: selectedDateProp,\n onSelectionChange,\n onApply,\n minDate = defaultMinDate,\n maxDate = defaultMaxDate,\n onCancel,\n timezone,\n } = props;\n\n const previousSelectedDate = useRef<typeof selectedDateProp>();\n const datePickerRef = useRef<HTMLDivElement>(null);\n const containerRef = useForkRef(ref, datePickerRef);\n\n const { announce } = useDateSelectionAnnouncer(\n createAnnouncement ??\n (selectionVariant === \"single\"\n ? createSingleSelectionAnnouncement\n : createRangeSelectionAnnouncement),\n dateAdapter,\n );\n\n const {\n state: { open },\n helpers: { setOpen, setOnDismiss },\n } = useDatePickerOverlay();\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"DatePicker\",\n state: \"selectedDate\",\n });\n\n const [enableApply, setEnableApply] = useState<boolean>(false);\n const [cancelled, setCancelled] = useState<boolean>(false);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousSelectedDate.current = selectedDate;\n if (enableApply) {\n setOnDismiss(cancel);\n }\n setCancelled(false);\n }\n }, [enableApply, open, setOnDismiss, setCancelled]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setSelectedDate(previousSelectedDate?.current);\n }\n }, [cancelled, setSelectedDate]);\n\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnly || formFieldReadOnly || false;\n const isDisabled = disabled || formFieldDisabled || false;\n\n const applySingle = useCallback(\n (event: SyntheticEvent, date: SingleDateSelection | null): void => {\n setCancelled(false);\n setOpen(false, event.nativeEvent, \"apply\");\n announce(\"dateSelected\", { multiselect: false, selectedDate: date });\n if (selectionVariant === \"single\") {\n onApply?.(event, date);\n }\n },\n [announce, selectionVariant, setOpen, onApply],\n );\n\n const checkAndAddError = useCallback(\n (\n date: DateFrameworkType | null | undefined,\n checkFunction:\n | ((date: DateFrameworkType) => string | false | undefined)\n | undefined,\n errorType: string,\n details: {\n errors?: { type: string; message: string | false | undefined }[];\n } = {},\n ) => {\n const errorMessage = date ? checkFunction?.(date) : false;\n if (errorMessage) {\n details.errors = details.errors ?? [];\n details.errors.push({\n type: errorType,\n message: errorMessage,\n });\n }\n },\n [],\n );\n\n const selectSingle = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection | null,\n details: DateInputSingleDetails,\n ) => {\n const canBeApplied =\n dateAdapter.isValid(date) && !details?.errors?.length;\n setSelectedDate(date);\n checkAndAddError(date, isDayUnselectable, \"unselectable\", details);\n\n if (selectionVariant === \"single\") {\n onSelectionChange?.(event, date, details);\n }\n if (!enableApply && canBeApplied) {\n applySingle(event, date);\n }\n },\n [\n checkAndAddError,\n dateAdapter,\n applySingle,\n isDayUnselectable,\n enableApply,\n onSelectionChange,\n selectionVariant,\n ],\n );\n\n const applyRange = useCallback(\n (event: SyntheticEvent, date: DateRangeSelection | null): void => {\n setCancelled(false);\n setOpen(false, event.nativeEvent, \"apply\");\n announce(\"dateSelected\", {\n multiselect: false,\n selectedDate: date\n ? {\n startDate: date.startDate ?? undefined,\n endDate: date.endDate ?? undefined,\n }\n : null,\n });\n if (selectionVariant === \"range\") {\n onApply?.(event, date);\n }\n },\n [announce, onApply, setOpen, selectionVariant],\n );\n\n const selectRange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection | null,\n details: DateInputRangeDetails,\n ) => {\n setSelectedDate(date);\n checkAndAddError(\n date?.startDate,\n isDayUnselectable,\n \"unselectable\",\n details?.startDate,\n );\n checkAndAddError(\n date?.endDate,\n isDayUnselectable,\n \"unselectable\",\n details?.endDate,\n );\n\n if (selectionVariant === \"range\") {\n onSelectionChange?.(event, date, details);\n }\n const isAValidRange =\n dateAdapter.isValid(date?.startDate) &&\n dateAdapter.isValid(date?.endDate);\n const isValidSelection =\n !details?.startDate?.errors?.length &&\n !details?.endDate?.errors?.length;\n const canBeApplied = isAValidRange && isValidSelection;\n if (!enableApply && canBeApplied) {\n applyRange(event, date);\n }\n },\n [\n checkAndAddError,\n dateAdapter,\n applyRange,\n isDayUnselectable,\n enableApply,\n onSelectionChange,\n selectionVariant,\n ],\n );\n\n const cancel = useCallback(\n (event?: Event) => {\n setCancelled(true);\n setOpen(false, event, \"cancel\");\n onCancel?.();\n },\n [setOpen, onCancel],\n );\n\n const returnValue = {\n state: {\n selectionVariant,\n selectedDate,\n cancelled,\n enableApply,\n disabled: isDisabled,\n readOnly: isReadOnly,\n containerRef,\n minDate,\n maxDate,\n timezone,\n },\n helpers: {\n cancel,\n isDayHighlighted,\n isDayUnselectable,\n setEnableApply,\n },\n };\n if (props.selectionVariant === \"range\") {\n return {\n ...returnValue,\n helpers: {\n ...returnValue.helpers,\n apply: applyRange,\n select: selectRange,\n },\n } as RangeDatePickerState;\n }\n return {\n ...returnValue,\n helpers: {\n ...returnValue.helpers,\n apply: applySingle,\n select: selectSingle,\n },\n } as SingleDatePickerState;\n}\n"],"names":["useLocalization","createAnnouncement","useRef","useForkRef","useDateSelectionAnnouncer","createSingleSelectionAnnouncement","createRangeSelectionAnnouncement","useDatePickerOverlay","useControlled","useState","useEffect","useFormFieldProps","useCallback"],"mappings":";;;;;;;;;;;;;;;AA4JO,SAAS,aAAA,CACd,OACA,GAAA,EAC8C;AAC9C,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,YAAA,EAAc,EAAE,OAAA,EAAS,cAAA,EAAgB,SAAS,cAAA;AAAe,MAC/DA,oCAAA,EAAmC;AACvC,EAAA,MAAM;AAAA,wBACJC,oBAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA,EAAc,gBAAA;AAAA,IACd,iBAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,GAAU,cAAA;AAAA,IACV,OAAA,GAAU,cAAA;AAAA,IACV,QAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,uBAAuBC,YAAA,EAAgC;AAC7D,EAAA,MAAM,aAAA,GAAgBA,aAAuB,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAeC,eAAA,CAAW,GAAA,EAAK,aAAa,CAAA;AAElD,EAAA,MAAM,EAAE,UAAS,GAAIC,mDAAA;AAAA,IACnBH,oBAAA,KACG,gBAAA,KAAqB,QAAA,GAClBI,oDAAA,GACAC,mDAAA,CAAA;AAAA,IACN;AAAA,GACF;AAEA,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,EAAE,IAAA,EAAK;AAAA,IACd,OAAA,EAAS,EAAE,OAAA,EAAS,YAAA;AAAa,MAC/BC,8CAAA,EAAqB;AAEzB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,kBAAA,CAAc;AAAA,IACpD,UAAA,EAAY,gBAAA;AAAA,IACZ,OAAA,EAAS,mBAAA;AAAA,IACT,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAkB,KAAK,CAAA;AAC7D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAkB,KAAK,CAAA;AAGzD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,oBAAA,CAAqB,OAAA,GAAU,YAAA;AAC/B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,YAAA,CAAa,MAAM,CAAA;AAAA,MACrB;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,YAAY,CAAC,CAAA;AAGlD,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,eAAA,CAAgB,6DAAsB,OAAO,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,eAAe,CAAC,CAAA;AAE/B,EAAA,MAAM,EAAE,QAAA,EAAU,iBAAA,EAAmB,QAAA,EAAU,iBAAA,KAC7CC,sBAAA,EAAkB;AACpB,EAAA,MAAM,UAAA,GAAa,YAAY,iBAAA,IAAqB,KAAA;AACpD,EAAA,MAAM,UAAA,GAAa,YAAY,iBAAA,IAAqB,KAAA;AAEpD,EAAA,MAAM,WAAA,GAAcC,iBAAA;AAAA,IAClB,CAAC,OAAuB,IAAA,KAA2C;AACjE,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,OAAO,CAAA;AACzC,MAAA,QAAA,CAAS,gBAAgB,EAAE,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,MAAM,CAAA;AACnE,MAAA,IAAI,qBAAqB,QAAA,EAAU;AACjC,QAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,EAAO,IAAA,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,gBAAA,EAAkB,OAAA,EAAS,OAAO;AAAA,GAC/C;AAEA,EAAA,MAAM,gBAAA,GAAmBA,iBAAA;AAAA,IACvB,CACE,IAAA,EACA,aAAA,EAGA,SAAA,EACA,OAAA,GAEI,EAAC,KACF;AACH,MAAA,MAAM,YAAA,GAAe,IAAA,GAAO,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAgB,IAAA,CAAA,GAAQ,KAAA;AACpD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AACpC,QAAA,OAAA,CAAQ,OAAO,IAAA,CAAK;AAAA,UAClB,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,YAAA,GAAeA,iBAAA;AAAA,IACnB,CACE,KAAA,EACA,IAAA,EACA,OAAA,KACG;AA/QT,MAAA,IAAA,EAAA;AAgRM,MAAA,MAAM,YAAA,GACJ,YAAY,OAAA,CAAQ,IAAI,KAAK,EAAA,CAAC,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,WAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,MAAA,CAAA;AACjD,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,gBAAA,CAAiB,IAAA,EAAM,iBAAA,EAAmB,cAAA,EAAgB,OAAO,CAAA;AAEjE,MAAA,IAAI,qBAAqB,QAAA,EAAU;AACjC,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,OAAO,IAAA,EAAM,OAAA,CAAA;AAAA,MACnC;AACA,MAAA,IAAI,CAAC,eAAe,YAAA,EAAc;AAChC,QAAA,WAAA,CAAY,OAAO,IAAI,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAA;AAAA,IACjB,CAAC,OAAuB,IAAA,KAA0C;AAChE,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,OAAO,CAAA;AACzC,MAAA,QAAA,CAAS,cAAA,EAAgB;AAAA,QACvB,WAAA,EAAa,KAAA;AAAA,QACb,cAAc,IAAA,GACV;AAAA,UACE,SAAA,EAAW,KAAK,SAAA,IAAa,MAAA;AAAA,UAC7B,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,SAC3B,GACA;AAAA,OACL,CAAA;AACD,MAAA,IAAI,qBAAqB,OAAA,EAAS;AAChC,QAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,EAAO,IAAA,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,gBAAgB;AAAA,GAC/C;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAA;AAAA,IAClB,CACE,KAAA,EACA,IAAA,EACA,OAAA,KACG;AAhUT,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiUM,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,gBAAA;AAAA,QACE,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAA;AAAA,QACN,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS;AAAA,OACX;AACA,MAAA,gBAAA;AAAA,QACE,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAA;AAAA,QACN,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS;AAAA,OACX;AAEA,MAAA,IAAI,qBAAqB,OAAA,EAAS;AAChC,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,OAAO,IAAA,EAAM,OAAA,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,aAAA,GACJ,YAAY,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAS,CAAA,IACnC,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAO,CAAA;AACnC,MAAA,MAAM,gBAAA,GACJ,EAAA,CAAC,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,SAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoB,MAAA,KAApB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA4B,MAAA,CAAA,IAC7B,EAAA,CAAC,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,WAAlB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0B,MAAA,CAAA;AAC7B,MAAA,MAAM,eAAe,aAAA,IAAiB,gBAAA;AACtC,MAAA,IAAI,CAAC,eAAe,YAAA,EAAc;AAChC,QAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,MAAA,GAASA,iBAAA;AAAA,IACb,CAAC,KAAA,KAAkB;AACjB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,OAAA,CAAQ,KAAA,EAAO,OAAO,QAAQ,CAAA;AAC9B,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAEA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,KAAA,EAAO;AAAA,MACL,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA;AAAA,MACA,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,IAAI,KAAA,CAAM,qBAAqB,OAAA,EAAS;AACtC,IAAA,OAAO;AAAA,MACL,GAAG,WAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,GAAG,WAAA,CAAY,OAAA;AAAA,QACf,KAAA,EAAO,UAAA;AAAA,QACP,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAG,WAAA;AAAA,IACH,OAAA,EAAS;AAAA,MACP,GAAG,WAAA,CAAY,OAAA;AAAA,MACf,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ;AAAA;AACV,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
function getTabbableElements(parent) {
|
|
6
|
+
const focusableSelectors = [
|
|
7
|
+
"button:not([disabled])",
|
|
8
|
+
"input:not([disabled])",
|
|
9
|
+
'[tabindex]:not([tabindex="-1"])'
|
|
10
|
+
];
|
|
11
|
+
const tabbableElements = parent.querySelectorAll(
|
|
12
|
+
focusableSelectors.join(",")
|
|
13
|
+
);
|
|
14
|
+
return Array.from(tabbableElements).filter(
|
|
15
|
+
(element) => !element.hasAttribute("disabled") && element.tabIndex >= 0
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function useFocusOut(context, props) {
|
|
19
|
+
const { onOpenChange } = context;
|
|
20
|
+
const { enabled = true } = props;
|
|
21
|
+
const reference = react.useMemo(() => {
|
|
22
|
+
const referenceElement = context.elements.reference;
|
|
23
|
+
if (!referenceElement) {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
onKeyDown(event) {
|
|
28
|
+
if (event.key === "Tab") {
|
|
29
|
+
const tabbableElements = getTabbableElements(referenceElement);
|
|
30
|
+
const tabbedBeforeFirstElement = event.shiftKey && document.activeElement === tabbableElements[0];
|
|
31
|
+
const tabbedAfterLastElement = document.activeElement === tabbableElements[tabbableElements.length - 1];
|
|
32
|
+
if (tabbedBeforeFirstElement || tabbedAfterLastElement) {
|
|
33
|
+
onOpenChange(false, event.nativeEvent, "focus-out");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}, [onOpenChange, context.elements.reference]);
|
|
39
|
+
return react.useMemo(() => enabled ? { reference } : {}, [enabled, reference]);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
exports.useFocusOut = useFocusOut;
|
|
43
|
+
//# sourceMappingURL=useFocusOut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusOut.js","sources":["../src/date-picker/useFocusOut.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { useMemo } from \"react\";\n\nexport interface UseFocusOutProps {\n /**\n * Whether the hook is enabled\n * @default true\n */\n enabled?: boolean;\n}\n\nfunction getTabbableElements(parent: Element): HTMLElement[] {\n const focusableSelectors = [\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n ];\n const tabbableElements = parent.querySelectorAll<HTMLElement>(\n focusableSelectors.join(\",\"),\n );\n return Array.from(tabbableElements).filter(\n (element) => !element.hasAttribute(\"disabled\") && element.tabIndex >= 0,\n );\n}\n//\n// This hook is needed to close the overlay, when,\n// 1. the floating element is opened\n// 2. the user re-focuses into the reference element with the mouse\n// 3. the user tabs out of the reference element\n// Without this hook, the floating element can re-receive focus\nexport function useFocusOut(\n context: FloatingContext,\n props: UseFocusOutProps,\n): ElementProps {\n const { onOpenChange } = context;\n const { enabled = true } = props;\n\n const reference: ElementProps[\"reference\"] = useMemo(() => {\n const referenceElement = context.elements.reference as Element | undefined;\n\n if (!referenceElement) {\n return {};\n }\n\n return {\n onKeyDown(event: React.KeyboardEvent<Element>) {\n if (event.key === \"Tab\") {\n const tabbableElements = getTabbableElements(referenceElement);\n const tabbedBeforeFirstElement =\n event.shiftKey && document.activeElement === tabbableElements[0];\n const tabbedAfterLastElement =\n document.activeElement ===\n tabbableElements[tabbableElements.length - 1];\n if (tabbedBeforeFirstElement || tabbedAfterLastElement) {\n onOpenChange(false, event.nativeEvent, \"focus-out\");\n }\n }\n },\n };\n }, [onOpenChange, context.elements.reference]);\n\n return useMemo(() => (enabled ? { reference } : {}), [enabled, reference]);\n}\n"],"names":["useMemo"],"mappings":";;;;AAWA,SAAS,oBAAoB,MAAA,EAAgC;AAC3D,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,wBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,mBAAmB,MAAA,CAAO,gBAAA;AAAA,IAC9B,kBAAA,CAAmB,KAAK,GAAG;AAAA,GAC7B;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAAE,MAAA;AAAA,IAClC,CAAC,YAAY,CAAC,OAAA,CAAQ,aAAa,UAAU,CAAA,IAAK,QAAQ,QAAA,IAAY;AAAA,GACxE;AACF;AAOO,SAAS,WAAA,CACd,SACA,KAAA,EACc;AACd,EAAA,MAAM,EAAE,cAAa,GAAI,OAAA;AACzB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAK,GAAI,KAAA;AAE3B,EAAA,MAAM,SAAA,GAAuCA,cAAQ,MAAM;AACzD,IAAA,MAAM,gBAAA,GAAmB,QAAQ,QAAA,CAAS,SAAA;AAE1C,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,EAAqC;AAC7C,QAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,UAAA,MAAM,gBAAA,GAAmB,oBAAoB,gBAAgB,CAAA;AAC7D,UAAA,MAAM,2BACJ,KAAA,CAAM,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,iBAAiB,CAAC,CAAA;AACjE,UAAA,MAAM,yBACJ,QAAA,CAAS,aAAA,KACT,gBAAA,CAAiB,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAC9C,UAAA,IAAI,4BAA4B,sBAAA,EAAwB;AACtD,YAAA,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,WAAW,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAC,CAAA;AAE7C,EAAA,OAAOA,aAAA,CAAQ,MAAO,OAAA,GAAU,EAAE,SAAA,EAAU,GAAI,EAAC,EAAI,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAC3E;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
function useKeyboard(_context, props) {
|
|
6
|
+
const { enabled = true, onArrowDown } = props;
|
|
7
|
+
const reference = react.useMemo(
|
|
8
|
+
() => ({
|
|
9
|
+
onKeyDown(event) {
|
|
10
|
+
if (event.key === "ArrowDown") {
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
onArrowDown == null ? void 0 : onArrowDown(event);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}),
|
|
16
|
+
[onArrowDown]
|
|
17
|
+
);
|
|
18
|
+
return react.useMemo(() => enabled ? { reference } : {}, [enabled, reference]);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
exports.useKeyboard = useKeyboard;
|
|
22
|
+
//# sourceMappingURL=useKeyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboard.js","sources":["../src/date-picker/useKeyboard.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { type KeyboardEvent, useMemo } from \"react\";\n\nexport interface UseKeyboardProps {\n /**\n * Whether the hook is enabled\n * @default true\n */\n enabled?: boolean;\n /**\n * Handler for when the arrow key down is pressed\n * @param event\n */\n onArrowDown?: (event: KeyboardEvent) => void;\n}\n\n/**\n * Floating UI Interactions hook, that will open DatePicker on keydown\n * @param context\n * @param props\n */\nexport function useKeyboard(\n _context: FloatingContext,\n props: UseKeyboardProps,\n): ElementProps {\n const { enabled = true, onArrowDown } = props;\n const reference = useMemo(\n () => ({\n onKeyDown(event: KeyboardEvent) {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n onArrowDown?.(event);\n }\n },\n }),\n [onArrowDown],\n );\n\n return useMemo(() => (enabled ? { reference } : {}), [enabled, reference]);\n}\n"],"names":["useMemo"],"mappings":";;;;AAqBO,SAAS,WAAA,CACd,UACA,KAAA,EACc;AACd,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,WAAA,EAAY,GAAI,KAAA;AACxC,EAAA,MAAM,SAAA,GAAYA,aAAA;AAAA,IAChB,OAAO;AAAA,MACL,UAAU,KAAA,EAAsB;AAC9B,QAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC7B,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,KAAA,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,KACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,OAAOA,aAAA,CAAQ,MAAO,OAAA,GAAU,EAAE,SAAA,EAAU,GAAI,EAAC,EAAI,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAC3E;;;;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Calendar = require('./calendar/Calendar.js');
|
|
4
|
+
var CalendarGrid = require('./calendar/CalendarGrid.js');
|
|
5
|
+
var CalendarNavigation = require('./calendar/CalendarNavigation.js');
|
|
6
|
+
var CalendarWeekHeader = require('./calendar/CalendarWeekHeader.js');
|
|
7
|
+
var useCalendar = require('./calendar/useCalendar.js');
|
|
8
|
+
var useCalendarDay = require('./calendar/useCalendarDay.js');
|
|
9
|
+
var useCalendarSelection = require('./calendar/useCalendarSelection.js');
|
|
10
|
+
var useDateSelectionAnnouncer = require('./calendar/useDateSelectionAnnouncer.js');
|
|
11
|
+
var DateInputRange = require('./date-input/DateInputRange.js');
|
|
12
|
+
var DateInputSingle = require('./date-input/DateInputSingle.js');
|
|
13
|
+
var DatePicker = require('./date-picker/DatePicker.js');
|
|
14
|
+
var DatePickerActions = require('./date-picker/DatePickerActions.js');
|
|
15
|
+
var DatePickerContext = require('./date-picker/DatePickerContext.js');
|
|
16
|
+
var DatePickerHelperText = require('./date-picker/DatePickerHelperText.js');
|
|
17
|
+
var DatePickerOverlay = require('./date-picker/DatePickerOverlay.js');
|
|
18
|
+
var DatePickerOverlayProvider = require('./date-picker/DatePickerOverlayProvider.js');
|
|
19
|
+
var DatePickerRangeGridPanel = require('./date-picker/DatePickerRangeGridPanel.js');
|
|
20
|
+
var DatePickerRangeInput = require('./date-picker/DatePickerRangeInput.js');
|
|
21
|
+
var DatePickerRangePanel = require('./date-picker/DatePickerRangePanel.js');
|
|
22
|
+
var DatePickerSingleGridPanel = require('./date-picker/DatePickerSingleGridPanel.js');
|
|
23
|
+
var DatePickerSingleInput = require('./date-picker/DatePickerSingleInput.js');
|
|
24
|
+
var DatePickerSinglePanel = require('./date-picker/DatePickerSinglePanel.js');
|
|
25
|
+
var DatePickerTrigger = require('./date-picker/DatePickerTrigger.js');
|
|
26
|
+
var LocalizationProvider = require('./localization-provider/LocalizationProvider.js');
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
exports.Calendar = Calendar.Calendar;
|
|
31
|
+
exports.CalendarGrid = CalendarGrid.CalendarGrid;
|
|
32
|
+
exports.CalendarNavigation = CalendarNavigation.CalendarNavigation;
|
|
33
|
+
exports.CalendarWeekHeader = CalendarWeekHeader.CalendarWeekHeader;
|
|
34
|
+
exports.useCalendar = useCalendar.useCalendar;
|
|
35
|
+
exports.useCalendarDay = useCalendarDay.useCalendarDay;
|
|
36
|
+
exports.isDateRangeSelection = useCalendarSelection.isDateRangeSelection;
|
|
37
|
+
exports.useCalendarSelection = useCalendarSelection.useCalendarSelection;
|
|
38
|
+
exports.useCalendarSelectionDay = useCalendarSelection.useCalendarSelectionDay;
|
|
39
|
+
exports.useDateSelectionAnnouncer = useDateSelectionAnnouncer.useDateSelectionAnnouncer;
|
|
40
|
+
exports.DateInputRange = DateInputRange.DateInputRange;
|
|
41
|
+
exports.DateParserField = DateInputRange.DateParserField;
|
|
42
|
+
exports.DateInputSingle = DateInputSingle.DateInputSingle;
|
|
43
|
+
exports.DatePicker = DatePicker.DatePicker;
|
|
44
|
+
exports.DatePickerMain = DatePicker.DatePickerMain;
|
|
45
|
+
exports.DatePickerActions = DatePickerActions.DatePickerActions;
|
|
46
|
+
exports.DateRangeSelectionContext = DatePickerContext.DateRangeSelectionContext;
|
|
47
|
+
exports.SingleDateSelectionContext = DatePickerContext.SingleDateSelectionContext;
|
|
48
|
+
exports.useDatePickerContext = DatePickerContext.useDatePickerContext;
|
|
49
|
+
exports.DatePickerHelperText = DatePickerHelperText.DatePickerHelperText;
|
|
50
|
+
exports.DatePickerOverlay = DatePickerOverlay.DatePickerOverlay;
|
|
51
|
+
exports.DatePickerOverlayProvider = DatePickerOverlayProvider.DatePickerOverlayProvider;
|
|
52
|
+
exports.useDatePickerOverlay = DatePickerOverlayProvider.useDatePickerOverlay;
|
|
53
|
+
exports.DatePickerRangeGridPanel = DatePickerRangeGridPanel.DatePickerRangeGridPanel;
|
|
54
|
+
exports.DatePickerRangeInput = DatePickerRangeInput.DatePickerRangeInput;
|
|
55
|
+
exports.defaultRangeValidator = DatePickerRangeInput.defaultRangeValidator;
|
|
56
|
+
exports.DatePickerRangePanel = DatePickerRangePanel.DatePickerRangePanel;
|
|
57
|
+
exports.DatePickerSingleGridPanel = DatePickerSingleGridPanel.DatePickerSingleGridPanel;
|
|
58
|
+
exports.DatePickerSingleInput = DatePickerSingleInput.DatePickerSingleInput;
|
|
59
|
+
exports.DatePickerSinglePanel = DatePickerSinglePanel.DatePickerSinglePanel;
|
|
60
|
+
exports.DatePickerTrigger = DatePickerTrigger.DatePickerTrigger;
|
|
61
|
+
exports.LocalizationProvider = LocalizationProvider.LocalizationProvider;
|
|
62
|
+
exports.LocalizationProviderContext = LocalizationProvider.LocalizationProviderContext;
|
|
63
|
+
exports.useLocalization = LocalizationProvider.useLocalization;
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const MIN_DATE = "1900-01-01T00:00:00.000";
|
|
7
|
+
const MAX_DATE = "2099-12-31T00:00:00.000";
|
|
8
|
+
const LocalizationProviderContext = (
|
|
9
|
+
// biome-ignore lint/suspicious/noExplicitAny: date frameworl
|
|
10
|
+
react.createContext(null)
|
|
11
|
+
);
|
|
12
|
+
if (process.env.NODE_ENV !== "production") {
|
|
13
|
+
LocalizationProviderContext.displayName = "LocalizationProviderContext";
|
|
14
|
+
}
|
|
15
|
+
const LocalizationProvider = function LocalizationProvider2(props) {
|
|
16
|
+
const { children, DateAdapter, instance, locale, minDate, maxDate } = props;
|
|
17
|
+
const dateAdapter = react.useMemo(() => {
|
|
18
|
+
return new DateAdapter({
|
|
19
|
+
locale,
|
|
20
|
+
instance
|
|
21
|
+
});
|
|
22
|
+
}, [DateAdapter, instance, locale]);
|
|
23
|
+
const defaultDates = react.useMemo(
|
|
24
|
+
() => ({
|
|
25
|
+
minDate: minDate || dateAdapter.date(MIN_DATE),
|
|
26
|
+
maxDate: maxDate || dateAdapter.date(MAX_DATE)
|
|
27
|
+
}),
|
|
28
|
+
[dateAdapter, minDate, maxDate]
|
|
29
|
+
);
|
|
30
|
+
const contextValue = react.useMemo(() => {
|
|
31
|
+
return {
|
|
32
|
+
dateAdapter,
|
|
33
|
+
defaultDates
|
|
34
|
+
};
|
|
35
|
+
}, [dateAdapter, defaultDates]);
|
|
36
|
+
return /* @__PURE__ */ jsxRuntime.jsx(LocalizationProviderContext.Provider, { value: contextValue, children });
|
|
37
|
+
};
|
|
38
|
+
const useLocalization = () => {
|
|
39
|
+
const localization = react.useContext(LocalizationProviderContext);
|
|
40
|
+
if (!localization) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
"useLocalization should be called inside LocalizationProviderContext.Provider"
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return localization;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
exports.LocalizationProvider = LocalizationProvider;
|
|
49
|
+
exports.LocalizationProviderContext = LocalizationProviderContext;
|
|
50
|
+
exports.useLocalization = useLocalization;
|
|
51
|
+
//# sourceMappingURL=LocalizationProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalizationProvider.js","sources":["../src/localization-provider/LocalizationProvider.tsx"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nconst MIN_DATE = \"1900-01-01T00:00:00.000\";\nconst MAX_DATE = \"2099-12-31T00:00:00.000\";\n\nexport interface LocalizationProviderValue<\n TDate extends DateFrameworkType = DateFrameworkType,\n> {\n defaultDates: {\n minDate: TDate;\n maxDate: TDate;\n };\n dateAdapter: SaltDateAdapter<TDate>;\n}\n\n/**\n * Props for the LocalizationProvider component.\n *\n * @template TDate - The type of the date object used in the provider.\n * @template TLocale - The type of the locale, defaulting to string.\n */\nexport interface LocalizationProviderProps<\n TDate extends DateFrameworkType = DateFrameworkType,\n TLocale = string,\n> {\n /**\n * The child components to be rendered within the provider.\n */\n children?: React.ReactNode;\n\n /**\n * The instance of the date library being used.\n */\n // biome-ignore lint/suspicious/noExplicitAny: date framework\n instance?: any;\n\n /**\n * The date adapter class, which provides methods for date manipulation and formatting.\n * This should be a constructor for a class implementing the SaltDateAdapter interface.\n */\n DateAdapter: new (\n // biome-ignore lint/suspicious/noExplicitAny: date framework\n ...args: any\n ) => SaltDateAdapter<TDate, TLocale>;\n\n /**\n * The locale to be used for date formatting and manipulation.\n */\n locale?: TLocale;\n\n /**\n * The minimum date allowed for all date selections.\n * Defaults to January 1, 1900.\n */\n minDate?: TDate;\n\n /**\n * The maximum date allowed for all date selections.\n * Defaults to December 31, 2099.\n */\n maxDate?: TDate;\n}\n\nexport type LocalizationProviderContext<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = {\n [K in keyof LocalizationProviderValue<TDate>]:\n | LocalizationProviderValue<TDate>[K]\n | null;\n};\n\nexport const LocalizationProviderContext =\n // biome-ignore lint/suspicious/noExplicitAny: date frameworl\n createContext<LocalizationProviderValue<any> | null>(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n LocalizationProviderContext.displayName = \"LocalizationProviderContext\";\n}\n\nexport const LocalizationProvider = function LocalizationProvider<\n TDate extends DateFrameworkType = DateFrameworkType,\n TLocale = undefined,\n>(props: LocalizationProviderProps<TDate, TLocale>) {\n const { children, DateAdapter, instance, locale, minDate, maxDate } = props;\n\n const dateAdapter = useMemo(() => {\n return new DateAdapter({\n locale,\n instance,\n });\n }, [DateAdapter, instance, locale]);\n\n const defaultDates: LocalizationProviderValue<TDate>[\"defaultDates\"] =\n useMemo(\n () => ({\n minDate: minDate || dateAdapter.date(MIN_DATE),\n maxDate: maxDate || dateAdapter.date(MAX_DATE),\n }),\n [dateAdapter, minDate, maxDate],\n );\n\n const contextValue: LocalizationProviderValue<TDate> = useMemo(() => {\n return {\n dateAdapter,\n defaultDates,\n };\n }, [dateAdapter, defaultDates]);\n\n return (\n <LocalizationProviderContext.Provider value={contextValue}>\n {children}\n </LocalizationProviderContext.Provider>\n );\n};\n\n/**\n * Custom hook to access the localization context.\n *\n * This hook provides access to the localization settings and utilities\n * within the `LocalizationProviderContext`. It should be used within a\n * component that is a descendant of `LocalizationProviderContext.Provider`.\n *\n * @template TDate - The type of the date object used in the localization context.\n *\n * @returns The localization provider value, which includes date manipulation and formatting utilities.\n *\n * @throws Will throw an error if the hook is used outside of a `LocalizationProviderContext.Provider`.\n */\nexport const useLocalization = <\n TDate extends DateFrameworkType = DateFrameworkType,\n>(): LocalizationProviderValue<TDate> => {\n const localization = useContext(LocalizationProviderContext);\n if (!localization) {\n throw new Error(\n \"useLocalization should be called inside LocalizationProviderContext.Provider\",\n );\n }\n return localization;\n};\n"],"names":["createContext","LocalizationProvider","useMemo","useContext"],"mappings":";;;;;AAMA,MAAM,QAAA,GAAW,yBAAA;AACjB,MAAM,QAAA,GAAW,yBAAA;AAoEV,MAAM,2BAAA;AAAA;AAAA,EAEXA,oBAAqD,IAAI;AAAA;AAE3D,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,EAAA,2BAAA,CAA4B,WAAA,GAAc,6BAAA;AAC5C;AAEO,MAAM,oBAAA,GAAuB,SAASC,qBAAAA,CAG3C,KAAA,EAAkD;AAClD,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,UAAU,MAAA,EAAQ,OAAA,EAAS,SAAQ,GAAI,KAAA;AAEtE,EAAA,MAAM,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAA,OAAO,IAAI,WAAA,CAAY;AAAA,MACrB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAA,EAAa,QAAA,EAAU,MAAM,CAAC,CAAA;AAElC,EAAA,MAAM,YAAA,GACJA,aAAA;AAAA,IACE,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,IAAW,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC7C,OAAA,EAAS,OAAA,IAAW,WAAA,CAAY,IAAA,CAAK,QAAQ;AAAA,KAC/C,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,OAAA,EAAS,OAAO;AAAA,GAChC;AAEF,EAAA,MAAM,YAAA,GAAiDA,cAAQ,MAAM;AACnE,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAE9B,EAAA,sCACG,2BAAA,CAA4B,QAAA,EAA5B,EAAqC,KAAA,EAAO,cAC1C,QAAA,EACH,CAAA;AAEJ;AAeO,MAAM,kBAAkB,MAEU;AACvC,EAAA,MAAM,YAAA,GAAeC,iBAAW,2BAA2B,CAAA;AAC3D,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,YAAA;AACT;;;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var css_248z = ".saltCalendar {\n --calendar-gap: var(--salt-spacing-fixed-100);\n --calendar-day-size: var(--salt-size-base);\n\n background: var(--salt-container-primary-background);\n padding: var(--salt-spacing-100);\n}\n";
|
|
2
|
+
|
|
3
|
+
export { css_248z as default };
|
|
4
|
+
//# sourceMappingURL=Calendar.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Calendar.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { makePrefixer } from '@salt-ds/core';
|
|
3
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
|
+
import { useWindow } from '@salt-ds/window';
|
|
5
|
+
import { clsx } from 'clsx';
|
|
6
|
+
import { forwardRef, useEffect, useRef } from 'react';
|
|
7
|
+
import { useLocalization } from '../localization-provider/LocalizationProvider.js';
|
|
8
|
+
import css_248z from './Calendar.css.js';
|
|
9
|
+
import { CalendarContext } from './internal/CalendarContext.js';
|
|
10
|
+
import { useCalendar } from './useCalendar.js';
|
|
11
|
+
|
|
12
|
+
const withBaseName = makePrefixer("saltCalendar");
|
|
13
|
+
function isMultiselect(props) {
|
|
14
|
+
return props.multiselect === true;
|
|
15
|
+
}
|
|
16
|
+
function getStartOrEndDate(dateRange, isMultiselect2) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
if (isMultiselect2) {
|
|
19
|
+
const rangeArray = dateRange;
|
|
20
|
+
return ((_a = rangeArray == null ? void 0 : rangeArray[0]) == null ? void 0 : _a.startDate) ?? ((_b = rangeArray == null ? void 0 : rangeArray[0]) == null ? void 0 : _b.endDate);
|
|
21
|
+
}
|
|
22
|
+
const range = dateRange;
|
|
23
|
+
return (range == null ? void 0 : range.startDate) ?? (range == null ? void 0 : range.endDate);
|
|
24
|
+
}
|
|
25
|
+
let warnedOnce = false;
|
|
26
|
+
const Calendar = forwardRef(
|
|
27
|
+
(props, ref) => {
|
|
28
|
+
const targetWindow = useWindow();
|
|
29
|
+
const { dateAdapter } = useLocalization();
|
|
30
|
+
useComponentCssInjection({
|
|
31
|
+
testId: "salt-calendar",
|
|
32
|
+
css: css_248z,
|
|
33
|
+
window: targetWindow
|
|
34
|
+
});
|
|
35
|
+
const {
|
|
36
|
+
createAnnouncement,
|
|
37
|
+
children,
|
|
38
|
+
className,
|
|
39
|
+
selectedDate,
|
|
40
|
+
defaultSelectedDate,
|
|
41
|
+
visibleMonth: visibleMonthProp,
|
|
42
|
+
defaultVisibleMonth,
|
|
43
|
+
onFocusedDateChange,
|
|
44
|
+
onSelectionChange,
|
|
45
|
+
onVisibleMonthChange,
|
|
46
|
+
hideOutOfRangeDates,
|
|
47
|
+
focusedDate,
|
|
48
|
+
focusedDateRef,
|
|
49
|
+
isDayUnselectable,
|
|
50
|
+
isDayHighlighted,
|
|
51
|
+
minDate,
|
|
52
|
+
maxDate,
|
|
53
|
+
multiselect,
|
|
54
|
+
numberOfVisibleMonths = 1,
|
|
55
|
+
select,
|
|
56
|
+
selectionVariant,
|
|
57
|
+
onHoveredDateChange,
|
|
58
|
+
hoveredDate,
|
|
59
|
+
timezone: timezoneProp,
|
|
60
|
+
...propsRest
|
|
61
|
+
} = props;
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (process.env.NODE_ENV !== "production") {
|
|
64
|
+
if (!warnedOnce && multiselect && selectionVariant !== "single") {
|
|
65
|
+
console.warn(
|
|
66
|
+
`'multiselect' with selection variant '${selectionVariant}' is experimental and not for production use.`
|
|
67
|
+
);
|
|
68
|
+
warnedOnce = true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}, [multiselect, selectionVariant]);
|
|
72
|
+
let timezone = "default";
|
|
73
|
+
if (timezoneProp) {
|
|
74
|
+
timezone = timezoneProp;
|
|
75
|
+
} else {
|
|
76
|
+
let defaultTimezoneDate;
|
|
77
|
+
if (selectionVariant === "range" || selectionVariant === "offset") {
|
|
78
|
+
const shouldExtractFromList = isMultiselect(props);
|
|
79
|
+
defaultTimezoneDate = getStartOrEndDate(selectedDate, shouldExtractFromList) ?? getStartOrEndDate(defaultSelectedDate, shouldExtractFromList);
|
|
80
|
+
} else if (selectionVariant === "single") {
|
|
81
|
+
if (isMultiselect(props)) {
|
|
82
|
+
defaultTimezoneDate = (defaultSelectedDate == null ? void 0 : defaultSelectedDate[0]) ?? void 0;
|
|
83
|
+
} else {
|
|
84
|
+
defaultTimezoneDate = selectedDate ?? defaultSelectedDate;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (defaultTimezoneDate) {
|
|
88
|
+
timezone = dateAdapter.getTimezone(defaultTimezoneDate);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
let startDateOffset;
|
|
92
|
+
let endDateOffset;
|
|
93
|
+
let rest;
|
|
94
|
+
if (selectionVariant === "offset") {
|
|
95
|
+
({ startDateOffset, endDateOffset, ...rest } = propsRest);
|
|
96
|
+
} else {
|
|
97
|
+
rest = propsRest;
|
|
98
|
+
}
|
|
99
|
+
const defaultFocusedDateRef = useRef(null);
|
|
100
|
+
const useCalendarProps = {
|
|
101
|
+
createAnnouncement,
|
|
102
|
+
selectedDate,
|
|
103
|
+
defaultSelectedDate,
|
|
104
|
+
visibleMonth: visibleMonthProp,
|
|
105
|
+
defaultVisibleMonth,
|
|
106
|
+
onSelectionChange,
|
|
107
|
+
onVisibleMonthChange,
|
|
108
|
+
focusedDate,
|
|
109
|
+
focusedDateRef: focusedDateRef !== void 0 ? focusedDateRef : defaultFocusedDateRef,
|
|
110
|
+
isDayUnselectable,
|
|
111
|
+
isDayHighlighted,
|
|
112
|
+
multiselect,
|
|
113
|
+
minDate,
|
|
114
|
+
maxDate,
|
|
115
|
+
numberOfVisibleMonths,
|
|
116
|
+
select,
|
|
117
|
+
selectionVariant,
|
|
118
|
+
onFocusedDateChange,
|
|
119
|
+
onHoveredDateChange,
|
|
120
|
+
hideOutOfRangeDates,
|
|
121
|
+
hoveredDate,
|
|
122
|
+
startDateOffset,
|
|
123
|
+
endDateOffset,
|
|
124
|
+
timezone
|
|
125
|
+
};
|
|
126
|
+
const { state, helpers } = useCalendar(useCalendarProps);
|
|
127
|
+
const calendarLabel = dateAdapter.format(state.visibleMonth, "MMMM YYYY");
|
|
128
|
+
return /* @__PURE__ */ jsx(
|
|
129
|
+
CalendarContext.Provider,
|
|
130
|
+
{
|
|
131
|
+
value: {
|
|
132
|
+
state,
|
|
133
|
+
helpers
|
|
134
|
+
},
|
|
135
|
+
children: /* @__PURE__ */ jsx(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
className: clsx(withBaseName(), className),
|
|
139
|
+
role: "application",
|
|
140
|
+
"aria-label": calendarLabel,
|
|
141
|
+
ref,
|
|
142
|
+
...rest,
|
|
143
|
+
children
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
export { Calendar };
|
|
152
|
+
//# sourceMappingURL=Calendar.js.map
|