@equinor/eds-core-react 0.41.1 → 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 +80 -18
- 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/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 +3 -3
package/dist/eds-core-react.cjs
CHANGED
|
@@ -11193,23 +11193,58 @@ const GridColumn = styled__default.default.button.withConfig({
|
|
|
11193
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, ({
|
|
11194
11194
|
$active
|
|
11195
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;
|
|
11196
11198
|
const GridFocusManager = ({
|
|
11197
11199
|
year: selectedYear,
|
|
11198
|
-
setFocusedYear
|
|
11200
|
+
setFocusedYear,
|
|
11201
|
+
yearPickerPage,
|
|
11202
|
+
setYearPickerPage
|
|
11199
11203
|
}) => {
|
|
11200
11204
|
const focusManager = reactAria.useFocusManager();
|
|
11201
|
-
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 => {
|
|
11202
11225
|
const target = e.currentTarget;
|
|
11203
11226
|
const parent = target.parentElement;
|
|
11227
|
+
const isFirstYear = years.at(0) === year;
|
|
11228
|
+
const isLastYear = years.at(-1) === year;
|
|
11204
11229
|
switch (e.key) {
|
|
11205
11230
|
case 'ArrowRight':
|
|
11206
11231
|
e.preventDefault();
|
|
11232
|
+
if (isLastYear) {
|
|
11233
|
+
navByKeyboard.current = true;
|
|
11234
|
+
setYearPickerPage(page => page + 1);
|
|
11235
|
+
break;
|
|
11236
|
+
}
|
|
11207
11237
|
focusManager.focusNext({
|
|
11208
11238
|
wrap: true
|
|
11209
11239
|
});
|
|
11210
11240
|
break;
|
|
11211
11241
|
case 'ArrowLeft':
|
|
11212
11242
|
e.preventDefault();
|
|
11243
|
+
if (isFirstYear) {
|
|
11244
|
+
navByKeyboard.current = true;
|
|
11245
|
+
setYearPickerPage(page => page - 1);
|
|
11246
|
+
break;
|
|
11247
|
+
}
|
|
11213
11248
|
focusManager.focusPrevious({
|
|
11214
11249
|
wrap: true
|
|
11215
11250
|
});
|
|
@@ -11217,6 +11252,11 @@ const GridFocusManager = ({
|
|
|
11217
11252
|
case 'ArrowDown':
|
|
11218
11253
|
{
|
|
11219
11254
|
e.preventDefault();
|
|
11255
|
+
if (isLastYear) {
|
|
11256
|
+
navByKeyboard.current = true;
|
|
11257
|
+
setYearPickerPage(page => page + 1);
|
|
11258
|
+
break;
|
|
11259
|
+
}
|
|
11220
11260
|
const selfIndex = Array.from(parent.children).indexOf(target);
|
|
11221
11261
|
const focusElement = Array.from(parent.children).at(selfIndex + 5);
|
|
11222
11262
|
focusManager.focusNext({
|
|
@@ -11227,6 +11267,11 @@ const GridFocusManager = ({
|
|
|
11227
11267
|
case 'ArrowUp':
|
|
11228
11268
|
{
|
|
11229
11269
|
e.preventDefault();
|
|
11270
|
+
if (isFirstYear) {
|
|
11271
|
+
navByKeyboard.current = true;
|
|
11272
|
+
setYearPickerPage(page => page - 1);
|
|
11273
|
+
break;
|
|
11274
|
+
}
|
|
11230
11275
|
const selfIndex = Array.from(parent.children).indexOf(target);
|
|
11231
11276
|
const focusElement = Array.from(parent.children).at(selfIndex - 5);
|
|
11232
11277
|
focusManager.focusPrevious({
|
|
@@ -11236,12 +11281,9 @@ const GridFocusManager = ({
|
|
|
11236
11281
|
}
|
|
11237
11282
|
}
|
|
11238
11283
|
};
|
|
11239
|
-
const years = Array.from({
|
|
11240
|
-
length: 36
|
|
11241
|
-
}, (_, i) => i + (selectedYear - 30 / 2));
|
|
11242
11284
|
return years.map(year => /*#__PURE__*/jsxRuntime.jsx(GridColumn, {
|
|
11243
11285
|
$active: selectedYear === year,
|
|
11244
|
-
onKeyDown: onKeyDown,
|
|
11286
|
+
onKeyDown: onKeyDown(year),
|
|
11245
11287
|
onClick: () => setFocusedYear(year),
|
|
11246
11288
|
"aria-label": `Set year to ${year}`,
|
|
11247
11289
|
tabIndex: 0,
|
|
@@ -11250,7 +11292,9 @@ const GridFocusManager = ({
|
|
|
11250
11292
|
};
|
|
11251
11293
|
const YearGrid = ({
|
|
11252
11294
|
setFocusedYear,
|
|
11253
|
-
year: selectedYear
|
|
11295
|
+
year: selectedYear,
|
|
11296
|
+
yearPickerPage,
|
|
11297
|
+
setYearPickerPage
|
|
11254
11298
|
}) => {
|
|
11255
11299
|
return /*#__PURE__*/jsxRuntime.jsx(Grid, {
|
|
11256
11300
|
children: /*#__PURE__*/jsxRuntime.jsx(reactAria.FocusScope, {
|
|
@@ -11259,7 +11303,9 @@ const YearGrid = ({
|
|
|
11259
11303
|
autoFocus: true,
|
|
11260
11304
|
children: /*#__PURE__*/jsxRuntime.jsx(GridFocusManager, {
|
|
11261
11305
|
year: selectedYear,
|
|
11262
|
-
setFocusedYear: setFocusedYear
|
|
11306
|
+
setFocusedYear: setFocusedYear,
|
|
11307
|
+
yearPickerPage: yearPickerPage,
|
|
11308
|
+
setYearPickerPage: setYearPickerPage
|
|
11263
11309
|
})
|
|
11264
11310
|
})
|
|
11265
11311
|
});
|
|
@@ -11267,10 +11313,15 @@ const YearGrid = ({
|
|
|
11267
11313
|
|
|
11268
11314
|
/* eslint-disable react/no-array-index-key */
|
|
11269
11315
|
|
|
11316
|
+
/**
|
|
11317
|
+
* The grid laying out the cells for the calendars in {link Calendar} and {link RangeCalendar}
|
|
11318
|
+
*/
|
|
11270
11319
|
function CalendarGrid({
|
|
11271
11320
|
state,
|
|
11272
11321
|
showYearPicker,
|
|
11273
11322
|
setShowYearPicker,
|
|
11323
|
+
yearPickerPage,
|
|
11324
|
+
setYearPickerPage,
|
|
11274
11325
|
...props
|
|
11275
11326
|
}) {
|
|
11276
11327
|
const {
|
|
@@ -11295,7 +11346,9 @@ function CalendarGrid({
|
|
|
11295
11346
|
year
|
|
11296
11347
|
}));
|
|
11297
11348
|
setShowYearPicker(false);
|
|
11298
|
-
}
|
|
11349
|
+
},
|
|
11350
|
+
yearPickerPage: yearPickerPage,
|
|
11351
|
+
setYearPickerPage: setYearPickerPage
|
|
11299
11352
|
}) : /*#__PURE__*/jsxRuntime.jsxs("table", {
|
|
11300
11353
|
...gridProps,
|
|
11301
11354
|
style: {
|
|
@@ -11356,15 +11409,16 @@ function CalendarHeader({
|
|
|
11356
11409
|
previousMonthDisabled,
|
|
11357
11410
|
nextMonthDisabled,
|
|
11358
11411
|
showYearPicker,
|
|
11359
|
-
setShowYearPicker
|
|
11412
|
+
setShowYearPicker,
|
|
11413
|
+
setYearPickerPage
|
|
11360
11414
|
}) {
|
|
11361
11415
|
return /*#__PURE__*/jsxRuntime.jsx(HeaderWrapper, {
|
|
11362
11416
|
children: /*#__PURE__*/jsxRuntime.jsxs(HeaderActions, {
|
|
11363
11417
|
children: [/*#__PURE__*/jsxRuntime.jsx(Button$1, {
|
|
11364
11418
|
variant: 'ghost_icon',
|
|
11365
11419
|
"aria-label": 'Previous month',
|
|
11366
|
-
disabled: previousMonthDisabled
|
|
11367
|
-
onClick: () => state.focusPreviousPage(),
|
|
11420
|
+
disabled: previousMonthDisabled,
|
|
11421
|
+
onClick: () => showYearPicker ? setYearPickerPage(page => page - 1) : state.focusPreviousPage(),
|
|
11368
11422
|
children: /*#__PURE__*/jsxRuntime.jsx(Icon$1, {
|
|
11369
11423
|
data: edsIcons.chevron_left
|
|
11370
11424
|
})
|
|
@@ -11393,8 +11447,8 @@ function CalendarHeader({
|
|
|
11393
11447
|
}
|
|
11394
11448
|
}), /*#__PURE__*/jsxRuntime.jsx(Button$1, {
|
|
11395
11449
|
variant: 'ghost_icon',
|
|
11396
|
-
onClick: () => state.focusNextPage(),
|
|
11397
|
-
disabled: nextMonthDisabled
|
|
11450
|
+
onClick: () => showYearPicker ? setYearPickerPage(page => page + 1) : state.focusNextPage(),
|
|
11451
|
+
disabled: nextMonthDisabled,
|
|
11398
11452
|
"aria-label": 'Next month',
|
|
11399
11453
|
children: /*#__PURE__*/jsxRuntime.jsx(Icon$1, {
|
|
11400
11454
|
data: edsIcons.chevron_right
|
|
@@ -11415,6 +11469,7 @@ const Calendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11415
11469
|
...props
|
|
11416
11470
|
}, ref) => {
|
|
11417
11471
|
const [showYearPicker, setShowYearPicker] = react.useState(false);
|
|
11472
|
+
const [yearPickerPage, setYearPickerPage] = react.useState(0);
|
|
11418
11473
|
const {
|
|
11419
11474
|
locale
|
|
11420
11475
|
} = reactAria.useLocale();
|
|
@@ -11452,7 +11507,8 @@ const Calendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11452
11507
|
previousMonthDisabled: prevButtonProps.isDisabled,
|
|
11453
11508
|
nextMonthDisabled: nextButtonProps.isDisabled,
|
|
11454
11509
|
setShowYearPicker: setShowYearPicker,
|
|
11455
|
-
showYearPicker: showYearPicker
|
|
11510
|
+
showYearPicker: showYearPicker,
|
|
11511
|
+
setYearPickerPage: setYearPickerPage
|
|
11456
11512
|
})
|
|
11457
11513
|
}), /*#__PURE__*/jsxRuntime.jsx(Popover.Content, {
|
|
11458
11514
|
className: "calendar",
|
|
@@ -11462,7 +11518,9 @@ const Calendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11462
11518
|
children: /*#__PURE__*/jsxRuntime.jsx(CalendarGrid, {
|
|
11463
11519
|
state: calendarState,
|
|
11464
11520
|
setShowYearPicker: setShowYearPicker,
|
|
11465
|
-
showYearPicker: showYearPicker
|
|
11521
|
+
showYearPicker: showYearPicker,
|
|
11522
|
+
yearPickerPage: yearPickerPage,
|
|
11523
|
+
setYearPickerPage: setYearPickerPage
|
|
11466
11524
|
})
|
|
11467
11525
|
}), Footer && /*#__PURE__*/jsxRuntime.jsx(Popover.Actions, {
|
|
11468
11526
|
children: /*#__PURE__*/jsxRuntime.jsx(Footer, {
|
|
@@ -11998,6 +12056,7 @@ const RangeCalendar = /*#__PURE__*/react.forwardRef(({
|
|
|
11998
12056
|
...props
|
|
11999
12057
|
}, ref) => {
|
|
12000
12058
|
const [showYearPicker, setShowYearPicker] = react.useState(false);
|
|
12059
|
+
const [yearPickerPage, setYearPickerPage] = react.useState(0);
|
|
12001
12060
|
const {
|
|
12002
12061
|
locale
|
|
12003
12062
|
} = reactAria.useLocale();
|
|
@@ -12028,13 +12087,16 @@ const RangeCalendar = /*#__PURE__*/react.forwardRef(({
|
|
|
12028
12087
|
state: state,
|
|
12029
12088
|
title: title,
|
|
12030
12089
|
setShowYearPicker: setShowYearPicker,
|
|
12031
|
-
showYearPicker: showYearPicker
|
|
12090
|
+
showYearPicker: showYearPicker,
|
|
12091
|
+
setYearPickerPage: setYearPickerPage
|
|
12032
12092
|
})
|
|
12033
12093
|
}), /*#__PURE__*/jsxRuntime.jsx(Popover.Content, {
|
|
12034
12094
|
children: /*#__PURE__*/jsxRuntime.jsx(CalendarGrid, {
|
|
12035
12095
|
state: state,
|
|
12036
12096
|
setShowYearPicker: setShowYearPicker,
|
|
12037
|
-
showYearPicker: showYearPicker
|
|
12097
|
+
showYearPicker: showYearPicker,
|
|
12098
|
+
yearPickerPage: yearPickerPage,
|
|
12099
|
+
setYearPickerPage: setYearPickerPage
|
|
12038
12100
|
})
|
|
12039
12101
|
}), Footer && /*#__PURE__*/jsxRuntime.jsx(Popover.Actions, {
|
|
12040
12102
|
children: /*#__PURE__*/jsxRuntime.jsx(Footer, {
|
|
@@ -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
|
});
|
|
@@ -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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@equinor/eds-core-react",
|
|
3
|
-
"version": "0.41.
|
|
3
|
+
"version": "0.41.2",
|
|
4
4
|
"description": "The React implementation of the Equinor Design System",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"**/*.css"
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
"downshift": "9.0.7",
|
|
90
90
|
"react-aria": "^3.34.1",
|
|
91
91
|
"@equinor/eds-tokens": "0.9.2",
|
|
92
|
-
"@equinor/eds-
|
|
93
|
-
"@equinor/eds-
|
|
92
|
+
"@equinor/eds-utils": "0.8.5",
|
|
93
|
+
"@equinor/eds-icons": "^0.21.0"
|
|
94
94
|
},
|
|
95
95
|
"scripts": {
|
|
96
96
|
"build": "rollup -c --bundleConfigAsCjs && tsc -p tsconfig.build.json",
|