@clickhouse/click-ui 0.2.0-rc.6 → 0.2.0-rc.8
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/README.md +67 -0
- package/dist/cjs/click-ui.css +3861 -0
- package/dist/cjs/components/Button/Button.css +261 -0
- package/dist/cjs/components/Button/Button.module.css.cjs +38 -0
- package/dist/cjs/components/Button/Button.module.css.cjs.map +1 -0
- package/dist/cjs/components/Button/index.cjs +42 -126
- package/dist/cjs/components/Button/index.cjs.map +1 -1
- package/dist/cjs/components/ButtonGroup/index.cjs +1 -1
- package/dist/cjs/components/ButtonGroup/index.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/Common.cjs +100 -73
- package/dist/cjs/components/DatePicker/Common.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DateRangePicker.cjs +24 -24
- package/dist/cjs/components/DatePicker/DateRangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs +96 -50
- package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/index.cjs +29 -18
- package/dist/cjs/components/DatePicker/index.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/utils.cjs +42 -14
- package/dist/cjs/components/DatePicker/utils.cjs.map +1 -1
- package/dist/cjs/components/GenericMenu/index.cjs +1 -1
- package/dist/cjs/components/GenericMenu/index.cjs.map +1 -1
- package/dist/cjs/lib/cva.cjs +15 -0
- package/dist/cjs/lib/cva.cjs.map +1 -0
- package/dist/cjs/providers/ThemeProvider.cjs +4 -0
- package/dist/cjs/providers/ThemeProvider.cjs.map +1 -1
- package/dist/cjs/theme/styles/tokens-dark.css +1806 -0
- package/dist/cjs/theme/styles/tokens-light.css +1795 -0
- package/dist/cjs/theme/theme.config.json.cjs +12 -0
- package/dist/cjs/theme/theme.config.json.cjs.map +1 -0
- package/dist/cjs/theme/tokens/variables.dark.cjs +2 -4
- package/dist/cjs/theme/tokens/variables.dark.cjs.map +1 -1
- package/dist/cjs/theme/tokens/variables.light.cjs +1 -6
- package/dist/cjs/theme/tokens/variables.light.cjs.map +1 -1
- package/dist/cjs/utils/localStorage.cjs +3 -1
- package/dist/cjs/utils/localStorage.cjs.map +1 -1
- package/dist/esm/click-ui.css +3861 -0
- package/dist/esm/components/Button/Button.css +261 -0
- package/dist/esm/components/Button/Button.module.css.js +25 -0
- package/dist/esm/components/Button/Button.module.css.js.map +1 -0
- package/dist/esm/components/Button/index.js +42 -126
- package/dist/esm/components/Button/index.js.map +1 -1
- package/dist/esm/components/ButtonGroup/index.js +1 -1
- package/dist/esm/components/ButtonGroup/index.js.map +1 -1
- package/dist/esm/components/DatePicker/Common.js +101 -74
- package/dist/esm/components/DatePicker/Common.js.map +1 -1
- package/dist/esm/components/DatePicker/DateRangePicker.js +25 -25
- package/dist/esm/components/DatePicker/DateRangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/DateTimeRangePicker.js +97 -51
- package/dist/esm/components/DatePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/index.js +30 -19
- package/dist/esm/components/DatePicker/index.js.map +1 -1
- package/dist/esm/components/DatePicker/utils.js +36 -10
- package/dist/esm/components/DatePicker/utils.js.map +1 -1
- package/dist/esm/components/GenericMenu/index.js +1 -1
- package/dist/esm/components/GenericMenu/index.js.map +1 -1
- package/dist/esm/lib/cva.js +7 -0
- package/dist/esm/lib/cva.js.map +1 -0
- package/dist/esm/providers/ThemeProvider.js +4 -0
- package/dist/esm/providers/ThemeProvider.js.map +1 -1
- package/dist/esm/theme/styles/tokens-dark.css +1806 -0
- package/dist/esm/theme/styles/tokens-light.css +1795 -0
- package/dist/esm/theme/theme.config.json.js +7 -0
- package/dist/esm/theme/theme.config.json.js.map +1 -0
- package/dist/esm/theme/tokens/variables.dark.js +2 -4
- package/dist/esm/theme/tokens/variables.dark.js.map +1 -1
- package/dist/esm/theme/tokens/variables.light.js +1 -6
- package/dist/esm/theme/tokens/variables.light.js.map +1 -1
- package/dist/esm/utils/localStorage.js +3 -1
- package/dist/esm/utils/localStorage.js.map +1 -1
- package/dist/types/components/Button/Button.d.ts +25 -2
- package/dist/types/components/DatePicker/Common.d.ts +9 -4
- package/dist/types/components/DatePicker/DatePicker.d.ts +11 -2
- package/dist/types/components/DatePicker/DateRangePicker.d.ts +3 -2
- package/dist/types/components/DatePicker/DateTimeRangePicker.d.ts +7 -3
- package/dist/types/components/DatePicker/index.d.ts +3 -2
- package/dist/types/components/DatePicker/utils.d.ts +9 -8
- package/dist/types/index.d.ts +1 -1
- package/dist/types/lib/cva.d.ts +3 -0
- package/dist/types/theme/theme.config.json.d.ts +6 -0
- package/dist/types/theme/theme.core.d.ts +0 -7
- package/dist/types/theme/tokens/variables.dark.d.ts +0 -2
- package/dist/types/theme/tokens/variables.light.d.ts +0 -5
- package/dist/types/utils/dom.d.ts +1 -1
- package/dist/types/utils/localStorage.d.ts +1 -1
- package/package.json +26 -10
- package/dist/types/components/DatePicker/DatePicker.types.d.ts +0 -9
|
@@ -16,18 +16,16 @@ const Dropdown = require('../Dropdown/index.cjs');
|
|
|
16
16
|
const IconButton = require('../IconButton/index.cjs');
|
|
17
17
|
|
|
18
18
|
const explicitWidth = "250px";
|
|
19
|
-
const
|
|
20
|
-
const TXT_ON_YEAR_SELECT = "Year";
|
|
21
|
-
const VIEW_GRID_MONTHS = {
|
|
19
|
+
const viewGridMonths = {
|
|
22
20
|
columns: 4,
|
|
23
21
|
rows: 3
|
|
24
22
|
};
|
|
25
|
-
const
|
|
23
|
+
const viewGridYears = {
|
|
26
24
|
columns: 3,
|
|
27
25
|
rows: 3
|
|
28
26
|
};
|
|
29
|
-
const
|
|
30
|
-
const
|
|
27
|
+
const totalYears = viewGridYears.columns * viewGridYears.rows;
|
|
28
|
+
const yearsOffset = Math.floor(totalYears / 2);
|
|
31
29
|
const HighlightedInputWrapper = styledComponents.styled(InputWrapper.InputWrapper).withConfig({
|
|
32
30
|
componentId: "sc-1m6g9rm-0"
|
|
33
31
|
})(["", "}"], ({
|
|
@@ -40,16 +38,16 @@ const HighlightedInputWrapper = styledComponents.styled(InputWrapper.InputWrappe
|
|
|
40
38
|
${$width && `min-width: ${explicitWidth};`}
|
|
41
39
|
`;
|
|
42
40
|
});
|
|
43
|
-
const formatPartialDate = (selectedDate, partialYear, partialMonth) => {
|
|
41
|
+
const formatPartialDate = (timezone, selectedDate, partialYear, partialMonth) => {
|
|
44
42
|
if (typeof partialYear === "number" && typeof partialMonth === "number") {
|
|
45
|
-
const date = new Date(partialYear, partialMonth, 1);
|
|
46
|
-
return utils.
|
|
43
|
+
const date = timezone === "UTC" ? new Date(Date.UTC(partialYear, partialMonth, 1)) : new Date(partialYear, partialMonth, 1);
|
|
44
|
+
return utils.formatDateHeader(timezone, date);
|
|
47
45
|
}
|
|
48
46
|
if (typeof partialYear === "number") {
|
|
49
47
|
return String(partialYear);
|
|
50
48
|
}
|
|
51
49
|
if (selectedDate instanceof Date) {
|
|
52
|
-
return utils.
|
|
50
|
+
return utils.formatSelectedDate(timezone, selectedDate);
|
|
53
51
|
}
|
|
54
52
|
return "";
|
|
55
53
|
};
|
|
@@ -60,10 +58,11 @@ const DatePickerInput = ({
|
|
|
60
58
|
partialMonth,
|
|
61
59
|
partialYear,
|
|
62
60
|
placeholder,
|
|
63
|
-
selectedDate
|
|
61
|
+
selectedDate,
|
|
62
|
+
timezone = "system"
|
|
64
63
|
}) => {
|
|
65
64
|
const defaultId = react.useId();
|
|
66
|
-
const formattedSelectedDate = formatPartialDate(selectedDate, partialYear, partialMonth);
|
|
65
|
+
const formattedSelectedDate = formatPartialDate(timezone, selectedDate, partialYear, partialMonth);
|
|
67
66
|
return /* @__PURE__ */ jsxRuntime.jsxs(HighlightedInputWrapper, { $isActive: isActive, disabled, id: id ?? defaultId, children: [
|
|
68
67
|
/* @__PURE__ */ jsxRuntime.jsx(InputWrapper.InputStartContent, { children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { name: "calendar" }) }),
|
|
69
68
|
/* @__PURE__ */ jsxRuntime.jsx(InputWrapper.InputElement, { $hasStartContent: true, "data-testid": "datepicker-input", placeholder, readOnly: true, value: formattedSelectedDate })
|
|
@@ -75,21 +74,22 @@ const DateRangePickerInput = ({
|
|
|
75
74
|
id,
|
|
76
75
|
placeholder,
|
|
77
76
|
selectedEndDate,
|
|
78
|
-
selectedStartDate
|
|
77
|
+
selectedStartDate,
|
|
78
|
+
timezone = "system"
|
|
79
79
|
}) => {
|
|
80
80
|
const defaultId = react.useId();
|
|
81
81
|
let formattedValue = /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: placeholder ?? "" });
|
|
82
82
|
if (selectedStartDate) {
|
|
83
83
|
if (selectedEndDate) {
|
|
84
84
|
formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
85
|
-
utils.
|
|
85
|
+
utils.formatSelectedDate(timezone, selectedStartDate),
|
|
86
86
|
" –",
|
|
87
87
|
" ",
|
|
88
|
-
utils.
|
|
88
|
+
utils.formatSelectedDate(timezone, selectedEndDate)
|
|
89
89
|
] });
|
|
90
90
|
} else {
|
|
91
91
|
formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
92
|
-
utils.
|
|
92
|
+
utils.formatSelectedDate(timezone, selectedStartDate),
|
|
93
93
|
" ",
|
|
94
94
|
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: "– end date" })
|
|
95
95
|
] });
|
|
@@ -107,23 +107,28 @@ const DateTimeRangePickerInput = ({
|
|
|
107
107
|
placeholder,
|
|
108
108
|
selectedEndDate,
|
|
109
109
|
selectedStartDate,
|
|
110
|
-
shouldShowSeconds
|
|
110
|
+
shouldShowSeconds,
|
|
111
|
+
timezone = "system"
|
|
111
112
|
}) => {
|
|
112
113
|
const defaultId = react.useId();
|
|
113
|
-
const
|
|
114
|
+
const formatDateTime = react.useCallback((date) => {
|
|
115
|
+
if (shouldShowSeconds) {
|
|
116
|
+
return utils.formatSelectedDateTimeWithSeconds(timezone, date);
|
|
117
|
+
}
|
|
118
|
+
return utils.formatSelectedDateTime(timezone, date);
|
|
119
|
+
}, [shouldShowSeconds, timezone]);
|
|
114
120
|
let formattedValue = /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: placeholder ?? "" });
|
|
115
121
|
if (selectedStartDate) {
|
|
116
122
|
if (selectedEndDate) {
|
|
117
123
|
formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
118
|
-
|
|
119
|
-
" ",
|
|
120
|
-
"–",
|
|
124
|
+
formatDateTime(selectedStartDate).replace("AM", "am").replace("PM", "pm"),
|
|
125
|
+
" –",
|
|
121
126
|
" ",
|
|
122
|
-
|
|
127
|
+
formatDateTime(selectedEndDate).replace("AM", "am").replace("PM", "pm")
|
|
123
128
|
] });
|
|
124
129
|
} else {
|
|
125
130
|
formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
126
|
-
|
|
131
|
+
formatDateTime(selectedStartDate).replace("AM", "am").replace("PM", "pm"),
|
|
127
132
|
" ",
|
|
128
133
|
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: "– end date" })
|
|
129
134
|
] });
|
|
@@ -134,7 +139,7 @@ const DateTimeRangePickerInput = ({
|
|
|
134
139
|
"start date –",
|
|
135
140
|
" "
|
|
136
141
|
] }),
|
|
137
|
-
|
|
142
|
+
formatDateTime(selectedEndDate).replace("AM", "am").replace("PM", "pm")
|
|
138
143
|
] });
|
|
139
144
|
}
|
|
140
145
|
return /* @__PURE__ */ jsxRuntime.jsxs(HighlightedInputWrapper, { $isActive: isActive, disabled, id: id ?? defaultId, $width: "max-content", children: [
|
|
@@ -149,22 +154,20 @@ const DatePickerContainer = styledComponents.styled(Container.Container).withCon
|
|
|
149
154
|
}) => theme.click.datePicker.dateOption.color.background.default);
|
|
150
155
|
const ClickableTitle = styledComponents.styled.button.withConfig({
|
|
151
156
|
componentId: "sc-1m6g9rm-2"
|
|
152
|
-
})(["
|
|
157
|
+
})(["background:transparent;border:1px solid transparent;cursor:pointer;outline:none;padding:0.25rem 0.5rem;user-select:none;", ";&:hover{background:", ";}&:focus,&:focus-visible{border-color:", ";}"], ({
|
|
153
158
|
theme
|
|
154
159
|
}) => `
|
|
160
|
+
border-radius: ${theme.click.datePicker.dateOption.radii.default};
|
|
155
161
|
color: ${theme.click.datePicker.color.title.default};
|
|
156
162
|
font: ${theme.click.datePicker.typography.title.default};
|
|
157
|
-
border: 1px solid transparent;
|
|
158
163
|
`, ({
|
|
159
164
|
theme
|
|
160
|
-
}) => theme.click.datePicker.dateOption.radii.default, ({
|
|
161
|
-
theme
|
|
162
165
|
}) => theme.click.datePicker.dateOption.color.background.hover, ({
|
|
163
166
|
theme
|
|
164
167
|
}) => theme.click.datePicker.dateOption.color.stroke.hover);
|
|
165
168
|
const UnselectableTitle = styledComponents.styled.h2.withConfig({
|
|
166
169
|
componentId: "sc-1m6g9rm-3"
|
|
167
|
-
})(["
|
|
170
|
+
})(["margin:0;padding:0;user-select:none;", ""], ({
|
|
168
171
|
theme
|
|
169
172
|
}) => `
|
|
170
173
|
color: ${theme.click.datePicker.color.title.default};
|
|
@@ -179,20 +182,20 @@ const GridContainer = styledComponents.styled.div.withConfig({
|
|
|
179
182
|
`);
|
|
180
183
|
const MonthsGrid = styledComponents.styled(GridContainer).withConfig({
|
|
181
184
|
componentId: "sc-1m6g9rm-5"
|
|
182
|
-
})(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"],
|
|
185
|
+
})(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"], viewGridMonths.columns, viewGridMonths.rows);
|
|
183
186
|
const YearsGrid = styledComponents.styled(GridContainer).withConfig({
|
|
184
187
|
componentId: "sc-1m6g9rm-6"
|
|
185
|
-
})(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"],
|
|
188
|
+
})(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"], viewGridYears.columns, viewGridYears.rows);
|
|
186
189
|
const GridCell = styledComponents.styled.button.withConfig({
|
|
187
190
|
componentId: "sc-1m6g9rm-7"
|
|
188
|
-
})(["
|
|
191
|
+
})(["align-items:center;cursor:pointer;display:flex;justify-content:center;min-height:26px;padding:8px 4px;text-align:center;", " ", " ", " ", ""], ({
|
|
189
192
|
theme
|
|
190
193
|
}) => `
|
|
194
|
+
background: ${theme.click.datePicker.dateOption.color.background.default};
|
|
191
195
|
border: ${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.stroke.default};
|
|
192
196
|
border-radius: ${theme.click.datePicker.dateOption.radii.default};
|
|
193
|
-
font: ${theme.click.datePicker.dateOption.typography.label.default};
|
|
194
197
|
color: ${theme.click.datePicker.dateOption.color.label.default};
|
|
195
|
-
|
|
198
|
+
font: ${theme.click.datePicker.dateOption.typography.label.default};
|
|
196
199
|
`, ({
|
|
197
200
|
$isActive,
|
|
198
201
|
theme
|
|
@@ -311,8 +314,13 @@ const CalendarRenderer = ({
|
|
|
311
314
|
onYearSelect,
|
|
312
315
|
onMonthSelect,
|
|
313
316
|
selectedDate,
|
|
317
|
+
timezone = "system",
|
|
314
318
|
...props
|
|
315
319
|
}) => {
|
|
320
|
+
const shiftedCalendarOptions = calendarOptions.defaultDate instanceof Date ? {
|
|
321
|
+
...calendarOptions,
|
|
322
|
+
defaultDate: utils.shiftToTimezone(calendarOptions.defaultDate, timezone)
|
|
323
|
+
} : calendarOptions;
|
|
316
324
|
const {
|
|
317
325
|
body,
|
|
318
326
|
headers,
|
|
@@ -321,13 +329,13 @@ const CalendarRenderer = ({
|
|
|
321
329
|
year
|
|
322
330
|
} = calendar.useCalendar({
|
|
323
331
|
defaultWeekStart: 1,
|
|
324
|
-
...
|
|
332
|
+
...shiftedCalendarOptions
|
|
325
333
|
});
|
|
326
334
|
const [view, setView] = react.useState(date.DAYS);
|
|
327
335
|
const [selectedYear, setSelectedYear] = react.useState(null);
|
|
328
336
|
const [yearOffset, setYearOffset] = react.useState(0);
|
|
329
337
|
const [focusedMonthIndex, setFocusedMonthIndex] = react.useState(month);
|
|
330
|
-
const [focusedYearIndex, setFocusedYearIndex] = react.useState(
|
|
338
|
+
const [focusedYearIndex, setFocusedYearIndex] = react.useState(yearsOffset);
|
|
331
339
|
const monthGridRef = react.useRef([]);
|
|
332
340
|
const yearGridRef = react.useRef([]);
|
|
333
341
|
const headerNavRefs = react.useRef([null, null, null]);
|
|
@@ -340,14 +348,14 @@ const CalendarRenderer = ({
|
|
|
340
348
|
}, [view, focusedYearIndex, focusedMonthIndex]);
|
|
341
349
|
const onNextClick = react.useCallback(() => {
|
|
342
350
|
if (view === date.YEARS) {
|
|
343
|
-
setYearOffset((prev) => prev +
|
|
351
|
+
setYearOffset((prev) => prev + totalYears);
|
|
344
352
|
} else {
|
|
345
353
|
navigation.toNext();
|
|
346
354
|
}
|
|
347
355
|
}, [navigation, view]);
|
|
348
356
|
const onPreviousClick = react.useCallback(() => {
|
|
349
357
|
if (view === date.YEARS) {
|
|
350
|
-
setYearOffset((prev) => prev -
|
|
358
|
+
setYearOffset((prev) => prev - totalYears);
|
|
351
359
|
return;
|
|
352
360
|
}
|
|
353
361
|
navigation.toPrev();
|
|
@@ -393,30 +401,30 @@ const CalendarRenderer = ({
|
|
|
393
401
|
setSelectedYear(null);
|
|
394
402
|
setYearOffset(0);
|
|
395
403
|
}, [selectedYear, year, navigation, onMonthSelect]);
|
|
396
|
-
const onMonthGridKeyDown = react.useCallback((
|
|
397
|
-
const columns =
|
|
404
|
+
const onMonthGridKeyDown = react.useCallback((event, index) => {
|
|
405
|
+
const columns = viewGridMonths.columns;
|
|
398
406
|
const totalItems = 12;
|
|
399
407
|
let newIndex = index;
|
|
400
|
-
switch (
|
|
408
|
+
switch (event.key) {
|
|
401
409
|
case "ArrowRight":
|
|
402
|
-
|
|
410
|
+
event.preventDefault();
|
|
403
411
|
newIndex = (index + 1) % totalItems;
|
|
404
412
|
break;
|
|
405
413
|
case "ArrowLeft":
|
|
406
|
-
|
|
414
|
+
event.preventDefault();
|
|
407
415
|
newIndex = (index - 1 + totalItems) % totalItems;
|
|
408
416
|
break;
|
|
409
417
|
case "ArrowDown":
|
|
410
|
-
|
|
418
|
+
event.preventDefault();
|
|
411
419
|
newIndex = (index + columns) % totalItems;
|
|
412
420
|
break;
|
|
413
421
|
case "ArrowUp":
|
|
414
|
-
|
|
422
|
+
event.preventDefault();
|
|
415
423
|
newIndex = (index - columns + totalItems) % totalItems;
|
|
416
424
|
break;
|
|
417
425
|
case "Enter":
|
|
418
426
|
case " ":
|
|
419
|
-
|
|
427
|
+
event.preventDefault();
|
|
420
428
|
onMonthSelection(index);
|
|
421
429
|
return;
|
|
422
430
|
default:
|
|
@@ -425,30 +433,30 @@ const CalendarRenderer = ({
|
|
|
425
433
|
setFocusedMonthIndex(newIndex);
|
|
426
434
|
monthGridRef.current[newIndex]?.focus();
|
|
427
435
|
}, [onMonthSelection]);
|
|
428
|
-
const onYearGridKeyDown = react.useCallback((
|
|
429
|
-
const columns =
|
|
430
|
-
const totalItems =
|
|
436
|
+
const onYearGridKeyDown = react.useCallback((event, index, yearValue) => {
|
|
437
|
+
const columns = viewGridYears.columns;
|
|
438
|
+
const totalItems = totalYears;
|
|
431
439
|
let newIndex = index;
|
|
432
|
-
switch (
|
|
440
|
+
switch (event.key) {
|
|
433
441
|
case "ArrowRight":
|
|
434
|
-
|
|
442
|
+
event.preventDefault();
|
|
435
443
|
newIndex = (index + 1) % totalItems;
|
|
436
444
|
break;
|
|
437
445
|
case "ArrowLeft":
|
|
438
|
-
|
|
446
|
+
event.preventDefault();
|
|
439
447
|
newIndex = (index - 1 + totalItems) % totalItems;
|
|
440
448
|
break;
|
|
441
449
|
case "ArrowDown":
|
|
442
|
-
|
|
450
|
+
event.preventDefault();
|
|
443
451
|
newIndex = (index + columns) % totalItems;
|
|
444
452
|
break;
|
|
445
453
|
case "ArrowUp":
|
|
446
|
-
|
|
454
|
+
event.preventDefault();
|
|
447
455
|
newIndex = (index - columns + totalItems) % totalItems;
|
|
448
456
|
break;
|
|
449
457
|
case "Enter":
|
|
450
458
|
case " ":
|
|
451
|
-
|
|
459
|
+
event.preventDefault();
|
|
452
460
|
onYearSelection(yearValue);
|
|
453
461
|
return;
|
|
454
462
|
default:
|
|
@@ -462,34 +470,53 @@ const CalendarRenderer = ({
|
|
|
462
470
|
headerDate.setFullYear(year);
|
|
463
471
|
const getHeaderTitle = (view2) => {
|
|
464
472
|
if (view2 === date.MONTHS) {
|
|
465
|
-
return
|
|
473
|
+
return "Month";
|
|
466
474
|
}
|
|
467
475
|
if (view2 === date.YEARS) {
|
|
468
|
-
return
|
|
476
|
+
return "Year";
|
|
469
477
|
}
|
|
470
|
-
return utils.
|
|
478
|
+
return utils.formatDateHeader("system", headerDate);
|
|
471
479
|
};
|
|
472
480
|
const renderMonthsGrid = () => {
|
|
473
|
-
const today = /* @__PURE__ */ new Date();
|
|
474
|
-
const
|
|
475
|
-
const
|
|
476
|
-
const
|
|
477
|
-
const
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
+
const today = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone);
|
|
482
|
+
const thisMonth = today.getMonth();
|
|
483
|
+
const thisYear = today.getFullYear();
|
|
484
|
+
const shiftedSelected = selectedDate ? utils.shiftToTimezone(selectedDate, timezone) : void 0;
|
|
485
|
+
const selectedMonth = shiftedSelected?.getMonth();
|
|
486
|
+
const selectedYear2 = shiftedSelected?.getFullYear();
|
|
487
|
+
return /* @__PURE__ */ jsxRuntime.jsx(MonthsGrid, { "data-testid": "months-grid", role: "grid", "aria-label": "Select month", children: monthAbbreviations.map((month2, index) => {
|
|
488
|
+
const handleKeyDown = (event) => {
|
|
489
|
+
onMonthGridKeyDown(event, index);
|
|
490
|
+
};
|
|
491
|
+
const handleClick = () => {
|
|
492
|
+
onMonthSelection(index);
|
|
493
|
+
};
|
|
494
|
+
const ref = (element) => {
|
|
495
|
+
monthGridRef.current[index] = element;
|
|
496
|
+
};
|
|
497
|
+
return /* @__PURE__ */ jsxRuntime.jsx(GridCell, { type: "button", ref, $isActive: selectedDate && index === selectedMonth && year === selectedYear2, $isPresent: index === thisMonth && year === thisYear, onClick: handleClick, onKeyDown: handleKeyDown, "data-testid": `month-cell-${index}`, tabIndex: index === focusedMonthIndex ? 0 : -1, "aria-label": month2, children: month2 }, month2);
|
|
498
|
+
}) });
|
|
481
499
|
};
|
|
482
500
|
const renderYearsGrid = () => {
|
|
483
501
|
const years = [];
|
|
484
502
|
const baseYear = year + yearOffset;
|
|
485
|
-
const
|
|
486
|
-
const selectedYear2 = selectedDate
|
|
487
|
-
for (let i = -
|
|
503
|
+
const thisYear = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone).getFullYear();
|
|
504
|
+
const selectedYear2 = selectedDate ? utils.shiftToTimezone(selectedDate, timezone).getFullYear() : void 0;
|
|
505
|
+
for (let i = -yearsOffset; i <= yearsOffset; i++) {
|
|
488
506
|
years.push(baseYear + i);
|
|
489
507
|
}
|
|
490
|
-
return /* @__PURE__ */ jsxRuntime.jsx(YearsGrid, { "data-testid": "years-grid", role: "grid", "aria-label": "Select year", children: years.map((
|
|
491
|
-
|
|
492
|
-
|
|
508
|
+
return /* @__PURE__ */ jsxRuntime.jsx(YearsGrid, { "data-testid": "years-grid", role: "grid", "aria-label": "Select year", children: years.map((currentYear, index) => {
|
|
509
|
+
const ref = (element) => {
|
|
510
|
+
yearGridRef.current[index] = element;
|
|
511
|
+
};
|
|
512
|
+
const handleClick = () => {
|
|
513
|
+
onYearSelection(currentYear);
|
|
514
|
+
};
|
|
515
|
+
const handleKeyDown = (event) => {
|
|
516
|
+
onYearGridKeyDown(event, index, currentYear);
|
|
517
|
+
};
|
|
518
|
+
return /* @__PURE__ */ jsxRuntime.jsx(GridCell, { type: "button", ref, $isActive: selectedDate && currentYear === selectedYear2, $isPresent: currentYear === thisYear, onClick: handleClick, onKeyDown: handleKeyDown, "data-testid": `year-cell-${currentYear}`, tabIndex: index === focusedYearIndex ? 0 : -1, "aria-label": String(currentYear), children: currentYear }, currentYear);
|
|
519
|
+
}) });
|
|
493
520
|
};
|
|
494
521
|
const renderTableContent = () => {
|
|
495
522
|
if (view === date.MONTHS) {
|
|
@@ -503,7 +530,7 @@ const CalendarRenderer = ({
|
|
|
503
530
|
key,
|
|
504
531
|
value: date
|
|
505
532
|
}) => {
|
|
506
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DateTableHeader, { children: utils.
|
|
533
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DateTableHeader, { children: utils.formatWeekday("system", date) }, key);
|
|
507
534
|
}) }) }),
|
|
508
535
|
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: children(body) })
|
|
509
536
|
] });
|