Skip to content
This repository was archived by the owner on May 19, 2025. It is now read-only.

Commit f74599d

Browse files
committed
- highlight selected ranges
- add footerContent & headerContent to DefinedRanges
1 parent 1c5a973 commit f74599d

File tree

4 files changed

+100
-50
lines changed

4 files changed

+100
-50
lines changed

src/DateRange.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { Component } from 'react';
22
import PropTypes from 'prop-types';
33
import Calendar from './Calendar.js';
4+
import { rangeShape } from './DayCell';
45
import { findNextRangeIndex, generateStyles } from './utils.js';
56
import { isBefore, differenceInCalendarDays, addDays, min } from 'date-fns';
67
import classnames from 'classnames';
@@ -113,7 +114,7 @@ DateRange.propTypes = {
113114
onChange: PropTypes.func,
114115
onRangeFocusChange: PropTypes.func,
115116
className: PropTypes.string,
116-
ranges: Calendar.propTypes.ranges,
117+
ranges: PropTypes.arrayOf(rangeShape),
117118
moveRangeOnFirstSelection: PropTypes.bool,
118119
};
119120

src/DateRangePicker.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class DateRangePicker extends Component {
3636
onPreviewChange={value => {
3737
this.dateRange.updatePreview(value);
3838
}}
39+
focusedRangeIndex={focusedRangeIndex}
3940
className={undefined}
4041
/>
4142
<DateRange

src/DefinedRanges.js

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
33
import styles from './styles';
44
import { defaultInputRanges, defaultStaticRanges } from './defaultRanges';
55
import { rangeShape } from './DayCell';
6+
import cx from 'classnames';
67

78
class DefinedRanges extends Component {
89
constructor(props) {
@@ -12,23 +13,34 @@ class DefinedRanges extends Component {
1213
focusedInput: -1,
1314
};
1415
this.handleRangeChange = this.handleRangeChange.bind(this);
16+
this.checkIsSelected = this.checkIsSelected.bind(this);
1517
}
1618
handleRangeChange(range) {
1719
const { onChange } = this.props;
1820
onChange && onChange(range);
1921
}
22+
checkIsSelected(definedRange, ranges) {
23+
if (!definedRange.isSelected) return false;
24+
return ranges.some(range => definedRange.isSelected(range));
25+
}
2026
render() {
2127
const { onPreviewChange } = this.props;
28+
const validRanges = this.props.ranges.filter(
29+
item => item.startDate && item.endDate && !item.disabled
30+
);
2231
return (
2332
<div
2433
className={styles.definedRangesWrapper}
2534
onMouseLeave={() => {
2635
this.props.onPreviewChange && this.props.onPreviewChange();
2736
}}>
37+
{this.props.headerContent}
2838
<div className={styles.staticRanges}>
2939
{this.props.staticRanges.map((rangeOption, i) => (
3040
<button
31-
className={styles.staticRange}
41+
className={cx(styles.staticRange, {
42+
[styles.staticRangeSelected]: this.checkIsSelected(rangeOption, validRanges),
43+
})}
3244
key={i}
3345
onClick={() => this.handleRangeChange(rangeOption.range(this.props))}
3446
onFocus={() => onPreviewChange && onPreviewChange(rangeOption.range(this.props))}
@@ -49,17 +61,23 @@ class DefinedRanges extends Component {
4961
onChange={e => {
5062
let value = parseInt(e.target.value, 10);
5163
value = isNaN(value) ? 0 : Math.max(Math.min(99999, value), 0);
52-
this.setState({ rangeOffset: value });
5364
this.handleRangeChange(rangeOption.range(value, this.props));
5465
}}
5566
min={0}
5667
max={99999}
57-
value={this.state.focusedInput === i ? this.state.rangeOffset : 0}
58-
/>{' '}
68+
value={
69+
rangeOption.getCurrentValue
70+
? rangeOption.getCurrentValue(
71+
this.props.ranges[this.props.focusedRangeIndex] || {}
72+
)
73+
: '-'
74+
}
75+
/>
5976
<span className={styles.inputRangeLabel}>{rangeOption.label}</span>
6077
</div>
6178
))}
6279
</div>
80+
{this.props.footerContent}
6381
</div>
6482
);
6583
}
@@ -68,9 +86,12 @@ class DefinedRanges extends Component {
6886
DefinedRanges.propTypes = {
6987
inputRanges: PropTypes.array,
7088
staticRanges: PropTypes.array,
71-
range: rangeShape,
89+
ranges: PropTypes.arrayOf(rangeShape),
90+
focusedRangeIndex: PropTypes.number,
7291
onPreviewChange: PropTypes.func,
7392
onChange: PropTypes.func,
93+
footerContent: PropTypes.any,
94+
headerContent: PropTypes.any,
7495
};
7596

7697
DefinedRanges.defaultProps = {

src/defaultRanges.js

Lines changed: 71 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,88 +7,115 @@ import {
77
addMonths,
88
startOfWeek,
99
endOfWeek,
10+
isSameDay,
11+
differenceInCalendarDays,
1012
} from 'date-fns';
1113

14+
const defineds = {
15+
startOfWeek: startOfWeek(new Date()),
16+
endOfWeek: endOfWeek(new Date()),
17+
startOfLastWeek: startOfWeek(addDays(new Date(), -7)),
18+
endOfLastWeek: endOfWeek(addDays(new Date(), -7)),
19+
startOfToday: startOfDay(new Date()),
20+
endOfToday: endOfDay(new Date()),
21+
startOfYesterday: startOfDay(addDays(new Date(), -1)),
22+
endOfYesterday: endOfDay(addDays(new Date(), -1)),
23+
startOfMonth: startOfMonth(new Date()),
24+
endOfMonth: endOfMonth(new Date()),
25+
startOfLastMonth: startOfMonth(addMonths(new Date(), -1)),
26+
endOfLastMonth: endOfMonth(addMonths(new Date(), -1)),
27+
};
28+
1229
export const defaultStaticRanges = [
1330
{
1431
label: 'Today',
15-
range() {
16-
return {
17-
startDate: startOfDay(new Date()),
18-
endDate: endOfDay(new Date()),
19-
};
20-
},
32+
range: () => ({
33+
startDate: defineds.startOfToday,
34+
endDate: defineds.endOfToday,
35+
}),
36+
isSelected: range =>
37+
isSameDay(range.startDate, defineds.startOfToday) &&
38+
isSameDay(range.endDate, defineds.endOfToday),
2139
},
2240
{
2341
label: 'Yesterday',
24-
range() {
25-
const yesterday = addDays(new Date(), -1);
26-
return {
27-
startDate: startOfDay(yesterday),
28-
endDate: endOfDay(yesterday),
29-
};
30-
},
42+
range: () => ({
43+
startDate: defineds.startOfYesterday,
44+
endDate: defineds.endOfYesterday,
45+
}),
46+
isSelected: range =>
47+
isSameDay(range.startDate, defineds.startOfYesterday) &&
48+
isSameDay(range.endDate, defineds.endOfYesterday),
3149
},
3250

3351
{
3452
label: 'This Week',
35-
range() {
36-
return {
37-
startDate: startOfWeek(new Date()),
38-
endDate: endOfWeek(new Date()),
39-
};
40-
},
53+
range: () => ({
54+
startDate: defineds.startOfWeek,
55+
endDate: defineds.endOfWeek,
56+
}),
57+
isSelected: range =>
58+
isSameDay(range.startDate, defineds.startOfWeek) &&
59+
isSameDay(range.endDate, defineds.endOfWeek),
4160
},
4261
{
4362
label: 'Last Week',
44-
range() {
45-
const lastWeek = addDays(new Date(), -7);
46-
return {
47-
startDate: startOfWeek(lastWeek),
48-
endDate: endOfWeek(lastWeek),
49-
};
50-
},
63+
range: () => ({
64+
startDate: defineds.startOfLastWeek,
65+
endDate: defineds.endOfLastWeek,
66+
}),
67+
isSelected: range =>
68+
isSameDay(range.startDate, defineds.startOfLastWeek) &&
69+
isSameDay(range.endDate, defineds.endOfLastWeek),
5170
},
5271
{
5372
label: 'This Month',
54-
range() {
55-
return {
56-
startDate: startOfMonth(new Date()),
57-
endDate: endOfMonth(new Date()),
58-
};
59-
},
73+
range: () => ({
74+
startDate: defineds.startOfMonth,
75+
endDate: defineds.endOfMonth,
76+
}),
77+
isSelected: range =>
78+
isSameDay(range.startDate, defineds.startOfMonth) &&
79+
isSameDay(range.endDate, defineds.endOfMonth),
6080
},
6181
{
6282
label: 'Last Month',
63-
range() {
64-
const lastMonth = addMonths(new Date(), -1);
65-
return {
66-
startDate: startOfMonth(lastMonth),
67-
endDate: endOfMonth(lastMonth),
68-
};
69-
},
83+
range: () => ({
84+
startDate: defineds.startOfLastMonth,
85+
endDate: defineds.endOfLastMonth,
86+
}),
87+
isSelected: range =>
88+
isSameDay(range.startDate, defineds.startOfLastMonth) &&
89+
isSameDay(range.endDate, defineds.endOfLastMonth),
7090
},
7191
];
7292

7393
export const defaultInputRanges = [
7494
{
75-
label: 'days up today',
95+
label: 'days up to today',
7696
range(value) {
77-
const today = new Date();
7897
return {
79-
startDate: addDays(today, Number(value) * -1),
80-
endDate: today,
98+
startDate: addDays(defineds.startOfToday, Number(value) * -1),
99+
endDate: defineds.endOfToday,
81100
};
82101
},
102+
getCurrentValue(range) {
103+
if (!isSameDay(range.endDate, defineds.endOfToday)) return '-';
104+
return differenceInCalendarDays(defineds.endOfToday, range.startDate);
105+
},
83106
},
84107
{
85-
label: 'days up yesterday',
108+
label: 'days up to yesterday',
86109
range(value) {
87110
const today = new Date();
88111
return {
89112
startDate: today,
90113
endDate: addDays(today, Number(value)),
91114
};
92115
},
116+
getCurrentValue(range) {
117+
if (!isSameDay(range.startDate, defineds.startOfToday)) return '-';
118+
return differenceInCalendarDays(range.endDate, defineds.startOfToday);
119+
},
93120
},
94121
];

0 commit comments

Comments
 (0)