@equinor/eds-core-react 0.41.0 → 0.41.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eds-core-react.cjs +83 -20
- package/dist/esm/components/Button/ToggleButton/ToggleButton.js +1 -2
- package/dist/esm/components/Datepicker/calendars/Calendar.js +6 -2
- package/dist/esm/components/Datepicker/calendars/CalendarGrid.js +8 -1
- package/dist/esm/components/Datepicker/calendars/CalendarHeader.js +6 -5
- package/dist/esm/components/Datepicker/calendars/RangeCalendar.js +6 -2
- package/dist/esm/components/Datepicker/calendars/YearGrid.js +55 -8
- package/dist/esm/components/Snackbar/Snackbar.js +2 -1
- package/dist/types/components/Datepicker/calendars/CalendarGrid.d.ts +4 -1
- package/dist/types/components/Datepicker/calendars/CalendarHeader.d.ts +3 -1
- package/dist/types/components/Datepicker/calendars/YearGrid.d.ts +4 -1
- package/package.json +1 -1
package/dist/eds-core-react.cjs
CHANGED
|
@@ -1274,7 +1274,7 @@ const ToggleButton = /*#__PURE__*/react.forwardRef(function ToggleButton({
|
|
|
1274
1274
|
}, [selectedIndexes]);
|
|
1275
1275
|
function updateProps(child, isSelected, index) {
|
|
1276
1276
|
const childElement = child;
|
|
1277
|
-
if ( /*#__PURE__*/react.isValidElement(child)
|
|
1277
|
+
if ( /*#__PURE__*/react.isValidElement(child)) {
|
|
1278
1278
|
const buttonProps = {
|
|
1279
1279
|
'aria-pressed': isSelected ? true : undefined,
|
|
1280
1280
|
variant: isSelected ? 'contained' : 'outlined',
|
|
@@ -6193,7 +6193,8 @@ const Snackbar$1 = /*#__PURE__*/react.forwardRef(function Snackbar({
|
|
|
6193
6193
|
}, autoHideDuration);
|
|
6194
6194
|
}
|
|
6195
6195
|
return () => clearTimeout(timer.current);
|
|
6196
|
-
|
|
6196
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
6197
|
+
}, [open, autoHideDuration]);
|
|
6197
6198
|
const props = {
|
|
6198
6199
|
ref,
|
|
6199
6200
|
...rest
|
|
@@ -11192,23 +11193,58 @@ const GridColumn = styled__default.default.button.withConfig({
|
|
|
11192
11193
|
})(["background-color:transparent;outline:none;border:none;display:flex;justify-content:center;cursor:pointer;padding:8px;font-size:", ";font-family:", ";font-weight:", ";line-height:", ";color:", ";border-radius:999px;", ";&:hover{background-color:#f0f0f0;}&:focus{outline:2px dashed ", ";}"], edsTokens.tokens.typography.navigation.button.fontSize, edsTokens.tokens.typography.navigation.button.fontFamily, edsTokens.tokens.typography.navigation.button.fontWeight, edsTokens.tokens.typography.navigation.button.lineHeight, edsTokens.tokens.colors.text.static_icons__default.rgba, ({
|
|
11193
11194
|
$active
|
|
11194
11195
|
}) => $active ? `background-color: ${edsTokens.tokens.colors.interactive.primary__selected_highlight.rgba}` : '', edsTokens.tokens.colors.interactive.primary__resting.rgba);
|
|
11196
|
+
const TOTAL_VISIBLE_YEARS = 36;
|
|
11197
|
+
const RANGE_OFFSET = 30 / 2;
|
|
11195
11198
|
const GridFocusManager = ({
|
|
11196
11199
|
year: selectedYear,
|
|
11197
|
-
setFocusedYear
|
|
11200
|
+
setFocusedYear,
|
|
11201
|
+
yearPickerPage,
|
|
11202
|
+
setYearPickerPage
|
|
11198
11203
|
}) => {
|
|
11199
11204
|
const focusManager = reactAria.useFocusManager();
|
|
11200
|
-
const
|
|
11205
|
+
const prevYear = react.useRef();
|
|
11206
|
+
const navByKeyboard = react.useRef(false);
|
|
11207
|
+
const page = yearPickerPage * TOTAL_VISIBLE_YEARS;
|
|
11208
|
+
const years = Array.from({
|
|
11209
|
+
length: TOTAL_VISIBLE_YEARS
|
|
11210
|
+
}, (_, i) => i + (selectedYear + page - RANGE_OFFSET));
|
|
11211
|
+
react.useEffect(() => {
|
|
11212
|
+
if (prevYear.current === undefined) {
|
|
11213
|
+
prevYear.current = yearPickerPage;
|
|
11214
|
+
return;
|
|
11215
|
+
}
|
|
11216
|
+
if (!navByKeyboard.current) {
|
|
11217
|
+
focusManager.focusFirst();
|
|
11218
|
+
return;
|
|
11219
|
+
}
|
|
11220
|
+
navByKeyboard.current = false;
|
|
11221
|
+
yearPickerPage > prevYear.current ? focusManager.focusFirst() : focusManager.focusLast();
|
|
11222
|
+
prevYear.current = yearPickerPage;
|
|
11223
|
+
}, [yearPickerPage, focusManager]);
|
|
11224
|
+
const onKeyDown = year => e => {
|
|
11201
11225
|
const target = e.currentTarget;
|
|
11202
11226
|
const parent = target.parentElement;
|
|
11227
|
+
const isFirstYear = years.at(0) === year;
|
|
11228
|
+
const isLastYear = years.at(-1) === year;
|
|
11203
11229
|
switch (e.key) {
|
|
11204
11230
|
case 'ArrowRight':
|
|
11205
11231
|
e.preventDefault();
|
|
11232
|
+
if (isLastYear) {
|
|
11233
|
+
navByKeyboard.current = true;
|
|
11234
|
+
setYearPickerPage(page => page + 1);
|
|
11235
|
+
break;
|
|
11236
|
+
}
|
|
11206
11237
|
focusManager.focusNext({
|
|
11207
11238
|
wrap: true
|
|
11208
11239
|
});
|
|
11209
11240
|
break;
|
|
11210
11241
|
case 'ArrowLeft':
|
|
11211
11242
|
e.preventDefault();
|
|
11243
|
+
if (isFirstYear) {
|
|
11244
|
+
navByKeyboard.current = true;
|
|
11245
|
+
setYearPickerPage(page => page - 1);
|
|
11246
|
+
break;
|
|
11247
|
+
}
|
|
11212
11248
|
focusManager.focusPrevious({
|
|
11213
11249
|
wrap: true
|
|
11214
11250
|
});
|
|
@@ -11216,6 +11252,11 @@ const GridFocusManager = ({
|
|
|
11216
11252
|
case 'ArrowDown':
|
|
11217
11253
|
{
|
|
11218
11254
|
e.preventDefault();
|
|
11255
|
+
if (isLastYear) {
|
|
11256
|
+
navByKeyboard.current = true;
|
|
11257
|
+
setYearPickerPage(page => page + 1);
|
|
11258
|
+
break;
|
|
11259
|
+
}
|
|
11219
11260
|
const selfIndex = Array.from(parent.children).indexOf(target);
|
|
11220
11261
|
const focusElement = Array.from(parent.children).at(selfIndex + 5);
|
|
11221
11262
|
focusManager.focusNext({
|
|
@@ -11226,6 +11267,11 @@ const GridFocusManager = ({
|
|
|
11226
11267
|
case 'ArrowUp':
|
|
11227
11268
|
{
|
|
11228
11269
|
e.preventDefault();
|
|
11270
|
+
if (isFirstYear) {
|
|
11271
|
+
navByKeyboard.current = true;
|
|
11272
|
+
setYearPickerPage(page => page - 1);
|
|
11273
|
+
break;
|
|
11274
|
+
}
|
|
11229
11275
|
const selfIndex = Array.from(parent.children).indexOf(target);
|
|
11230
11276
|
const focusElement = Array.from(parent.children).at(selfIndex - 5);
|
|
11231
11277
|
focusManager.focusPrevious({
|
|
@@ -11235,12 +11281,9 @@ const GridFocusManager = ({
|
|
|
11235
11281
|
}
|
|
11236
11282
|
}
|
|
11237
11283
|
};
|
|
11238
|
-
const years = Array.from({
|
|
11239
|
-
length: 36
|
|
11240
|
-
}, (_, i) => i + (selectedYear - 30 / 2));
|
|
11241
11284
|
return years.map(year => /*#__PURE__*/jsxRuntime.jsx(GridColumn, {
|
|
11242
11285
|
$active: selectedYear === year,
|
|
11243
|
-
onKeyDown: onKeyDown,
|
|
11286
|
+
onKeyDown: onKeyDown(year),
|
|
11244
11287
|
onClick: () => setFocusedYear(year),
|
|
11245
11288
|
"aria-label": `Set year to ${year}`,
|
|
11246
11289
|
tabIndex: 0,
|
|
@@ -11249,7 +11292,9 @@ const GridFocusManager = ({
|
|
|
11249
11292
|
};
|
|
11250
11293
|
const YearGrid = ({
|
|
11251
11294
|
setFocusedYear,
|
|
11252
|
-
year: selectedYear
|
|
11295
|
+
year: selectedYear,
|
|
11296
|
+
yearPickerPage,
|
|
11297
|
+
setYearPickerPage
|
|
11253
11298
|
}) => {
|
|
11254
11299
|
return /*#__PURE__*/jsxRuntime.jsx(Grid, {
|
|
11255
11300
|
children: /*#__PURE__*/jsxRuntime.jsx(reactAria.FocusScope, {
|
|
@@ -11258,7 +11303,9 @@ const YearGrid = ({
|
|
|
11258
11303
|
autoFocus: true,
|
|
11259
11304
|
children: /*#__PURE__*/jsxRuntime.jsx(GridFocusManager, {
|
|
11260
11305
|
year: selectedYear,
|
|
11261
|
-
setFocusedYear: setFocusedYear
|
|
11306
|
+
setFocusedYear: setFocusedYear,
|
|
11307
|
+
yearPickerPage: yearPickerPage,
|
|
11308
|
+
setYearPickerPage: setYearPickerPage
|
|
11262
11309
|
})
|
|
11263
11310
|
})
|
|
11264
11311
|
});
|
|
@@ -11266,10 +11313,15 @@ const YearGrid = ({
|
|
|
11266
11313
|
|
|
11267
11314
|
/* eslint-disable react/no-array-index-key */
|
|
11268
11315
|
|
|
11316
|
+
/**
|
|
11317
|
+
* The grid laying out the cells for the calendars in {link Calendar} and {link RangeCalendar}
|
|
11318
|
+
*/
|
|
11269
11319
|
function CalendarGrid({
|
|
11270
11320
|
state,
|
|
11271
11321
|
showYearPicker,
|
|
11272
11322
|
setShowYearPicker,
|
|
11323
|
+
yearPickerPage,
|
|
11324
|
+
setYearPickerPage,
|
|
11273
11325
|
...props
|
|
11274
11326
|
}) {
|
|
11275
11327
|
const {
|
|
@@ -11294,7 +11346,9 @@ function CalendarGrid({
|
|
|
11294
11346
|
year
|
|
11295
11347
|
}));
|
|
11296
11348
|
setShowYearPicker(false);
|
|
11297
|
-
}
|
|
11349
|
+
},
|
|
11350
|
+
yearPickerPage: yearPickerPage,
|
|
11351
|
+
setYearPickerPage: setYearPickerPage
|
|
11298
11352
|
}) : /*#__PURE__*/jsxRuntime.jsxs("table", {
|
|
11299
11353
|
...gridProps,
|
|
11300
11354
|
style: {
|
|
@@ -11355,15 +11409,16 @@ function CalendarHeader({
|
|
|
11355
11409
|
previousMonthDisabled,
|
|
11356
11410
|
nextMonthDisabled,
|
|
11357
11411
|
showYearPicker,
|
|
11358
|
-
setShowYearPicker
|
|
11412
|
+
setShowYearPicker,
|
|
11413
|
+
setYearPickerPage
|
|
11359
11414
|
}) {
|
|
11360
11415
|
return /*#__PURE__*/jsxRuntime.jsx(HeaderWrapper, {
|
|
11361
11416
|
children: /*#__PURE__*/jsxRuntime.jsxs(HeaderActions, {
|
|
11362
11417
|
children: [/*#__PURE__*/jsxRuntime.jsx(Button$1, {
|
|
11363
11418
|
variant: 'ghost_icon',
|
|
11364
11419
|
"aria-label": 'Previous month',
|
|
11365
|
-
disabled: previousMonthDisabled
|
|
11366
|
-
onClick: () => state.focusPreviousPage(),
|
|
11420
|
+
disabled: previousMonthDisabled,
|
|
11421
|
+
onClick: () => showYearPicker ? setYearPickerPage(page => page - 1) : state.focusPreviousPage(),
|
|
11367
11422
|
children: /*#__PURE__*/jsxRuntime.jsx(Icon$1, {
|
|
11368
11423
|
data: edsIcons.chevron_left
|
|
11369
11424
|
})
|
|
@@ -11392,8 +11447,8 @@ function CalendarHeader({
|
|
|
11392
11447
|
}
|
|
11393
11448
|
}), /*#__PURE__*/jsxRuntime.jsx(Button$1, {
|
|
11394
11449
|
variant: 'ghost_icon',
|
|
11395
|
-
onClick: () => state.focusNextPage(),
|
|
11396
|
-
disabled: nextMonthDisabled
|
|
11450
|
+
onClick: () => showYearPicker ? setYearPickerPage(page => page + 1) : state.focusNextPage(),
|
|
11451
|
+
disabled: nextMonthDisabled,
|
|
11397
11452
|
"aria-label": 'Next month',
|
|
11398
11453
|
children: /*#__PURE__*/jsxRuntime.jsx(Icon$1, {
|
|
11399
11454
|
data: edsIcons.chevron_right
|
|
@@ -11414,6 +11469,7 @@ const Calendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11414
11469
|
...props
|
|
11415
11470
|
}, ref) => {
|
|
11416
11471
|
const [showYearPicker, setShowYearPicker] = react.useState(false);
|
|
11472
|
+
const [yearPickerPage, setYearPickerPage] = react.useState(0);
|
|
11417
11473
|
const {
|
|
11418
11474
|
locale
|
|
11419
11475
|
} = reactAria.useLocale();
|
|
@@ -11451,7 +11507,8 @@ const Calendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11451
11507
|
previousMonthDisabled: prevButtonProps.isDisabled,
|
|
11452
11508
|
nextMonthDisabled: nextButtonProps.isDisabled,
|
|
11453
11509
|
setShowYearPicker: setShowYearPicker,
|
|
11454
|
-
showYearPicker: showYearPicker
|
|
11510
|
+
showYearPicker: showYearPicker,
|
|
11511
|
+
setYearPickerPage: setYearPickerPage
|
|
11455
11512
|
})
|
|
11456
11513
|
}), /*#__PURE__*/jsxRuntime.jsx(Popover.Content, {
|
|
11457
11514
|
className: "calendar",
|
|
@@ -11461,7 +11518,9 @@ const Calendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11461
11518
|
children: /*#__PURE__*/jsxRuntime.jsx(CalendarGrid, {
|
|
11462
11519
|
state: calendarState,
|
|
11463
11520
|
setShowYearPicker: setShowYearPicker,
|
|
11464
|
-
showYearPicker: showYearPicker
|
|
11521
|
+
showYearPicker: showYearPicker,
|
|
11522
|
+
yearPickerPage: yearPickerPage,
|
|
11523
|
+
setYearPickerPage: setYearPickerPage
|
|
11465
11524
|
})
|
|
11466
11525
|
}), Footer && /*#__PURE__*/jsxRuntime.jsx(Popover.Actions, {
|
|
11467
11526
|
children: /*#__PURE__*/jsxRuntime.jsx(Footer, {
|
|
@@ -11997,6 +12056,7 @@ const RangeCalendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11997
12056
|
...props
|
|
11998
12057
|
}, ref) => {
|
|
11999
12058
|
const [showYearPicker, setShowYearPicker] = react.useState(false);
|
|
12059
|
+
const [yearPickerPage, setYearPickerPage] = react.useState(0);
|
|
12000
12060
|
const {
|
|
12001
12061
|
locale
|
|
12002
12062
|
} = reactAria.useLocale();
|
|
@@ -12027,13 +12087,16 @@ const RangeCalendar = /*#__PURE__*/react.forwardRef(({
|
|
|
12027
12087
|
state: state,
|
|
12028
12088
|
title: title,
|
|
12029
12089
|
setShowYearPicker: setShowYearPicker,
|
|
12030
|
-
showYearPicker: showYearPicker
|
|
12090
|
+
showYearPicker: showYearPicker,
|
|
12091
|
+
setYearPickerPage: setYearPickerPage
|
|
12031
12092
|
})
|
|
12032
12093
|
}), /*#__PURE__*/jsxRuntime.jsx(Popover.Content, {
|
|
12033
12094
|
children: /*#__PURE__*/jsxRuntime.jsx(CalendarGrid, {
|
|
12034
12095
|
state: state,
|
|
12035
12096
|
setShowYearPicker: setShowYearPicker,
|
|
12036
|
-
showYearPicker: showYearPicker
|
|
12097
|
+
showYearPicker: showYearPicker,
|
|
12098
|
+
yearPickerPage: yearPickerPage,
|
|
12099
|
+
setYearPickerPage: setYearPickerPage
|
|
12037
12100
|
})
|
|
12038
12101
|
}), Footer && /*#__PURE__*/jsxRuntime.jsx(Popover.Actions, {
|
|
12039
12102
|
children: /*#__PURE__*/jsxRuntime.jsx(Footer, {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { forwardRef, useState, useEffect, Children, isValidElement, cloneElement } from 'react';
|
|
2
|
-
import { Button } from '../Button.js';
|
|
3
2
|
import { jsx } from 'react/jsx-runtime';
|
|
4
3
|
import { Tooltip } from '../../Tooltip/Tooltip.js';
|
|
5
4
|
import { ButtonGroup } from '../ButtonGroup/ButtonGroup.js';
|
|
@@ -19,7 +18,7 @@ const ToggleButton = /*#__PURE__*/forwardRef(function ToggleButton({
|
|
|
19
18
|
}, [selectedIndexes]);
|
|
20
19
|
function updateProps(child, isSelected, index) {
|
|
21
20
|
const childElement = child;
|
|
22
|
-
if ( /*#__PURE__*/isValidElement(child)
|
|
21
|
+
if ( /*#__PURE__*/isValidElement(child)) {
|
|
23
22
|
const buttonProps = {
|
|
24
23
|
'aria-pressed': isSelected ? true : undefined,
|
|
25
24
|
variant: isSelected ? 'contained' : 'outlined',
|
|
@@ -14,6 +14,7 @@ const Calendar = /*#__PURE__*/forwardRef(({
|
|
|
14
14
|
...props
|
|
15
15
|
}, ref) => {
|
|
16
16
|
const [showYearPicker, setShowYearPicker] = useState(false);
|
|
17
|
+
const [yearPickerPage, setYearPickerPage] = useState(0);
|
|
17
18
|
const {
|
|
18
19
|
locale
|
|
19
20
|
} = useLocale();
|
|
@@ -51,7 +52,8 @@ const Calendar = /*#__PURE__*/forwardRef(({
|
|
|
51
52
|
previousMonthDisabled: prevButtonProps.isDisabled,
|
|
52
53
|
nextMonthDisabled: nextButtonProps.isDisabled,
|
|
53
54
|
setShowYearPicker: setShowYearPicker,
|
|
54
|
-
showYearPicker: showYearPicker
|
|
55
|
+
showYearPicker: showYearPicker,
|
|
56
|
+
setYearPickerPage: setYearPickerPage
|
|
55
57
|
})
|
|
56
58
|
}), /*#__PURE__*/jsx(Popover.Content, {
|
|
57
59
|
className: "calendar",
|
|
@@ -61,7 +63,9 @@ const Calendar = /*#__PURE__*/forwardRef(({
|
|
|
61
63
|
children: /*#__PURE__*/jsx(CalendarGrid, {
|
|
62
64
|
state: calendarState,
|
|
63
65
|
setShowYearPicker: setShowYearPicker,
|
|
64
|
-
showYearPicker: showYearPicker
|
|
66
|
+
showYearPicker: showYearPicker,
|
|
67
|
+
yearPickerPage: yearPickerPage,
|
|
68
|
+
setYearPickerPage: setYearPickerPage
|
|
65
69
|
})
|
|
66
70
|
}), Footer && /*#__PURE__*/jsx(Popover.Actions, {
|
|
67
71
|
children: /*#__PURE__*/jsx(Footer, {
|
|
@@ -6,10 +6,15 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
6
6
|
|
|
7
7
|
/* eslint-disable react/no-array-index-key */
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* The grid laying out the cells for the calendars in {link Calendar} and {link RangeCalendar}
|
|
11
|
+
*/
|
|
9
12
|
function CalendarGrid({
|
|
10
13
|
state,
|
|
11
14
|
showYearPicker,
|
|
12
15
|
setShowYearPicker,
|
|
16
|
+
yearPickerPage,
|
|
17
|
+
setYearPickerPage,
|
|
13
18
|
...props
|
|
14
19
|
}) {
|
|
15
20
|
const {
|
|
@@ -34,7 +39,9 @@ function CalendarGrid({
|
|
|
34
39
|
year
|
|
35
40
|
}));
|
|
36
41
|
setShowYearPicker(false);
|
|
37
|
-
}
|
|
42
|
+
},
|
|
43
|
+
yearPickerPage: yearPickerPage,
|
|
44
|
+
setYearPickerPage: setYearPickerPage
|
|
38
45
|
}) : /*#__PURE__*/jsxs("table", {
|
|
39
46
|
...gridProps,
|
|
40
47
|
style: {
|
|
@@ -39,15 +39,16 @@ function CalendarHeader({
|
|
|
39
39
|
previousMonthDisabled,
|
|
40
40
|
nextMonthDisabled,
|
|
41
41
|
showYearPicker,
|
|
42
|
-
setShowYearPicker
|
|
42
|
+
setShowYearPicker,
|
|
43
|
+
setYearPickerPage
|
|
43
44
|
}) {
|
|
44
45
|
return /*#__PURE__*/jsx(HeaderWrapper, {
|
|
45
46
|
children: /*#__PURE__*/jsxs(HeaderActions, {
|
|
46
47
|
children: [/*#__PURE__*/jsx(Button, {
|
|
47
48
|
variant: 'ghost_icon',
|
|
48
49
|
"aria-label": 'Previous month',
|
|
49
|
-
disabled: previousMonthDisabled
|
|
50
|
-
onClick: () => state.focusPreviousPage(),
|
|
50
|
+
disabled: previousMonthDisabled,
|
|
51
|
+
onClick: () => showYearPicker ? setYearPickerPage(page => page - 1) : state.focusPreviousPage(),
|
|
51
52
|
children: /*#__PURE__*/jsx(Icon, {
|
|
52
53
|
data: chevron_left
|
|
53
54
|
})
|
|
@@ -76,8 +77,8 @@ function CalendarHeader({
|
|
|
76
77
|
}
|
|
77
78
|
}), /*#__PURE__*/jsx(Button, {
|
|
78
79
|
variant: 'ghost_icon',
|
|
79
|
-
onClick: () => state.focusNextPage(),
|
|
80
|
-
disabled: nextMonthDisabled
|
|
80
|
+
onClick: () => showYearPicker ? setYearPickerPage(page => page + 1) : state.focusNextPage(),
|
|
81
|
+
disabled: nextMonthDisabled,
|
|
81
82
|
"aria-label": 'Next month',
|
|
82
83
|
children: /*#__PURE__*/jsx(Icon, {
|
|
83
84
|
data: chevron_right
|
|
@@ -14,6 +14,7 @@ const RangeCalendar = /*#__PURE__*/forwardRef(({
|
|
|
14
14
|
...props
|
|
15
15
|
}, ref) => {
|
|
16
16
|
const [showYearPicker, setShowYearPicker] = useState(false);
|
|
17
|
+
const [yearPickerPage, setYearPickerPage] = useState(0);
|
|
17
18
|
const {
|
|
18
19
|
locale
|
|
19
20
|
} = useLocale();
|
|
@@ -44,13 +45,16 @@ const RangeCalendar = /*#__PURE__*/forwardRef(({
|
|
|
44
45
|
state: state,
|
|
45
46
|
title: title,
|
|
46
47
|
setShowYearPicker: setShowYearPicker,
|
|
47
|
-
showYearPicker: showYearPicker
|
|
48
|
+
showYearPicker: showYearPicker,
|
|
49
|
+
setYearPickerPage: setYearPickerPage
|
|
48
50
|
})
|
|
49
51
|
}), /*#__PURE__*/jsx(Popover.Content, {
|
|
50
52
|
children: /*#__PURE__*/jsx(CalendarGrid, {
|
|
51
53
|
state: state,
|
|
52
54
|
setShowYearPicker: setShowYearPicker,
|
|
53
|
-
showYearPicker: showYearPicker
|
|
55
|
+
showYearPicker: showYearPicker,
|
|
56
|
+
yearPickerPage: yearPickerPage,
|
|
57
|
+
setYearPickerPage: setYearPickerPage
|
|
54
58
|
})
|
|
55
59
|
}), Footer && /*#__PURE__*/jsx(Popover.Actions, {
|
|
56
60
|
children: /*#__PURE__*/jsx(Footer, {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import styled from 'styled-components';
|
|
2
2
|
import { tokens } from '@equinor/eds-tokens';
|
|
3
3
|
import { FocusScope, useFocusManager } from 'react-aria';
|
|
4
|
+
import { useRef, useEffect } from 'react';
|
|
4
5
|
import { jsx } from 'react/jsx-runtime';
|
|
5
6
|
|
|
6
7
|
// Disable no-autofocus - it's not the native autofocus attribute, but react-aria's autoFocus prop
|
|
@@ -15,23 +16,58 @@ const GridColumn = styled.button.withConfig({
|
|
|
15
16
|
})(["background-color:transparent;outline:none;border:none;display:flex;justify-content:center;cursor:pointer;padding:8px;font-size:", ";font-family:", ";font-weight:", ";line-height:", ";color:", ";border-radius:999px;", ";&:hover{background-color:#f0f0f0;}&:focus{outline:2px dashed ", ";}"], tokens.typography.navigation.button.fontSize, tokens.typography.navigation.button.fontFamily, tokens.typography.navigation.button.fontWeight, tokens.typography.navigation.button.lineHeight, tokens.colors.text.static_icons__default.rgba, ({
|
|
16
17
|
$active
|
|
17
18
|
}) => $active ? `background-color: ${tokens.colors.interactive.primary__selected_highlight.rgba}` : '', tokens.colors.interactive.primary__resting.rgba);
|
|
19
|
+
const TOTAL_VISIBLE_YEARS = 36;
|
|
20
|
+
const RANGE_OFFSET = 30 / 2;
|
|
18
21
|
const GridFocusManager = ({
|
|
19
22
|
year: selectedYear,
|
|
20
|
-
setFocusedYear
|
|
23
|
+
setFocusedYear,
|
|
24
|
+
yearPickerPage,
|
|
25
|
+
setYearPickerPage
|
|
21
26
|
}) => {
|
|
22
27
|
const focusManager = useFocusManager();
|
|
23
|
-
const
|
|
28
|
+
const prevYear = useRef();
|
|
29
|
+
const navByKeyboard = useRef(false);
|
|
30
|
+
const page = yearPickerPage * TOTAL_VISIBLE_YEARS;
|
|
31
|
+
const years = Array.from({
|
|
32
|
+
length: TOTAL_VISIBLE_YEARS
|
|
33
|
+
}, (_, i) => i + (selectedYear + page - RANGE_OFFSET));
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (prevYear.current === undefined) {
|
|
36
|
+
prevYear.current = yearPickerPage;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!navByKeyboard.current) {
|
|
40
|
+
focusManager.focusFirst();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
navByKeyboard.current = false;
|
|
44
|
+
yearPickerPage > prevYear.current ? focusManager.focusFirst() : focusManager.focusLast();
|
|
45
|
+
prevYear.current = yearPickerPage;
|
|
46
|
+
}, [yearPickerPage, focusManager]);
|
|
47
|
+
const onKeyDown = year => e => {
|
|
24
48
|
const target = e.currentTarget;
|
|
25
49
|
const parent = target.parentElement;
|
|
50
|
+
const isFirstYear = years.at(0) === year;
|
|
51
|
+
const isLastYear = years.at(-1) === year;
|
|
26
52
|
switch (e.key) {
|
|
27
53
|
case 'ArrowRight':
|
|
28
54
|
e.preventDefault();
|
|
55
|
+
if (isLastYear) {
|
|
56
|
+
navByKeyboard.current = true;
|
|
57
|
+
setYearPickerPage(page => page + 1);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
29
60
|
focusManager.focusNext({
|
|
30
61
|
wrap: true
|
|
31
62
|
});
|
|
32
63
|
break;
|
|
33
64
|
case 'ArrowLeft':
|
|
34
65
|
e.preventDefault();
|
|
66
|
+
if (isFirstYear) {
|
|
67
|
+
navByKeyboard.current = true;
|
|
68
|
+
setYearPickerPage(page => page - 1);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
35
71
|
focusManager.focusPrevious({
|
|
36
72
|
wrap: true
|
|
37
73
|
});
|
|
@@ -39,6 +75,11 @@ const GridFocusManager = ({
|
|
|
39
75
|
case 'ArrowDown':
|
|
40
76
|
{
|
|
41
77
|
e.preventDefault();
|
|
78
|
+
if (isLastYear) {
|
|
79
|
+
navByKeyboard.current = true;
|
|
80
|
+
setYearPickerPage(page => page + 1);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
42
83
|
const selfIndex = Array.from(parent.children).indexOf(target);
|
|
43
84
|
const focusElement = Array.from(parent.children).at(selfIndex + 5);
|
|
44
85
|
focusManager.focusNext({
|
|
@@ -49,6 +90,11 @@ const GridFocusManager = ({
|
|
|
49
90
|
case 'ArrowUp':
|
|
50
91
|
{
|
|
51
92
|
e.preventDefault();
|
|
93
|
+
if (isFirstYear) {
|
|
94
|
+
navByKeyboard.current = true;
|
|
95
|
+
setYearPickerPage(page => page - 1);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
52
98
|
const selfIndex = Array.from(parent.children).indexOf(target);
|
|
53
99
|
const focusElement = Array.from(parent.children).at(selfIndex - 5);
|
|
54
100
|
focusManager.focusPrevious({
|
|
@@ -58,12 +104,9 @@ const GridFocusManager = ({
|
|
|
58
104
|
}
|
|
59
105
|
}
|
|
60
106
|
};
|
|
61
|
-
const years = Array.from({
|
|
62
|
-
length: 36
|
|
63
|
-
}, (_, i) => i + (selectedYear - 30 / 2));
|
|
64
107
|
return years.map(year => /*#__PURE__*/jsx(GridColumn, {
|
|
65
108
|
$active: selectedYear === year,
|
|
66
|
-
onKeyDown: onKeyDown,
|
|
109
|
+
onKeyDown: onKeyDown(year),
|
|
67
110
|
onClick: () => setFocusedYear(year),
|
|
68
111
|
"aria-label": `Set year to ${year}`,
|
|
69
112
|
tabIndex: 0,
|
|
@@ -72,7 +115,9 @@ const GridFocusManager = ({
|
|
|
72
115
|
};
|
|
73
116
|
const YearGrid = ({
|
|
74
117
|
setFocusedYear,
|
|
75
|
-
year: selectedYear
|
|
118
|
+
year: selectedYear,
|
|
119
|
+
yearPickerPage,
|
|
120
|
+
setYearPickerPage
|
|
76
121
|
}) => {
|
|
77
122
|
return /*#__PURE__*/jsx(Grid, {
|
|
78
123
|
children: /*#__PURE__*/jsx(FocusScope, {
|
|
@@ -81,7 +126,9 @@ const YearGrid = ({
|
|
|
81
126
|
autoFocus: true,
|
|
82
127
|
children: /*#__PURE__*/jsx(GridFocusManager, {
|
|
83
128
|
year: selectedYear,
|
|
84
|
-
setFocusedYear: setFocusedYear
|
|
129
|
+
setFocusedYear: setFocusedYear,
|
|
130
|
+
yearPickerPage: yearPickerPage,
|
|
131
|
+
setYearPickerPage: setYearPickerPage
|
|
85
132
|
})
|
|
86
133
|
})
|
|
87
134
|
});
|
|
@@ -52,7 +52,8 @@ const Snackbar = /*#__PURE__*/forwardRef(function Snackbar({
|
|
|
52
52
|
}, autoHideDuration);
|
|
53
53
|
}
|
|
54
54
|
return () => clearTimeout(timer.current);
|
|
55
|
-
|
|
55
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
56
|
+
}, [open, autoHideDuration]);
|
|
56
57
|
const props = {
|
|
57
58
|
ref,
|
|
58
59
|
...rest
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { CalendarState, RangeCalendarState } from '@react-stately/calendar';
|
|
2
2
|
import { AriaCalendarGridProps } from 'react-aria';
|
|
3
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
3
4
|
/**
|
|
4
5
|
* The grid laying out the cells for the calendars in {link Calendar} and {link RangeCalendar}
|
|
5
6
|
*/
|
|
6
|
-
export declare function CalendarGrid({ state, showYearPicker, setShowYearPicker, ...props }: {
|
|
7
|
+
export declare function CalendarGrid({ state, showYearPicker, setShowYearPicker, yearPickerPage, setYearPickerPage, ...props }: {
|
|
7
8
|
state: CalendarState | RangeCalendarState;
|
|
8
9
|
showYearPicker: boolean;
|
|
9
10
|
setShowYearPicker: (showYearPicker: boolean) => void;
|
|
11
|
+
yearPickerPage: number;
|
|
12
|
+
setYearPickerPage: Dispatch<SetStateAction<number>>;
|
|
10
13
|
} & AriaCalendarGridProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { CalendarState, RangeCalendarState } from '@react-stately/calendar';
|
|
2
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
2
3
|
/**
|
|
3
4
|
* The default header for the calendar components if no custom header is provided
|
|
4
5
|
*/
|
|
5
|
-
export declare function CalendarHeader({ state, title, previousMonthDisabled, nextMonthDisabled, showYearPicker, setShowYearPicker, }: {
|
|
6
|
+
export declare function CalendarHeader({ state, title, previousMonthDisabled, nextMonthDisabled, showYearPicker, setShowYearPicker, setYearPickerPage, }: {
|
|
6
7
|
state: CalendarState | RangeCalendarState;
|
|
7
8
|
title: string;
|
|
8
9
|
previousMonthDisabled?: boolean;
|
|
9
10
|
nextMonthDisabled?: boolean;
|
|
10
11
|
showYearPicker: boolean;
|
|
11
12
|
setShowYearPicker: (showYearPicker: boolean) => void;
|
|
13
|
+
setYearPickerPage?: Dispatch<SetStateAction<number>>;
|
|
12
14
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
export declare const YearGrid: ({ setFocusedYear, year: selectedYear, yearPickerPage, setYearPickerPage, }: {
|
|
2
3
|
setFocusedYear: (year: number) => void;
|
|
3
4
|
year: number;
|
|
5
|
+
yearPickerPage: number;
|
|
6
|
+
setYearPickerPage?: Dispatch<SetStateAction<number>>;
|
|
4
7
|
}) => import("react/jsx-runtime").JSX.Element;
|