Skip to content

Commit 3caa7c1

Browse files
committed
Merge pull request quri#3 from richard-lopes/master
Support for minDate and maxDate for months and years calendar.
2 parents 94a9af6 + f9cea5c commit 3caa7c1

File tree

7 files changed

+78
-16
lines changed

7 files changed

+78
-16
lines changed

examples/basic/basic.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,28 @@ class Basic extends Component {
133133
<pre> {'<DateTimeField mode="month" />'} </pre>
134134
</div>
135135
</div>
136+
<div className="row">
137+
<div className="col-xs-12">
138+
Month picker with min and max dates
139+
<DateTimeField
140+
mode="month"
141+
maxDate={moment().add(3, "months")}
142+
minDate={moment().subtract(3, "months")}
143+
/>
144+
<pre> {'<DateTimeField mode="month" maxDate={moment().add(3, "months")} minDate={moment().subtract(3, "months")/>'} </pre>
145+
</div>
146+
</div>
147+
<div className="row">
148+
<div className="col-xs-12">
149+
ViewMode set to years with min and max dates
150+
<DateTimeField
151+
maxDate={moment().add(1, "year")}
152+
minDate={moment().subtract(1, "year")}
153+
viewMode='years'
154+
/>
155+
<pre> {'<DateTimeField viewMode="years" maxDate={moment().add(1, "year")} minDate={moment().subtract(1, "year")}/>'} </pre>
156+
</div>
157+
</div>
136158
</div>
137159
);
138160
}

