176 lines
5.0 KiB
JavaScript
176 lines
5.0 KiB
JavaScript
import React from 'react';
|
|
import { range, isLeapYear, convert2Digit } from '../../common/utils';
|
|
import { noop } from '../../common/utils/fns';
|
|
import { Scrollpicker } from '../Scrollpicker';
|
|
export class Datepicker extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.handleChange = (index1, index2) => {
|
|
const { list, value } = this.state;
|
|
let newList = [...list];
|
|
let newValue = [...value];
|
|
newValue[index1] = index2;
|
|
let year;
|
|
let month;
|
|
let day;
|
|
let days;
|
|
if (index1 === 0) {
|
|
year = list[index1][index2];
|
|
month = list[1][value[1]];
|
|
}
|
|
if (index1 === 1) {
|
|
year = list[0][value[0]];
|
|
month = list[index1][index2];
|
|
}
|
|
if (index1 === 2) {
|
|
year = list[0][value[0]];
|
|
month = list[1][value[1]];
|
|
}
|
|
days = this.getDays(year, month);
|
|
newList[2] = days;
|
|
day = list[2][value[2]];
|
|
if (days.indexOf(day) === -1) {
|
|
newValue[2] = days.length - 1;
|
|
}
|
|
this.setState({
|
|
list: newList,
|
|
value: newValue
|
|
});
|
|
const date = this.getDateByIndex(newList, newValue);
|
|
this.props.onChange && this.props.onChange(date);
|
|
};
|
|
const data = this.initialize(props);
|
|
this.state = {
|
|
...data
|
|
};
|
|
}
|
|
initialize(props) {
|
|
let { startYear, numberOfYears, date } = props;
|
|
const years = range(numberOfYears).map((item, index) => {
|
|
return Number(startYear) + index;
|
|
});
|
|
const months = range(12).map(i => {
|
|
return i + 1;
|
|
});
|
|
const input = this.getDateInputByString(date);
|
|
if (!input) {
|
|
date = new Date();
|
|
}
|
|
else {
|
|
date = new Date(input[0], input[1], input[2]);
|
|
}
|
|
const year = date.getFullYear();
|
|
const month = date.getMonth() + 1;
|
|
const day = date.getDate();
|
|
const days = this.getDays(year, month);
|
|
const list = [years, months, days];
|
|
const value = [
|
|
years.indexOf(year),
|
|
months.indexOf(month),
|
|
days.indexOf(day)
|
|
];
|
|
return {
|
|
list,
|
|
value
|
|
};
|
|
}
|
|
getDateInputByString(param) {
|
|
if (!param) {
|
|
return null;
|
|
}
|
|
let input = param.split('-');
|
|
if (input.length !== 3) {
|
|
return null;
|
|
}
|
|
input = input.map((item) => {
|
|
return Number(item);
|
|
});
|
|
input[1] = input[1] - 1;
|
|
const invalid = input.some((item) => {
|
|
if (isNaN(item) || item < 0) {
|
|
return true;
|
|
}
|
|
});
|
|
if (invalid) {
|
|
return null;
|
|
}
|
|
return input;
|
|
}
|
|
getDays(year, month) {
|
|
year = parseInt(year, 10);
|
|
month = parseInt(month, 10);
|
|
let dayNum = 0;
|
|
switch (month) {
|
|
case 1:
|
|
case 3:
|
|
case 5:
|
|
case 7:
|
|
case 8:
|
|
case 10:
|
|
case 12:
|
|
dayNum = 31;
|
|
break;
|
|
case 4:
|
|
case 6:
|
|
case 9:
|
|
case 11:
|
|
dayNum = 30;
|
|
break;
|
|
case 2:
|
|
dayNum = isLeapYear(year) ? 29 : 28;
|
|
break;
|
|
}
|
|
const days = range(dayNum).map(i => {
|
|
return i + 1;
|
|
});
|
|
return days;
|
|
}
|
|
componentWillReceiveProps(nextProps) {
|
|
if (nextProps.date !== this.props) {
|
|
this.setState({
|
|
...this.initialize(nextProps)
|
|
});
|
|
}
|
|
}
|
|
getViewList(list) {
|
|
return list.map((item, index) => {
|
|
let tmp = [];
|
|
if (index === 0) {
|
|
tmp = item.map(target => {
|
|
return target + '年';
|
|
});
|
|
}
|
|
if (index === 1) {
|
|
tmp = item.map(target => {
|
|
return target + '月';
|
|
});
|
|
}
|
|
if (index === 2) {
|
|
tmp = item.map(target => {
|
|
return target + '日';
|
|
});
|
|
}
|
|
return tmp;
|
|
});
|
|
}
|
|
getDateByIndex(list, value) {
|
|
const ret = list.map((item, index) => {
|
|
return convert2Digit(item[value[index]]);
|
|
});
|
|
return ret.join('-');
|
|
}
|
|
render() {
|
|
const { proportion } = this.props;
|
|
const { list, value } = this.state;
|
|
const viewList = this.getViewList(list);
|
|
return (React.createElement(Scrollpicker, Object.assign({}, this.props, { list: viewList, value: value, onChange: this.handleChange })));
|
|
}
|
|
}
|
|
Datepicker.defaultProps = {
|
|
startYear: 2018,
|
|
numberOfYears: 10,
|
|
date: 'undefined',
|
|
onChange: noop,
|
|
proportion: [2, 1, 1]
|
|
};
|
|
//# sourceMappingURL=index.js.map
|