Skip to content

Commit f5e50f2

Browse files
authored
Merge pull request #2173 from zettca/fix/datepicker
refactor(datepicker): review performance. HVUIKIT-5642
2 parents 9ad4ba0 + 0297d34 commit f5e50f2

File tree

14 files changed

+715
-909
lines changed

14 files changed

+715
-909
lines changed

automation/robot/storybook/core/datePicker/_datePicker.resource

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ Resource ../_keywords.resource
33

44

55
*** Variables ***
6-
${apply} css:button[id*=apply]
6+
${apply} css:.HvActionBar-root>button:first-child
77
${calendar} css:.HvSingleCalendar-calendarWrapper
88
${calendarLeft} css:.HvCalendar-rangeCalendarContainer>div:first-child
99
${calendarRight} css:.HvCalendar-rangeCalendarContainer>div:last-child
10-
${cancel} css:button[id*=cancel]
10+
${cancel} css:.HvActionBar-root>button:last-child
1111
${datePickerHeader} css:.HvDatePicker-dropdown
1212
${day} xpath:(//button[@data-in-month='true'])
1313
${daySelected} css:.HvSingleCalendar-calendarDateSelected

packages/core/src/Calendar/CalendarCell/index.d.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/core/src/Calendar/CalendarCell/index.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/core/src/Calendar/CalendarCell/styles.js

Lines changed: 0 additions & 153 deletions
This file was deleted.

packages/core/src/Calendar/CalendarWeekLabels/CalendarWeekLabel.js renamed to packages/core/src/Calendar/CalendarWeekLabels/CalendarWeekLabels.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import React from "react";
22
import PropTypes from "prop-types";
33
import { withStyles } from "@material-ui/core";
4-
import { getWeekdayNamesList } from "../utils";
5-
import { REPRESENTATION_VALUES } from "../enums";
6-
import HvTypography from "../../Typography";
4+
import { HvTypography } from "../..";
75
import styles from "./styles";
86

9-
const HvCalendarWeekLabel = ({ classes, locale }) => {
10-
const listWeekdayNamesNarrow = getWeekdayNamesList(locale, REPRESENTATION_VALUES.NARROW);
11-
12-
return listWeekdayNamesNarrow.map((dayName, index) => {
7+
const HvCalendarWeekLabel = ({ classes, labels = [] }) => {
8+
return labels.map((dayName, index) => {
139
const key = `${dayName}-${index}`;
1410
return (
1511
<HvTypography variant="highlightText" className={classes.calendarDay} key={key}>
@@ -29,9 +25,9 @@ HvCalendarWeekLabel.propTypes = {
2925
*/
3026
id: PropTypes.string,
3127
/**
32-
* Locale to be used by the calendar.
28+
* Localized day of week labels.
3329
*/
34-
locale: PropTypes.string,
30+
labels: PropTypes.arrayOf(PropTypes.string),
3531
/**
3632
* Callback to define the input date.
3733
*/
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { default } from "./CalendarWeekLabel";
1+
export { default } from "./CalendarWeekLabels";
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { default } from "./CalendarWeekLabel";
1+
export { default } from "./CalendarWeekLabels";

packages/core/src/Calendar/CalendarCell/CalendarCell.js renamed to packages/core/src/Calendar/SingleCalendar/CalendarCell.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useRef } from "react";
22
import PropTypes from "prop-types";
33
import clsx from "clsx";
4-
import { withStyles } from "@material-ui/core";
4+
import useComputation from "../../utils/useComputation";
55
import {
66
getDateISO,
77
getFormattedDate,
@@ -11,7 +11,6 @@ import {
1111
checkIfDateIsDisabled,
1212
} from "../utils";
1313
import { HvTooltip, HvTypography } from "../..";
14-
import styles from "./styles";
1514

1615
const HvCalendarCell = ({
1716
classes,
@@ -29,6 +28,7 @@ const HvCalendarCell = ({
2928
...others
3029
}) => {
3130
const buttonEl = useRef(null);
31+
const [title, computeTitle] = useComputation(() => getFormattedDate(value, locale));
3232
const { startDate, endDate } = calendarValue;
3333
const isCellToday = isSameDay(value, today);
3434
const isCellSelected = isSameDay(calendarValue, value);
@@ -83,14 +83,15 @@ const HvCalendarCell = ({
8383
<HvTooltip
8484
key={getDateISO(value)}
8585
enterDelay={600}
86-
title={<HvTypography noWrap>{getFormattedDate(value, locale)}</HvTypography>}
86+
onOpen={computeTitle}
87+
title={title ? <HvTypography noWrap>{title}</HvTypography> : ""}
8788
>
8889
<div
8990
className={clsx(classes.dateWrapper, {
9091
[classes.cellsInRange]: inMonth && rangeMode && isSelecting,
9192
[classes.cellsOutsideRange]: rangeMode && !isSelecting,
9293
})}
93-
data-calendarCell="calendarCell"
94+
data-calendar-cell="calendarCell"
9495
>
9596
{renderDate()}
9697
</div>
@@ -141,4 +142,4 @@ HvCalendarCell.propTypes = {
141142
rangeMode: PropTypes.bool,
142143
};
143144

144-
export default withStyles(styles, { name: "HvCalendarCell" })(HvCalendarCell);
145+
export default HvCalendarCell;

packages/core/src/Calendar/SingleCalendar/SingleCalendar.js

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
/* eslint-disable jsx-a11y/no-noninteractive-tabindex */
22

3-
import React, { useState, useContext } from "react";
3+
import React, { useState, useContext, useMemo } from "react";
44
import PropTypes from "prop-types";
55
import { withStyles } from "@material-ui/core";
66
import clsx from "clsx";
77
import isNil from "lodash/isNil";
88
import { isKeypress, KeyboardCodes, setId } from "../../utils";
99
import styles from "./styles";
1010
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";
1313
import { generateCalendarModel } from "../model";
14-
import CalendarCell from "../CalendarCell";
14+
import CalendarCell from "./CalendarCell";
1515
import CalendarHeader from "../CalendarHeader";
1616
import CalendarWeekLabels from "../CalendarWeekLabels";
1717
import { HvComposedNavigation, HvMonthSelector } from "../CalendarNavigation";
@@ -51,6 +51,11 @@ const HvSingleCalendar = ({
5151
const firstDayOfCurrentMonth = new Date(calModel.year, calModel.month - 1, 1);
5252
const firstDayOfCurrentMonthTime = firstDayOfCurrentMonth.getTime();
5353

54+
const listWeekdayNames = useMemo(
55+
() => getWeekdayNamesList(locale, REPRESENTATION_VALUES.NARROW),
56+
[locale]
57+
);
58+
5459
const handleChange = (event, date) => {
5560
event?.preventDefault();
5661
onChange?.(event, date);
@@ -73,7 +78,7 @@ const HvSingleCalendar = ({
7378
// This code is very brittle and should be managed with the focus wrapper
7479
const el = document?.activeElement;
7580
const parent = el?.parentElement?.parentElement;
76-
const siblings = [...parent?.getElementsByClassName("HvCalendarCell-cellContainer")];
81+
const siblings = [...parent?.getElementsByClassName(classes.cellContainer)];
7782
const elIndex = siblings.indexOf(el);
7883

7984
if (isKeypress(event, Enter)) {
@@ -98,11 +103,11 @@ const HvSingleCalendar = ({
98103
* @param currentDate - The array representing the date [YYYY, MM, DD].
99104
* @memberOf Calendar
100105
*/
101-
const renderCalendarDate = (currentDate, index) => {
106+
const renderCalendarDate = (currentDate) => {
102107
return (
103108
<CalendarCell
104109
classes={classes}
105-
key={index}
110+
key={currentDate}
106111
tabIndex={currentDate.getTime() === firstDayOfCurrentMonthTime ? 0 : -1}
107112
onChange={handleChange}
108113
onKeyDown={handleKeyDown}
@@ -119,34 +124,6 @@ const HvSingleCalendar = ({
119124
);
120125
};
121126

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-
150127
return (
151128
<div className={clsx(className, classes.calendarContainer)} {...others}>
152129
<div id={id} className={classes.calendarWrapper}>
@@ -157,8 +134,32 @@ const HvSingleCalendar = ({
157134
showEndDate={showEndDate && !isDateSelectionMode}
158135
/>
159136
<>
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+
)}
162163
</>
163164
</div>
164165
</div>
@@ -234,6 +235,7 @@ HvSingleCalendar.propTypes = {
234235
* Styles applied to the cells when it is not part of the selection in progress.
235236
*/
236237
cellsOutsideRange: PropTypes.string,
238+
cellContainer: PropTypes.string,
237239
}).isRequired,
238240
/**
239241
* Identifier.

0 commit comments

Comments
 (0)