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