1
1
/* eslint-disable jsx-a11y/no-noninteractive-tabindex */
2
2
3
- import React , { useState , useContext } from "react" ;
3
+ import React , { useState , useContext , useMemo } from "react" ;
4
4
import PropTypes from "prop-types" ;
5
5
import { withStyles } from "@material-ui/core" ;
6
6
import clsx from "clsx" ;
7
7
import isNil from "lodash/isNil" ;
8
8
import { isKeypress , KeyboardCodes , setId } from "../../utils" ;
9
9
import styles from "./styles" ;
10
10
import { HvFormElementDescriptorsContext } from "../../Forms/FormElement" ;
11
- import { VIEW_MODE } from "../enums" ;
12
- import { isRange , isDate } from "../utils" ;
11
+ import { VIEW_MODE , REPRESENTATION_VALUES } from "../enums" ;
12
+ import { isRange , isDate , getWeekdayNamesList } from "../utils" ;
13
13
import { generateCalendarModel } from "../model" ;
14
- import CalendarCell from ".. /CalendarCell" ;
14
+ import CalendarCell from "./CalendarCell" ;
15
15
import CalendarHeader from "../CalendarHeader" ;
16
16
import CalendarWeekLabels from "../CalendarWeekLabels" ;
17
17
import { HvComposedNavigation , HvMonthSelector } from "../CalendarNavigation" ;
@@ -51,6 +51,11 @@ const HvSingleCalendar = ({
51
51
const firstDayOfCurrentMonth = new Date ( calModel . year , calModel . month - 1 , 1 ) ;
52
52
const firstDayOfCurrentMonthTime = firstDayOfCurrentMonth . getTime ( ) ;
53
53
54
+ const listWeekdayNames = useMemo (
55
+ ( ) => getWeekdayNamesList ( locale , REPRESENTATION_VALUES . NARROW ) ,
56
+ [ locale ]
57
+ ) ;
58
+
54
59
const handleChange = ( event , date ) => {
55
60
event ?. preventDefault ( ) ;
56
61
onChange ?. ( event , date ) ;
@@ -73,7 +78,7 @@ const HvSingleCalendar = ({
73
78
// This code is very brittle and should be managed with the focus wrapper
74
79
const el = document ?. activeElement ;
75
80
const parent = el ?. parentElement ?. parentElement ;
76
- const siblings = [ ...parent ?. getElementsByClassName ( "HvCalendarCell- cellContainer" ) ] ;
81
+ const siblings = [ ...parent ?. getElementsByClassName ( classes . cellContainer ) ] ;
77
82
const elIndex = siblings . indexOf ( el ) ;
78
83
79
84
if ( isKeypress ( event , Enter ) ) {
@@ -98,11 +103,11 @@ const HvSingleCalendar = ({
98
103
* @param currentDate - The array representing the date [YYYY, MM, DD].
99
104
* @memberOf Calendar
100
105
*/
101
- const renderCalendarDate = ( currentDate , index ) => {
106
+ const renderCalendarDate = ( currentDate ) => {
102
107
return (
103
108
< CalendarCell
104
109
classes = { classes }
105
- key = { index }
110
+ key = { currentDate }
106
111
tabIndex = { currentDate . getTime ( ) === firstDayOfCurrentMonthTime ? 0 : - 1 }
107
112
onChange = { handleChange }
108
113
onKeyDown = { handleKeyDown }
@@ -119,34 +124,6 @@ const HvSingleCalendar = ({
119
124
) ;
120
125
} ;
121
126
122
- const monthSelector = (
123
- < HvMonthSelector
124
- id = { id }
125
- locale = { locale }
126
- onChange = { onVisibleDateChange }
127
- onViewModeChange = { ( viewMode ) => setCalViewMode ( viewMode ) }
128
- visibleMonth = { visibleMonth || today . getMonth ( ) + 1 }
129
- rangeMode = { rangeMode }
130
- />
131
- ) ;
132
-
133
- const navigationAndCalendar = (
134
- < div className = "calendarWrapper" >
135
- < HvComposedNavigation
136
- id = { id }
137
- locale = { locale }
138
- onChange = { onVisibleDateChange }
139
- onViewModeChange = { ( viewMode ) => setCalViewMode ( viewMode ) }
140
- visibleYear = { visibleYear || today . getFullYear ( ) }
141
- visibleMonth = { visibleMonth || today . getMonth ( ) + 1 }
142
- />
143
- < div className = { classes . calendarGrid } aria-controls = { HvCalendarHeader ?. [ 0 ] ?. id } >
144
- < CalendarWeekLabels locale = { locale } />
145
- { calModel . dates . map ( renderCalendarDate ) }
146
- </ div >
147
- </ div >
148
- ) ;
149
-
150
127
return (
151
128
< div className = { clsx ( className , classes . calendarContainer ) } { ...others } >
152
129
< div id = { id } className = { classes . calendarWrapper } >
@@ -157,8 +134,32 @@ const HvSingleCalendar = ({
157
134
showEndDate = { showEndDate && ! isDateSelectionMode }
158
135
/>
159
136
< >
160
- { calViewMode === VIEW_MODE . CALENDAR && navigationAndCalendar }
161
- { calViewMode === VIEW_MODE . MONTHLY && monthSelector }
137
+ { calViewMode === VIEW_MODE . CALENDAR && (
138
+ < div >
139
+ < HvComposedNavigation
140
+ id = { id }
141
+ locale = { locale }
142
+ onChange = { onVisibleDateChange }
143
+ onViewModeChange = { ( viewMode ) => setCalViewMode ( viewMode ) }
144
+ visibleYear = { visibleYear || today . getFullYear ( ) }
145
+ visibleMonth = { visibleMonth || today . getMonth ( ) + 1 }
146
+ />
147
+ < div className = { classes . calendarGrid } aria-controls = { HvCalendarHeader ?. [ 0 ] ?. id } >
148
+ < CalendarWeekLabels labels = { listWeekdayNames } />
149
+ { calModel . dates . map ( renderCalendarDate ) }
150
+ </ div >
151
+ </ div >
152
+ ) }
153
+ { calViewMode === VIEW_MODE . MONTHLY && (
154
+ < HvMonthSelector
155
+ id = { id }
156
+ locale = { locale }
157
+ onChange = { onVisibleDateChange }
158
+ onViewModeChange = { ( viewMode ) => setCalViewMode ( viewMode ) }
159
+ visibleMonth = { visibleMonth || today . getMonth ( ) + 1 }
160
+ rangeMode = { rangeMode }
161
+ />
162
+ ) }
162
163
</ >
163
164
</ div >
164
165
</ div >
@@ -234,6 +235,7 @@ HvSingleCalendar.propTypes = {
234
235
* Styles applied to the cells when it is not part of the selection in progress.
235
236
*/
236
237
cellsOutsideRange : PropTypes . string ,
238
+ cellContainer : PropTypes . string ,
237
239
} ) . isRequired ,
238
240
/**
239
241
* Identifier.
0 commit comments