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