src/DateTimeField.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,6 @@ export default class DateTimeField extends Component {
307307
}, function() {
308308
this.closePicker();
309309
this.props.onChange(today);
310-
console.log(this.state.selectedDate)
311310
return this.setState({
312311
inputValue: this.state.selectedDate.format(this.resolvePropsInputFormat())
313312
});

src/DateTimePickerDate.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ export default class DateTimePickerDate extends Component {
124124
return (
125125
<DateTimePickerMonths
126126
addYear={this.props.addYear}
127+
maxDate={this.props.maxDate}
128+
minDate={this.props.minDate}
127129
selectedDate={this.props.selectedDate}
128130
setSelectedMonth={this.props.setSelectedMonth}
129131
setViewMonth={this.setViewMonth}
@@ -143,6 +145,8 @@ export default class DateTimePickerDate extends Component {
143145
return (
144146
<DateTimePickerYears
145147
addDecade={this.props.addDecade}
148+
maxDate={this.props.maxDate}
149+
minDate={this.props.minDate}
146150
selectedDate={this.props.selectedDate}
147151
setViewYear={this.setViewYear}
148152
subtractDecade={this.props.subtractDecade}

src/DateTimePickerMonths.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,28 @@ export default class DateTimePickerMonths extends Component {
1212
showYears: PropTypes.func.isRequired,
1313
setViewMonth: PropTypes.func.isRequired,
1414
setSelectedMonth: PropTypes.func.isRequired,
15+
minDate: PropTypes.object,
16+
maxDate: PropTypes.object,
1517
mode: PropTypes.oneOf([Constants.MODE_DATE, Constants.MODE_MONTH, Constants.MODE_DATETIME])
1618
}
1719

1820
renderMonths = () => {
19-
var classes, i, month, months, monthsShort;
21+
var classes, month, months, monthsShort, minDate, maxDate, currentMonth;
2022
const onClick = this.props.mode === Constants.MODE_MONTH ? this.props.setSelectedMonth : this.props.setViewMonth;
2123
month = this.props.selectedDate.month();
2224
monthsShort = moment.monthsShort();
23-
i = 0;
25+
minDate = this.props.minDate ? this.props.minDate.clone().subtract(1, "months") : this.props.minDate;
26+
maxDate = this.props.maxDate ? this.props.maxDate.clone() : this.props.maxDate;
2427
months = [];
25-
while (i < 12) {
28+
currentMonth = moment([this.props.viewDate.year(), 0, 1]);
29+
for (let i = 0; i < 12; i++) {
2630
classes = {
2731
month: true,
28-
"active": i === month && this.props.viewDate.year() === this.props.selectedDate.year()
32+
"active": i === month && this.props.viewDate.year() === this.props.selectedDate.year(),
33+
disabled: (minDate && currentMonth.isBefore(minDate)) || (maxDate && currentMonth.isAfter(maxDate))
2934
};
3035
months.push(<span className={classnames(classes)} key={i} onClick={onClick}>{monthsShort[i]}</span>);
31-
i++;
36+
currentMonth.add(1, "months");
3237
}
3338
return months;
3439
}

src/DateTimePickerYears.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,27 @@ export default class DateTimePickerYears extends Component {
77
addDecade: PropTypes.func.isRequired,
88
viewDate: PropTypes.object.isRequired,
99
selectedDate: PropTypes.object.isRequired,
10-
setViewYear: PropTypes.func.isRequired
10+
setViewYear: PropTypes.func.isRequired,
11+
minDate: PropTypes.object,
12+
maxDate: PropTypes.object
1113
}
1214

1315
renderYears = () => {
14-
var classes, i, year, years;
16+
var classes, year, years, minDate, maxDate;
17+
minDate = this.props.minDate ? this.props.minDate.clone() : this.props.minDate;
18+
maxDate = this.props.maxDate ? this.props.maxDate.clone() : this.props.maxDate;
1519
years = [];
1620
year = parseInt(this.props.viewDate.year() / 10, 10) * 10;
1721
year--;
18-
i = -1;
19-
while (i < 11) {
22+
for (let i = -1; i < 11; i++) {
2023
classes = {
2124
year: true,
2225
old: i === -1 | i === 10,
23-
active: this.props.selectedDate.year() === year
26+
active: this.props.selectedDate.year() === year,
27+
disabled: (minDate && year < minDate.year()) || (maxDate && year > maxDate.year())
2428
};
25-
years.push(<span className={classnames(classes)} key={year}onClick={this.props.setViewYear}>{year}</span>);
29+
years.push(<span className={classnames(classes)} key={year} onClick={this.props.setViewYear}>{year}</span>);
2630
year++;
27-
i++;
2831
}
2932
return years;
3033
}

src/__tests__/DateTimePickerMonths-test.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ describe("DateTimePickerMonths", function() {
2323
showYears={showYearsMock}
2424
subtractYear={subtractYearMock}
2525
viewDate={moment()}
26+
minDate={moment().subtract(1, "months")}
27+
maxDate={moment().add(1, "months")}
2628
setSelectedMonth={setSelectedMonthMock}
2729
mode={"date"}
2830
/>
@@ -108,6 +110,19 @@ describe("DateTimePickerMonths", function() {
108110
const active = TestUtils.scryRenderedDOMComponentsWithClass(months, "active");
109111
expect(active.length).toBe(0);
110112
});
111-
});
112113

114+
it("disable months outside the minDate / maxDate range", function() {
115+
const active = TestUtils.findRenderedDOMComponentWithClass(months, "active");
116+
const monthList = TestUtils.scryRenderedDOMComponentsWithClass(months, "month");
117+
const labels = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
118+
const currentMonth = labels.indexOf(active.textContent);
119+
let month;
120+
121+
monthList.forEach(item => {
122+
month = labels.indexOf(item.textContent);
123+
if (month < currentMonth -1 || month > currentMonth + 1) expect(item.className).toMatch(/disabled/);
124+
else expect(item.className).not.toMatch(/disabled/);
125+
});
126+
});
127+
});
113128
});

src/__tests__/DateTimePickerYears-test.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React from "react";
22
import TestUtils from "react-addons-test-utils";
33

4-
jest.dontMock("../DateTimePickerYears.js");
54
jest.dontMock("moment");
5+
jest.dontMock("../DateTimePickerYears.js");
66

77
describe("DateTimePickerYears", function() {
88
const moment = require("moment");
@@ -19,6 +19,8 @@ describe("DateTimePickerYears", function() {
1919
selectedDate={moment()}
2020
setViewYear={setViewYearMock}
2121
subtractDecade={subtractDecadeMock}
22+
minDate={moment().subtract(1, "years")}
23+
maxDate={moment().add(1, "years")}
2224
viewDate={moment()}
2325
/>
2426
);
@@ -80,6 +82,18 @@ describe("DateTimePickerYears", function() {
8082
const active = TestUtils.scryRenderedDOMComponentsWithClass(years, "active");
8183
expect(active.length).toBe(0);
8284
});
83-
});
8485

86+
it("disable years outside the minDate / maxDate range", function() {
87+
const active = TestUtils.findRenderedDOMComponentWithClass(years, "active");
88+
const yearList = TestUtils.scryRenderedDOMComponentsWithClass(years, "year");
89+
const currentYear = +active.textContent;
90+
let year;
91+
92+
yearList.forEach(item => {
93+
year = +item.textContent;
94+
if (year < currentYear -1 || year > currentYear + 1) expect(item.className).toMatch(/disabled/);
95+
else expect(item.className).not.toMatch(/disabled/);
96+
});
97+
});
98+
});
8599
});

0 commit comments

Comments
 (0)