jimu-mobile
Version:
积木组件库助力移动端开发
326 lines (297 loc) • 9.71 kB
JavaScript
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Picker from '../picker/picker.js';
class TimeDefaultPicker extends Component {
constructor() {
super();
}
static propTypes = {
open: PropTypes.bool,
pickerAway: PropTypes.func,
len: PropTypes.number,
}
static defaultProps = {
textvalue: '时间组件按钮',
pickerAway () { },
pickerCancel () { },
open: false,
len: 7, // 展示天数
format: ['M月d日', '点', '分'],
delay: 15, // 与当前时间推迟()分钟后,开始计时
value: ['今天', '现在', ' '], // 默认数值
optOneArr: ['今天', '明天', '后天'], // 第一栏默认名称
nowText: '现在',
isShowNowText: false,
scale: 10, // 分钟刻度
}
componentWillMount () {
this.setInitState();
}
setInitState () {
let {
value, open, len, format, isShowNowText
} = this.props,
// delay 以后获取时间
dates = this.setDateFormat(new Date(), 'yyyy/MM/dd hh:mm'),
mopt = [],
nValue = value,
hopt = this._setInitHour(dates.datelist.h, true),
dopt = this._setInitData(dates.fmt, len);
if (isShowNowText) {
mopt = [''];
} else {
mopt = this._setInitMinutes(dates.datelist.m);
nValue = [dopt[0], hopt[0], mopt[0]];
}
// 设置默认显示参数
this.setState({
startData: dates.fmt,
value: nValue, // 默认数值 开始时间 、 结束时间
options: [dopt, hopt, mopt], // 初始数值
open,
});
}
// 设置初始日期展示
_setInitData (startDate, len) {
let self = this,
{
scale, format, delay, optOneArr,
} = this.props,
timestamp = new Date(startDate).getTime(),
dataArr = [];
this.isCrossDay = false
// 获取全部日期相关
this.allData = [];
// 判断是否跨天
let delayD = this.setDateFormat(new Date(), 'yyyy/MM/dd').datelist.d
let nowD = this.setDateFormat(new Date(), 'yyyy/MM/dd', { isDelay: false }).datelist.d
if (delayD != nowD) {
this.isCrossDay = true
}
for (let i = 0; i < len; i++) {
const tamp = timestamp + 24 * 60 * 60 * 1000 * i + 60 * 1000 * delay + 60 * 1000 * scale;
if (this.isCrossDay) { // 跨天
if (i < optOneArr.length - 1) {
dataArr.push(optOneArr[i + 1]);
} else {
dataArr.push(self.setDateFormat(new Date(parseInt(tamp)), format[0]).fmt);
}
} else {
if (i < optOneArr.length) {
dataArr.push(optOneArr[i]);
} else {
dataArr.push(self.setDateFormat(new Date(parseInt(tamp)), format[0]).fmt);
}
}
this.allData.push(self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/MM/dd').fmt);
// 判断是否跨天
}
return dataArr;
}
// 设置初始小时展示 isOnday 是否当天
_setInitHour (hour, isOnday) {
let {
format, scale, nowText, isShowNowText, delay,
} = this.props,
hourArr = [],
dates = this.setDateFormat(new Date(), 'yyyy/MM/dd hh:mm'),
gethour = isOnday ? dates.datelist.h : hour;
if (isOnday && isShowNowText) {
hourArr = [nowText]
}
for (let i = gethour; i < 24; i++) {
hourArr.push(i + format[1]);
}
return hourArr;
}
// 设置分钟展示
_setInitMinutes (minutes) {
let { scale, format } = this.props,
minutesArr = [];
for (let i = 0; i < 60; i++) {
// minutesArr.push(i + format[1])
if (!(i % scale)) {
let setMinutes = minutes + scale >= 60 ? 0 : minutes
if (setMinutes <= i) {
if (i < 10) { i = `0${i}`; }
minutesArr.push(i + format[2]);
}
}
}
return minutesArr;
}
// 设置delay 以后时间 日期格式化 yyyy-MM-dd hh:mm ; yyyy/MM/dd hh:mm
setDateFormat (nowdate, fmt, { isDelay = true } = {}) {
let { delay, scale } = this.props,
deleytamp = isDelay ? (new Date(nowdate).getTime() + 60 * 1000 * delay) : (new Date(nowdate).getTime()),
date = new Date(parseInt(deleytamp)),
o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
};
// 判断当前 delay 时间大于分钟最大刻度展示,小时+1
if (isDelay && date.getMinutes() + scale >= 60) {
deleytamp = new Date(nowdate).getTime() + 60 * 1000 * delay + 60 * 1000 * scale
date = new Date(parseInt(deleytamp))
o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
}
}
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length));
for (const k in o) {
if (new RegExp(`(${k})`).test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((`00${o[k]}`).substr((`${o[k]}`).length)));
}
return {
fmt,
datelist: {
y: date.getFullYear(),
M: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
m: date.getMinutes() >= 10 ? date.getMinutes() : `0${date.getMinutes()}`,
},
};
}
onClickAway () {
let { optOneArr, format, nowText, isShowNowText } = this.props,
{ value, options } = this.state,
dates = this.setDateFormat(new Date(), 'yyyy/MM/dd hh:mm', { isDelay: false }),
timestamp = new Date().getTime(),
ondate = value[0],
onhour = value[1],
onminute = value[2],
setValArr = value,
len = options[0].length,
dataString = '',
fmt,
setdataformat;
for (let i = 0; i < len; i++) {
const tamp = timestamp + 24 * 60 * 60 * 1000 * i;
if (this.isCrossDay) { // 跨天
if (options[0][i] === ondate) {
if (i < optOneArr.length) {
dataString += this.setDateFormat(new Date(parseInt(tamp)), 'yyyy/MM/dd').fmt;
} else {
dataString += this.allData[i];
}
}
} else {
if (options[0][i] === ondate) {
if (i < optOneArr.length) {
dataString += this.setDateFormat(new Date(parseInt(tamp)), 'yyyy/MM/dd').fmt;
} else {
dataString += this.allData[i];
}
}
}
}
if (onhour === nowText && isShowNowText) {
onhour = dates.datelist.h + format[1];
onminute = dates.datelist.m + format[2];
setValArr[2] = dates.datelist.m + format[2];
dataString = '';
fmt = new Date().getTime();
setdataformat = new Date();
} else {
dataString += ` ${onhour.split(format[1])[0]}:${onminute.split(format[2])[0]}`;
fmt = new Date(dataString).getTime();
setdataformat = new Date(dataString);
}
this.props.pickerAway && this.props.pickerAway([ondate, onhour, onminute], this.refs.pickertime, setValArr, {
fmt,
data: this.setDateFormat(setdataformat, 'yyyy/MM/dd hh:mm', { isDelay: false }).fmt,
});
}
onChange (val, text, listIndex) {
let { options, value } = this.state,
{ format, optOneArr, nowText, isShowNowText } = this.props,
days = options[0],
hours = options[1],
minutes = options[2],
setHours = hours,
setMinutes = minutes,
dates = this.setDateFormat(new Date(), 'yyyy/MM/dd hh:mm'),
onDay = value[0],
onHours = value[1],
onMinutes = value[2];
// 日期更改时
if (listIndex === 0) {
if (val === days[0]) {
setMinutes = [];
setHours = this._setInitHour(dates.datelist.h, true);
if (isShowNowText) {
onHours = nowText;
onMinutes = '';
} else {
onHours = setHours[0];
setMinutes = this._setInitMinutes(dates.datelist.m);
onMinutes = setMinutes[0];
}
} else {
setHours = this._setInitHour(0, false);
setMinutes = this._setInitMinutes(0);
onHours = `0${format[1]}`;
onMinutes = `00${format[2]}`;
}
onDay = val;
}
// 小时修改时
if (listIndex === 1) {
if (onDay === optOneArr[0] && val === nowText) {
setMinutes = [];
onMinutes = '';
} else if (onDay === optOneArr[0] && val === dates.datelist.h + format[1]) {
setMinutes = this._setInitMinutes(dates.datelist.m);
onMinutes = this._setInitMinutes(dates.datelist.m)[0];
} else {
onMinutes = `00${format[2]}`;
setMinutes = this._setInitMinutes(0);
}
onHours = val;
}
if (listIndex === 2) {
onMinutes = val;
}
this.setState({
value: [onDay, onHours, onMinutes],
options: [days, setHours, setMinutes],
});
}
onCancel () {
const { pickerCancel } = this.props;
pickerCancel && pickerCancel();
}
render () {
const { textvalue } = this.props;
return (
<div className="dataPicker">
<div className="pickertime" onClick={this._onClick.bind(this)} ref="pickertime">
{textvalue}
</div>
<Picker
ref="date_picker"
value={this.state.value}
options={this.state.options}
onChange={this.onChange.bind(this)}
onClickAway={this.onClickAway.bind(this)}
open={this.state.open}
onClickCancel={this.onCancel.bind(this)}
/>
</div>
);
}
_onClick () {
this.refs.date_picker.show();
}
show () {
this.refs.date_picker.show();
}
}
module.exports = TimeDefaultPicker;