wf-react-day-picker 0.0.1-security → 2.653.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.

Potentially problematic release.


This version of wf-react-day-picker might be problematic. Click here for more details.

package/src/Helpers.js ADDED
@@ -0,0 +1,145 @@
1
+ import {clone} from './DateUtils';
2
+ import {getFirstDayOfWeek} from './LocaleUtils';
3
+ import defaultClassNames from './classNames';
4
+
5
+ export function cancelEvent(e) {
6
+ e.preventDefault();
7
+ e.stopPropagation();
8
+ }
9
+
10
+ export function getFirstDayOfMonth(d) {
11
+ return new Date(d.getFullYear(), d.getMonth(), 1);
12
+ }
13
+
14
+ export function getDaysInMonth(d) {
15
+ const resultDate = getFirstDayOfMonth(d);
16
+
17
+ resultDate.setMonth(resultDate.getMonth() + 1);
18
+ resultDate.setDate(resultDate.getDate() - 1);
19
+
20
+ return resultDate.getDate();
21
+ }
22
+
23
+ export function getModifiersFromProps(props) {
24
+ const modifiers = {...props.modifiers};
25
+ if (props.selectedDays) {
26
+ modifiers[props.classNames.selected] = props.selectedDays;
27
+ }
28
+ if (props.disabledDays) {
29
+ modifiers[props.classNames.disabled] = props.disabledDays;
30
+ }
31
+ return modifiers;
32
+ }
33
+
34
+ export function getFirstDayOfWeekFromProps(props) {
35
+ const {firstDayOfWeek, locale = 'en', localeUtils = {}} = props;
36
+ if (!isNaN(firstDayOfWeek)) {
37
+ return firstDayOfWeek;
38
+ }
39
+ if (localeUtils.getFirstDayOfWeek) {
40
+ return localeUtils.getFirstDayOfWeek(locale);
41
+ }
42
+ return 0;
43
+ }
44
+
45
+ export function isRangeOfDates(value) {
46
+ return !!(value && value.from && value.to);
47
+ }
48
+
49
+ export function getMonthsDiff(d1, d2) {
50
+ return (
51
+ d2.getMonth() - d1.getMonth() + 12 * (d2.getFullYear() - d1.getFullYear())
52
+ );
53
+ }
54
+
55
+ export function getWeekArray(
56
+ d,
57
+ firstDayOfWeek = getFirstDayOfWeek(),
58
+ fixedWeeks
59
+ ) {
60
+ const daysInMonth = getDaysInMonth(d);
61
+ const dayArray = [];
62
+
63
+ let week = [];
64
+ const weekArray = [];
65
+
66
+ for (let i = 1; i <= daysInMonth; i += 1) {
67
+ dayArray.push(new Date(d.getFullYear(), d.getMonth(), i));
68
+ }
69
+
70
+ dayArray.forEach((day) => {
71
+ if (week.length > 0 && day.getDay() === firstDayOfWeek) {
72
+ weekArray.push(week);
73
+ week = [];
74
+ }
75
+ week.push(day);
76
+ if (dayArray.indexOf(day) === dayArray.length - 1) {
77
+ weekArray.push(week);
78
+ }
79
+ });
80
+
81
+ // unshift days to start the first week
82
+ const firstWeek = weekArray[0];
83
+ for (let i = 7 - firstWeek.length; i > 0; i -= 1) {
84
+ const outsideDate = clone(firstWeek[0]);
85
+ outsideDate.setDate(firstWeek[0].getDate() - 1);
86
+ firstWeek.unshift(outsideDate);
87
+ }
88
+
89
+ // push days until the end of the last week
90
+ const lastWeek = weekArray[weekArray.length - 1];
91
+ for (let i = lastWeek.length; i < 7; i += 1) {
92
+ const outsideDate = clone(lastWeek[lastWeek.length - 1]);
93
+ outsideDate.setDate(lastWeek[lastWeek.length - 1].getDate() + 1);
94
+ lastWeek.push(outsideDate);
95
+ }
96
+
97
+ // add extra weeks to reach 6 weeks
98
+ if (fixedWeeks && weekArray.length < 6) {
99
+ let lastExtraWeek;
100
+
101
+ for (let i = weekArray.length; i < 6; i += 1) {
102
+ lastExtraWeek = weekArray[weekArray.length - 1];
103
+ const lastDay = lastExtraWeek[lastExtraWeek.length - 1];
104
+ const extraWeek = [];
105
+
106
+ for (let j = 0; j < 7; j += 1) {
107
+ const outsideDate = clone(lastDay);
108
+ outsideDate.setDate(lastDay.getDate() + j + 1);
109
+ extraWeek.push(outsideDate);
110
+ }
111
+
112
+ weekArray.push(extraWeek);
113
+ }
114
+ }
115
+
116
+ return weekArray;
117
+ }
118
+
119
+ export function startOfMonth(d) {
120
+ const newDate = clone(d);
121
+ newDate.setDate(1);
122
+ return newDate;
123
+ }
124
+
125
+ export function getDayNodes(node, classNames) {
126
+ let outsideClassName;
127
+ if (classNames === defaultClassNames) {
128
+ // When using CSS modules prefix the modifier as required by the BEM syntax
129
+ outsideClassName = `${classNames.day}--${classNames.outside}`;
130
+ } else {
131
+ outsideClassName = `${classNames.outside}`;
132
+ }
133
+ const dayQuery = classNames.day.replace(/ /g, '.');
134
+ const outsideDayQuery = outsideClassName.replace(/ /g, '.');
135
+ const selector = `.${dayQuery}:not(.${outsideDayQuery})`;
136
+ return node.querySelectorAll(selector);
137
+ }
138
+
139
+ export function nodeListToArray(nodeList) {
140
+ return Array.prototype.slice.call(nodeList, 0);
141
+ }
142
+
143
+ export function hasOwnProp(obj, prop) {
144
+ return Object.prototype.hasOwnProperty.call(obj, prop);
145
+ }
@@ -0,0 +1,59 @@
1
+ const WEEKDAYS_LONG = [
2
+ 'Sunday',
3
+ 'Monday',
4
+ 'Tuesday',
5
+ 'Wednesday',
6
+ 'Thursday',
7
+ 'Friday',
8
+ 'Saturday',
9
+ ];
10
+
11
+ const WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
12
+
13
+ const MONTHS = [
14
+ 'January',
15
+ 'February',
16
+ 'March',
17
+ 'April',
18
+ 'May',
19
+ 'June',
20
+ 'July',
21
+ 'August',
22
+ 'September',
23
+ 'October',
24
+ 'November',
25
+ 'December',
26
+ ];
27
+
28
+ export function formatDay(day) {
29
+ return day.toDateString();
30
+ }
31
+
32
+ export function formatMonthTitle(d) {
33
+ return `${MONTHS[d.getMonth()]} ${d.getFullYear()}`;
34
+ }
35
+
36
+ export function formatWeekdayShort(i) {
37
+ return WEEKDAYS_SHORT[i];
38
+ }
39
+
40
+ export function formatWeekdayLong(i) {
41
+ return WEEKDAYS_LONG[i];
42
+ }
43
+
44
+ export function getFirstDayOfWeek() {
45
+ return 0;
46
+ }
47
+
48
+ export function getMonths() {
49
+ return MONTHS;
50
+ }
51
+
52
+ export default {
53
+ formatDay,
54
+ formatMonthTitle,
55
+ formatWeekdayShort,
56
+ formatWeekdayLong,
57
+ getFirstDayOfWeek,
58
+ getMonths,
59
+ };
@@ -0,0 +1,72 @@
1
+ import {isDayAfter, isDayBefore, isDayInRange, isSameDay} from './DateUtils';
2
+ import {isRangeOfDates} from './Helpers';
3
+
4
+ /**
5
+ * Return `true` if a date matches the specified modifier.
6
+ *
7
+ * @export
8
+ * @param {Date} day
9
+ * @param {Any} modifier
10
+ * @return {Boolean}
11
+ */
12
+ export function dayMatchesModifier(day, modifier) {
13
+ if (!modifier) {
14
+ return false;
15
+ }
16
+ const arr = Array.isArray(modifier) ? modifier : [modifier];
17
+ return arr.some((mod) => {
18
+ if (!mod) {
19
+ return false;
20
+ }
21
+ if (mod instanceof Date) {
22
+ return isSameDay(day, mod);
23
+ }
24
+ if (isRangeOfDates(mod)) {
25
+ return isDayInRange(day, mod);
26
+ }
27
+ if (mod.after && mod.before && isDayAfter(mod.before, mod.after)) {
28
+ return isDayAfter(day, mod.after) && isDayBefore(day, mod.before);
29
+ }
30
+ if (
31
+ mod.after &&
32
+ mod.before &&
33
+ (isDayAfter(mod.after, mod.before) || isSameDay(mod.after, mod.before))
34
+ ) {
35
+ return isDayAfter(day, mod.after) || isDayBefore(day, mod.before);
36
+ }
37
+ if (mod.after) {
38
+ return isDayAfter(day, mod.after);
39
+ }
40
+ if (mod.before) {
41
+ return isDayBefore(day, mod.before);
42
+ }
43
+ if (mod.daysOfWeek) {
44
+ return mod.daysOfWeek.some((dayOfWeek) => day.getDay() === dayOfWeek);
45
+ }
46
+ if (typeof mod === 'function') {
47
+ return mod(day);
48
+ }
49
+ return false;
50
+ });
51
+ }
52
+
53
+ /**
54
+ * Return the modifiers matching the given day for the given
55
+ * object of modifiers.
56
+ *
57
+ * @export
58
+ * @param {Date} day
59
+ * @param {Object} [modifiersObj={}]
60
+ * @return {Array}
61
+ */
62
+ export function getModifiersForDay(day, modifiersObj = {}) {
63
+ return Object.keys(modifiersObj).reduce((modifiers, modifierName) => {
64
+ const value = modifiersObj[modifierName];
65
+ if (dayMatchesModifier(day, value)) {
66
+ modifiers.push(modifierName);
67
+ }
68
+ return modifiers;
69
+ }, []);
70
+ }
71
+
72
+ export default {dayMatchesModifier, getModifiersForDay};
package/src/Month.js ADDED
@@ -0,0 +1,218 @@
1
+ import React, {Component} from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import Weekdays from './Weekdays';
5
+ import Day from './Day';
6
+ import {ENTER} from './keys';
7
+
8
+ import * as ModifiersUtils from './ModifiersUtils';
9
+ import * as Helpers from './Helpers';
10
+ import * as DateUtils from './DateUtils';
11
+
12
+ export default class Month extends Component {
13
+ static propTypes = {
14
+ classNames: PropTypes.shape({
15
+ body: PropTypes.string.isRequired,
16
+ month: PropTypes.string.isRequired,
17
+ outside: PropTypes.string.isRequired,
18
+ today: PropTypes.string.isRequired,
19
+ week: PropTypes.string.isRequired,
20
+ }).isRequired,
21
+ tabIndex: PropTypes.number,
22
+
23
+ month: PropTypes.instanceOf(Date).isRequired,
24
+ months: PropTypes.arrayOf(PropTypes.node),
25
+
26
+ modifiersStyles: PropTypes.object,
27
+
28
+ showWeekDays: PropTypes.bool,
29
+ showOutsideDays: PropTypes.bool,
30
+
31
+ renderDay: PropTypes.func.isRequired,
32
+ renderWeek: PropTypes.func.isRequired,
33
+
34
+ captionElement: PropTypes.oneOfType([
35
+ PropTypes.element,
36
+ PropTypes.func,
37
+ PropTypes.instanceOf(React.Component),
38
+ ]).isRequired,
39
+ weekdayElement: PropTypes.oneOfType([
40
+ PropTypes.element,
41
+ PropTypes.func,
42
+ PropTypes.instanceOf(React.Component),
43
+ ]),
44
+
45
+ fixedWeeks: PropTypes.bool,
46
+ showWeekNumbers: PropTypes.bool,
47
+
48
+ locale: PropTypes.string.isRequired,
49
+ localeUtils: PropTypes.object.isRequired,
50
+ weekdaysLong: PropTypes.arrayOf(PropTypes.node),
51
+ weekdaysShort: PropTypes.arrayOf(PropTypes.node),
52
+ firstDayOfWeek: PropTypes.number.isRequired,
53
+
54
+ onCaptionClick: PropTypes.func,
55
+ onDayClick: PropTypes.func,
56
+ onDayFocus: PropTypes.func,
57
+ onDayKeyDown: PropTypes.func,
58
+ onDayMouseEnter: PropTypes.func,
59
+ onDayMouseLeave: PropTypes.func,
60
+ onDayMouseDown: PropTypes.func,
61
+ onDayMouseUp: PropTypes.func,
62
+ onDayTouchEnd: PropTypes.func,
63
+ onDayTouchStart: PropTypes.func,
64
+ onWeekClick: PropTypes.func,
65
+ };
66
+
67
+ renderDay = (day) => {
68
+ const monthNumber = this.props.month.getMonth();
69
+ const propModifiers = Helpers.getModifiersFromProps(this.props);
70
+ const dayModifiers = ModifiersUtils.getModifiersForDay(day, propModifiers);
71
+ if (
72
+ DateUtils.isSameDay(day, new Date()) &&
73
+ !Object.prototype.hasOwnProperty.call(
74
+ propModifiers,
75
+ this.props.classNames.today
76
+ )
77
+ ) {
78
+ dayModifiers.push(this.props.classNames.today);
79
+ }
80
+ if (day.getMonth() !== monthNumber) {
81
+ dayModifiers.push(this.props.classNames.outside);
82
+ }
83
+
84
+ const isOutside = day.getMonth() !== monthNumber;
85
+ let tabIndex = -1;
86
+ // Focus on the first day of the month
87
+ if (this.props.onDayClick && !isOutside && day.getDate() === 1) {
88
+ tabIndex = this.props.tabIndex; // eslint-disable-line prefer-destructuring
89
+ }
90
+ const key = `${day.getFullYear()}${day.getMonth()}${day.getDate()}`;
91
+ const modifiers = {};
92
+ dayModifiers.forEach((modifier) => {
93
+ modifiers[modifier] = true;
94
+ });
95
+
96
+ return (
97
+ <Day
98
+ key={`${isOutside ? 'outside-' : ''}${key}`}
99
+ classNames={this.props.classNames}
100
+ day={day}
101
+ modifiers={modifiers}
102
+ modifiersStyles={this.props.modifiersStyles}
103
+ empty={
104
+ isOutside && !this.props.showOutsideDays && !this.props.fixedWeeks
105
+ }
106
+ tabIndex={tabIndex}
107
+ ariaLabel={this.props.localeUtils.formatDay(day, this.props.locale)}
108
+ ariaDisabled={isOutside || dayModifiers.indexOf('disabled') > -1}
109
+ ariaSelected={dayModifiers.indexOf('selected') > -1}
110
+ onClick={this.props.onDayClick}
111
+ onFocus={this.props.onDayFocus}
112
+ onKeyDown={this.props.onDayKeyDown}
113
+ onMouseEnter={this.props.onDayMouseEnter}
114
+ onMouseLeave={this.props.onDayMouseLeave}
115
+ onMouseDown={this.props.onDayMouseDown}
116
+ onMouseUp={this.props.onDayMouseUp}
117
+ onTouchEnd={this.props.onDayTouchEnd}
118
+ onTouchStart={this.props.onDayTouchStart}
119
+ >
120
+ {this.props.renderDay(day, modifiers)}
121
+ </Day>
122
+ );
123
+ };
124
+
125
+ render() {
126
+ const {
127
+ classNames,
128
+
129
+ month,
130
+ months,
131
+
132
+ fixedWeeks,
133
+ captionElement,
134
+ weekdayElement,
135
+
136
+ locale,
137
+ localeUtils,
138
+ weekdaysLong,
139
+ weekdaysShort,
140
+ firstDayOfWeek,
141
+
142
+ onCaptionClick,
143
+
144
+ showWeekNumbers,
145
+ showWeekDays,
146
+ onWeekClick,
147
+ } = this.props;
148
+
149
+ const captionProps = {
150
+ date: month,
151
+ classNames,
152
+ months,
153
+ localeUtils,
154
+ locale,
155
+ onClick: onCaptionClick ? (e) => onCaptionClick(month, e) : undefined,
156
+ };
157
+ const caption = React.isValidElement(captionElement)
158
+ ? React.cloneElement(captionElement, captionProps)
159
+ : React.createElement(captionElement, captionProps);
160
+
161
+ const weeks = Helpers.getWeekArray(month, firstDayOfWeek, fixedWeeks);
162
+ return (
163
+ <div className={classNames.month} role="grid">
164
+ {caption}
165
+ {showWeekDays && (
166
+ <Weekdays
167
+ classNames={classNames}
168
+ weekdaysShort={weekdaysShort}
169
+ weekdaysLong={weekdaysLong}
170
+ firstDayOfWeek={firstDayOfWeek}
171
+ showWeekNumbers={showWeekNumbers}
172
+ locale={locale}
173
+ localeUtils={localeUtils}
174
+ weekdayElement={weekdayElement}
175
+ />
176
+ )}
177
+ <div className={classNames.body} role="rowgroup">
178
+ {weeks.map((week) => {
179
+ let weekNumber;
180
+ if (showWeekNumbers) {
181
+ weekNumber = DateUtils.getWeekNumber(week[6]);
182
+ }
183
+ return (
184
+ <div
185
+ key={week[0].getTime()}
186
+ className={classNames.week}
187
+ role="row"
188
+ >
189
+ {showWeekNumbers && (
190
+ <div
191
+ className={classNames.weekNumber}
192
+ tabIndex={0}
193
+ role="gridcell"
194
+ onClick={
195
+ onWeekClick
196
+ ? (e) => onWeekClick(weekNumber, week, e)
197
+ : undefined
198
+ }
199
+ onKeyUp={
200
+ onWeekClick
201
+ ? (e) =>
202
+ e.keyCode === ENTER &&
203
+ onWeekClick(weekNumber, week, e)
204
+ : undefined
205
+ }
206
+ >
207
+ {this.props.renderWeek(weekNumber, week, month)}
208
+ </div>
209
+ )}
210
+ {week.map(this.renderDay)}
211
+ </div>
212
+ );
213
+ })}
214
+ </div>
215
+ </div>
216
+ );
217
+ }
218
+ }
package/src/Navbar.js ADDED
@@ -0,0 +1,147 @@
1
+ import React, {Component} from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import defaultClassNames from './classNames';
5
+ import {SPACE, ENTER} from './keys';
6
+
7
+ export default class Navbar extends Component {
8
+ static defaultProps = {
9
+ classNames: defaultClassNames,
10
+ dir: 'ltr',
11
+ labels: {
12
+ previousMonth: 'Previous Month',
13
+ nextMonth: 'Next Month',
14
+ },
15
+ showPreviousButton: true,
16
+ showNextButton: true,
17
+ };
18
+
19
+ static propTypes = {
20
+ classNames: PropTypes.shape({
21
+ navBar: PropTypes.string.isRequired,
22
+ navButtonPrev: PropTypes.string.isRequired,
23
+ navButtonNext: PropTypes.string.isRequired,
24
+ }),
25
+ className: PropTypes.string,
26
+ showPreviousButton: PropTypes.bool,
27
+ showNextButton: PropTypes.bool,
28
+ onPreviousClick: PropTypes.func,
29
+ onNextClick: PropTypes.func,
30
+ dir: PropTypes.string,
31
+ labels: PropTypes.shape({
32
+ previousMonth: PropTypes.string.isRequired,
33
+ nextMonth: PropTypes.string.isRequired,
34
+ }),
35
+ };
36
+
37
+ shouldComponentUpdate(nextProps) {
38
+ return (
39
+ nextProps.labels !== this.props.labels ||
40
+ nextProps.dir !== this.props.dir ||
41
+ this.props.showPreviousButton !== nextProps.showPreviousButton ||
42
+ this.props.showNextButton !== nextProps.showNextButton
43
+ );
44
+ }
45
+
46
+ handleNextClick = () => {
47
+ if (this.props.onNextClick) {
48
+ this.props.onNextClick();
49
+ }
50
+ };
51
+
52
+ handlePreviousClick = () => {
53
+ if (this.props.onPreviousClick) {
54
+ this.props.onPreviousClick();
55
+ }
56
+ };
57
+
58
+ handleNextKeyDown = (e) => {
59
+ if (e.keyCode !== ENTER && e.keyCode !== SPACE) {
60
+ return;
61
+ }
62
+ e.preventDefault();
63
+ this.handleNextClick();
64
+ };
65
+
66
+ handlePreviousKeyDown = (e) => {
67
+ if (e.keyCode !== ENTER && e.keyCode !== SPACE) {
68
+ return;
69
+ }
70
+ e.preventDefault();
71
+ this.handlePreviousClick();
72
+ };
73
+
74
+ render() {
75
+ const {
76
+ classNames,
77
+ className,
78
+ showPreviousButton,
79
+ showNextButton,
80
+ labels,
81
+ dir,
82
+ } = this.props;
83
+
84
+ let previousClickHandler;
85
+ let nextClickHandler;
86
+ let previousKeyDownHandler;
87
+ let nextKeyDownHandler;
88
+ let shouldShowPrevious;
89
+ let shouldShowNext;
90
+
91
+ if (dir === 'rtl') {
92
+ previousClickHandler = this.handleNextClick;
93
+ nextClickHandler = this.handlePreviousClick;
94
+ previousKeyDownHandler = this.handleNextKeyDown;
95
+ nextKeyDownHandler = this.handlePreviousKeyDown;
96
+ shouldShowNext = showPreviousButton;
97
+ shouldShowPrevious = showNextButton;
98
+ } else {
99
+ previousClickHandler = this.handlePreviousClick;
100
+ nextClickHandler = this.handleNextClick;
101
+ previousKeyDownHandler = this.handlePreviousKeyDown;
102
+ nextKeyDownHandler = this.handleNextKeyDown;
103
+ shouldShowNext = showNextButton;
104
+ shouldShowPrevious = showPreviousButton;
105
+ }
106
+
107
+ const previousClassName = shouldShowPrevious
108
+ ? classNames.navButtonPrev
109
+ : `${classNames.navButtonPrev} ${classNames.navButtonInteractionDisabled}`;
110
+
111
+ const nextClassName = shouldShowNext
112
+ ? classNames.navButtonNext
113
+ : `${classNames.navButtonNext} ${classNames.navButtonInteractionDisabled}`;
114
+
115
+ const previousButton = (
116
+ <span
117
+ tabIndex="0"
118
+ role="button"
119
+ aria-label={labels.previousMonth}
120
+ key="previous"
121
+ className={previousClassName}
122
+ onKeyDown={shouldShowPrevious ? previousKeyDownHandler : undefined}
123
+ onClick={shouldShowPrevious ? previousClickHandler : undefined}
124
+ />
125
+ );
126
+
127
+ const nextButton = (
128
+ <span
129
+ tabIndex="0"
130
+ role="button"
131
+ aria-label={labels.nextMonth}
132
+ key="right"
133
+ className={nextClassName}
134
+ onKeyDown={shouldShowNext ? nextKeyDownHandler : undefined}
135
+ onClick={shouldShowNext ? nextClickHandler : undefined}
136
+ />
137
+ );
138
+
139
+ return (
140
+ <div className={className || classNames.navBar}>
141
+ {dir === 'rtl'
142
+ ? [nextButton, previousButton]
143
+ : [previousButton, nextButton]}
144
+ </div>
145
+ );
146
+ }
147
+ }
package/src/Weekday.js ADDED
@@ -0,0 +1,45 @@
1
+ import React, {Component} from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ export default class Weekday extends Component {
5
+ static propTypes = {
6
+ weekday: PropTypes.number,
7
+ className: PropTypes.string,
8
+ locale: PropTypes.string,
9
+ localeUtils: PropTypes.object,
10
+
11
+ weekdaysLong: PropTypes.arrayOf(PropTypes.string),
12
+ weekdaysShort: PropTypes.arrayOf(PropTypes.string),
13
+ };
14
+ shouldComponentUpdate(nextProps) {
15
+ return this.props !== nextProps;
16
+ }
17
+ render() {
18
+ const {
19
+ weekday,
20
+ className,
21
+ weekdaysLong,
22
+ weekdaysShort,
23
+ localeUtils,
24
+ locale,
25
+ } = this.props;
26
+ let title;
27
+ if (weekdaysLong) {
28
+ title = weekdaysLong[weekday];
29
+ } else {
30
+ title = localeUtils.formatWeekdayLong(weekday, locale);
31
+ }
32
+ let content;
33
+ if (weekdaysShort) {
34
+ content = weekdaysShort[weekday];
35
+ } else {
36
+ content = localeUtils.formatWeekdayShort(weekday, locale);
37
+ }
38
+
39
+ return (
40
+ <div className={className} role="columnheader">
41
+ <abbr title={title}>{content}</abbr>
42
+ </div>
43
+ );
44
+ }
45
+ }