Skip to content

Commit c5297e4

Browse files
committed
refactor DefinedRange
1 parent 2e12cc4 commit c5297e4

File tree

8 files changed

+64
-50
lines changed

8 files changed

+64
-50
lines changed

demo/src/styles/main.css

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,8 @@
7373

7474
.PreviewArea{
7575
box-shadow: 1px 1px 81px rgba(41, 60, 74, 0.18);
76-
}
76+
}
77+
78+
.centered{
79+
margin: 0 auto;
80+
}

src/components/DateRange.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ class DateRange extends Component {
2323
calcNewSelection(value, isSingleValue = true) {
2424
const { focusedRange } = this.state;
2525
const { ranges, onChange, maxDate, moveRangeOnFirstSelection } = this.props;
26-
const selectedRangeIndex = focusedRange[0];
27-
const selectedRange = ranges[selectedRangeIndex];
26+
const focusedRangeIndex = focusedRange[0];
27+
const selectedRange = ranges[focusedRangeIndex];
2828
if (!selectedRange || !onChange) return {};
2929

3030
let { startDate, endDate } = selectedRange;
@@ -60,12 +60,15 @@ class DateRange extends Component {
6060
setSelection(value, isSingleValue) {
6161
const { onChange, ranges } = this.props;
6262
const { focusedRange } = this.state;
63-
const selectedRangeIndex = focusedRange[0];
64-
const selectedRange = ranges[selectedRangeIndex];
63+
const focusedRangeIndex = focusedRange[0];
64+
const selectedRange = ranges[focusedRangeIndex];
6565
if (!selectedRange) return;
6666
const newSelection = this.calcNewSelection(value, isSingleValue);
6767
onChange({
68-
[selectedRange.key || `range${selectedRangeIndex + 1}`]: newSelection.range,
68+
[selectedRange.key || `range${focusedRangeIndex + 1}`]: {
69+
...selectedRange,
70+
...newSelection.range,
71+
},
6972
});
7073
this.setState({
7174
focusedRange: newSelection.nextFocusRange,

src/components/DateRangePicker.js

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,26 @@
11
import React, { Component } from 'react';
22
import PropTypes from 'prop-types';
33
import DateRange from './DateRange';
4-
import DefinedRanges from './DefinedRanges';
4+
import DefinedRange from './DefinedRange';
55
import { findNextRangeIndex, generateStyles } from '../utils.js';
66
import classnames from 'classnames';
77
import coreStyles from '../styles';
88

99
class DateRangePicker extends Component {
1010
constructor(props) {
1111
super(props);
12-
this.handleChange = this.handleChange.bind(this);
1312
this.state = {
1413
focusedRange: [findNextRangeIndex(props.ranges), 0],
1514
};
1615
this.styles = generateStyles([coreStyles, props.classNames]);
1716
}
18-
handleChange(range) {
19-
const { focusedRange } = this.state;
20-
const { ranges, onChange } = this.props;
21-
const selectedRangeIndex = focusedRange[0];
22-
const selectedRange = ranges[selectedRangeIndex];
23-
if (!selectedRange || !onChange) return;
24-
onChange({
25-
[selectedRange.key || `range${selectedRangeIndex + 1}`]: range,
26-
});
27-
}
2817
render() {
2918
const focusedRangeIndex = this.state.focusedRange[0];
3019
return (
3120
<div className={classnames(this.styles.dateRangePickerWrapper, this.props.className)}>
32-
<DefinedRanges
21+
<DefinedRange
3322
{...this.props}
3423
range={this.props.ranges[focusedRangeIndex] || {}}
35-
onChange={this.handleChange}
3624
onPreviewChange={value => {
3725
this.dateRange.updatePreview(value);
3826
}}
@@ -56,7 +44,7 @@ DateRangePicker.defaultProps = {};
5644

5745
DateRangePicker.propTypes = {
5846
...DateRange.propTypes,
59-
...DefinedRanges.propTypes,
47+
...DefinedRange.propTypes,
6048
className: PropTypes.string,
6149
};
6250

src/components/DefinedRanges.js renamed to src/components/DefinedRange.js

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,55 @@ class DefinedRanges extends Component {
1515
this.handleRangeChange = this.handleRangeChange.bind(this);
1616
}
1717
handleRangeChange(range) {
18-
const { onChange } = this.props;
19-
onChange && onChange(range);
18+
const { onChange, ranges, focusedRangeIndex } = this.props;
19+
const selectedRange = ranges[focusedRangeIndex];
20+
if (!onChange || !selectedRange) return;
21+
onChange({
22+
[selectedRange.key || `range${focusedRangeIndex + 1}`]: { ...selectedRange, ...range },
23+
});
2024
}
21-
checkIsSelected(definedRange, ranges) {
22-
return ranges.some(range => definedRange.isSelected && definedRange.isSelected(range));
25+
getSelectedRange(ranges, staticRange) {
26+
const focusedRangeIndex = ranges.findIndex(range => {
27+
if (!range.startDate || !range.endDate || range.disabled) return false;
28+
return staticRange.isSelected(range);
29+
});
30+
const selectedRange = ranges[focusedRangeIndex];
31+
return { selectedRange, focusedRangeIndex };
2332
}
2433
render() {
25-
const { onPreviewChange } = this.props;
26-
const validRanges = this.props.ranges.filter(
27-
item => item.startDate && item.endDate && !item.disabled
28-
);
34+
const { onPreviewChange, ranges, rangeColors, className } = this.props;
2935
return (
3036
<div
31-
className={styles.definedRangesWrapper}
37+
className={cx(styles.definedRangesWrapper, className)}
3238
onMouseLeave={() => {
3339
this.props.onPreviewChange && this.props.onPreviewChange();
3440
}}>
3541
{this.props.headerContent}
3642
<div className={styles.staticRanges}>
37-
{this.props.staticRanges.map((rangeOption, i) => (
38-
<button
39-
className={cx(styles.staticRange, {
40-
[styles.staticRangeSelected]: this.checkIsSelected(rangeOption, validRanges),
41-
})}
42-
key={i}
43-
onClick={() => this.handleRangeChange(rangeOption.range(this.props))}
44-
onFocus={() => onPreviewChange && onPreviewChange(rangeOption.range(this.props))}
45-
onMouseOver={() => onPreviewChange && onPreviewChange(rangeOption.range(this.props))}>
46-
<span tabIndex={-1} className={styles.staticRangeLabel}>
47-
{rangeOption.label}
48-
</span>
49-
</button>
50-
))}
43+
{this.props.staticRanges.map((staticRange, i) => {
44+
const { selectedRange, focusedRangeIndex } = this.getSelectedRange(ranges, staticRange);
45+
return (
46+
<button
47+
className={cx(styles.staticRange, {
48+
[styles.staticRangeSelected]: Boolean(selectedRange),
49+
})}
50+
style={{
51+
color: selectedRange
52+
? selectedRange.color || rangeColors[focusedRangeIndex]
53+
: null,
54+
}}
55+
key={i}
56+
onClick={() => this.handleRangeChange(staticRange.range(this.props))}
57+
onFocus={() => onPreviewChange && onPreviewChange(staticRange.range(this.props))}
58+
onMouseOver={() =>
59+
onPreviewChange && onPreviewChange(staticRange.range(this.props))
60+
}>
61+
<span tabIndex={-1} className={styles.staticRangeLabel}>
62+
{staticRange.label}
63+
</span>
64+
</button>
65+
);
66+
})}
5167
</div>
5268
<div className={styles.inputRanges}>
5369
{this.props.inputRanges.map((rangeOption, i) => (
@@ -65,9 +81,7 @@ class DefinedRanges extends Component {
6581
max={99999}
6682
value={
6783
rangeOption.getCurrentValue
68-
? rangeOption.getCurrentValue(
69-
this.props.ranges[this.props.focusedRangeIndex] || {}
70-
)
84+
? rangeOption.getCurrentValue(ranges[this.props.focusedRangeIndex] || {})
7185
: '-'
7286
}
7387
/>
@@ -90,11 +104,16 @@ DefinedRanges.propTypes = {
90104
onChange: PropTypes.func,
91105
footerContent: PropTypes.any,
92106
headerContent: PropTypes.any,
107+
rangeColors: PropTypes.arrayOf(PropTypes.string),
108+
className: PropTypes.string,
93109
};
94110

95111
DefinedRanges.defaultProps = {
96112
inputRanges: defaultInputRanges,
97113
staticRanges: defaultStaticRanges,
114+
ranges: [],
115+
rangeColors: ['#3d91ff', '#3ecf8e', '#fed14c'],
116+
focusedRangeIndex: 0,
98117
};
99118

100119
export default DefinedRanges;
File renamed without changes.

src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export { default as DateRange } from './components/DateRange';
22
export { default as Calendar } from './components/Calendar';
33
export { default as DateRangePicker } from './components/DateRangePicker';
4-
export { default as DefinedRanges } from './components/DefinedRanges';
4+
export { default as DefinedRange } from './components/DefinedRange';
55
export { inputRanges, staticRanges, createStaticRanges } from './defaultRanges';

src/styles.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
@import 'components/dateRange.scss';
33
@import 'components/dayCell.scss';
44
@import 'components/dateRangePicker.scss';
5-
@import 'components/definedRanges.scss';
5+
@import 'components/definedRange.scss';

src/theme/default.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@
300300
border-right: solid 1px #eff2f7;
301301
background: #fff;
302302
.rdrStaticRangeSelected{
303-
color: #3d91ff;
303+
color: currentColor;
304304
font-weight: 600;
305305
}
306306
}

0 commit comments

Comments
 (0)