2024-03-16 14:11:43 +08:00

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