UNPKG

jimu-mobile

Version:

积木组件库助力移动端开发

506 lines (432 loc) 17.5 kB
'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _class, _temp; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _picker = require('../picker/picker.js'); var _picker2 = _interopRequireDefault(_picker); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var DateTimePicker = (_temp = _class = function (_Component) { _inherits(DateTimePicker, _Component); function DateTimePicker() { _classCallCheck(this, DateTimePicker); return _possibleConstructorReturn(this, (DateTimePicker.__proto__ || Object.getPrototypeOf(DateTimePicker)).call(this)); } _createClass(DateTimePicker, [{ key: 'componentWillMount', value: function componentWillMount() { this.setInitState(); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { this.setInitState(); } }, { key: 'setInitState', value: function setInitState() { var _props = this.props, startData = _props.startData, endData = _props.endData, defaultData = _props.defaultData, scale = _props.scale, format = _props.format, open = _props.open, nameFormatBool = _props.nameFormatBool, dates = this.setDateFormat(defaultData, 'yyyy/MM/dd hh:mm'), onDataTime = this._getTimeRound(defaultData, scale), startDateTime = this._getTimeRound(startData, scale), endDateTime = this._getTimeRound(endData, scale), len = this._getDayDiff(endDateTime.split(' ')[0], startDateTime.split(' ')[0]), onDataArr = this.setDateFormat(onDataTime, 'yyyy/MM/dd hh:mm'), startDateArr = this.setDateFormat(startDateTime, 'yyyy/MM/dd hh:mm'), endDateArr = this.setDateFormat(endDateTime, 'yyyy/MM/dd hh:mm'), getHoverOver = this._checkHourOver(onDataArr, startDateArr, endDateArr), startMinutes = 0, endMinutes = 59, nowdate = this._getDataTime(), tomorrow = this._tomorrowData(), valueFirst = this.setDateFormat(onDataTime, 'yyyy/M/d').fmt, setValueFirst = '' + this.setDateFormat(onDataTime, format[0]).fmt; if (nameFormatBool) { if (valueFirst == nowdate) { setValueFirst = '今天'; } else if (valueFirst == tomorrow) { setValueFirst = '明天'; } } // 设置起始的分钟数 if (onDataTime.split(':')[0] == startDateTime.split(':')[0]) { startMinutes = startDateArr.datelist.m; } if (onDataTime.split(':')[0] == endDateTime.split(':')[0]) { endMinutes = endDateArr.datelist.m; } this.setState({ open: open, onDataTime: onDataTime, startDateTime: startDateTime, endDateTime: endDateTime, len: len, onDataArr: onDataArr, startDateArr: startDateArr, endDateArr: endDateArr, value: [setValueFirst, '' + onDataArr.datelist.h + format[1], '' + onDataArr.datelist.m + format[2]], // 默认数值 开始时间 、 结束时间 options: [this._setInitData(startDateArr.fmt, len), this._setInitHour(getHoverOver.starthour, getHoverOver.endhour), this._setInitMinutes(startMinutes, endMinutes)] // 初始数值 }); } // 判断小时展示范围 }, { key: '_checkHourOver', value: function _checkHourOver(onDataArr, startDate, endDate) { var starthour = 0, endhour = 23; // 判断当前日期是否是起始日期 if (onDataArr.datelist.y == startDate.datelist.y && onDataArr.datelist.M == startDate.datelist.M && onDataArr.datelist.d == startDate.datelist.d) { starthour = startDate.datelist.h; } // 判断当前日期是否是结束日期 if (onDataArr.datelist.y == endDate.datelist.y && onDataArr.datelist.M == endDate.datelist.M && onDataArr.datelist.d == endDate.datelist.d) { endhour = endDate.datelist.h; } return { starthour: starthour, endhour: endhour }; } // 获取两个区间日期 direction :before 获取开始日期,after 获取结束日期 }, { key: '_getDataDiff', value: function _getDataDiff(onData, sectionMinutes, direction) { var scale = this.props.scale, timestamp = new Date(onData).getTime(), diffTamp = sectionMinutes * 1000 * 60, diffDate = direction == 'after' ? timestamp + diffTamp : timestamp - diffTamp, date = new Date(parseInt(diffDate)), setMinutes = date.getMinutes(); for (var i = setMinutes, max = setMinutes + scale; i <= max; i++) { if (!(i % scale)) { setMinutes = i >= 60 ? i - 60 : i; } } return date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate() + ' ' + date.getHours() + ':' + setMinutes; } // 当前日期取整 upward 是否向上取值 }, { key: '_getTimeRound', value: function _getTimeRound(time, scale) { var upward = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var onMinutes = Number(time.split(':')[1]), timestamp = new Date(time).getTime(), scaleMinutes = onMinutes, diffTamp = 0, isback = true; if (upward) { for (var i = onMinutes, max = onMinutes + scale; i <= max; i++) { if (!(i % scale) && isback) { scaleMinutes = i; isback = false; } } } else { for (var i = onMinutes, min = onMinutes - scale; i >= min; i--) { if (!(i % scale) && isback) { scaleMinutes = i; isback = false; } } } diffTamp = (scaleMinutes - onMinutes) * 1000 * 60; var date = new Date(parseInt(timestamp + diffTamp)); return date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate() + ' ' + date.getHours() + ':' + date.getMinutes(); } // 查看两个日期间隔几天 startDate、endDate 格式 如:2017/8/2 }, { key: '_getDayDiff', value: function _getDayDiff(startDate, endDate) { var startTime = new Date(Date.parse(startDate)).getTime(), endTime = new Date(Date.parse(endDate)).getTime(), dates = Math.abs(startTime - endTime) / (1000 * 60 * 60 * 24); return dates; } // 设置初始日期展示 }, { key: '_setInitData', value: function _setInitData(startDate, len) { var self = this, _props2 = this.props, format = _props2.format, delay = _props2.delay, nameFormatBool = _props2.nameFormatBool, timestamp = new Date(startDate).getTime(), dataArr = [], nowdate = this._getDataTime(), tomorrow = this._tomorrowData(); this.dataTimeArr = []; for (var i = 0; i <= len; i++) { var tamp = timestamp + 24 * 60 * 60 * 1000 * i; if (nameFormatBool) { if (nowdate == self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/M/d').fmt) { dataArr.push('今天'); } else if (tomorrow == self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/M/d').fmt) { dataArr.push('明天'); } else { dataArr.push(self.setDateFormat(new Date(parseInt(tamp)), format[0]).fmt); } } else { dataArr.push(self.setDateFormat(new Date(parseInt(tamp)), format[0]).fmt); } this.dataTimeArr.push(self.setDateFormat(new Date(parseInt(tamp)), 'yyyy/MM/dd').fmt); } return dataArr; } // 设置初始小时展示 }, { key: '_setInitHour', value: function _setInitHour(starthour, endhour) { var self = this, _props3 = this.props, value = _props3.value, format = _props3.format, scale = _props3.scale, hourArr = [], deleytamp = new Date().getTime() + 60 * 1000 * scale, date = new Date(parseInt(deleytamp)), dates = this.setDateFormat(date, 'yyyy/MM/dd hh:mm'), gethour = starthour; for (var i = gethour; i <= endhour; i++) { hourArr.push(i + format[1]); } return hourArr; } // 设置初始小时展示 }, { key: '_setInitMinutes', value: function _setInitMinutes(minutes, end) { var self = this, _props4 = this.props, scale = _props4.scale, value = _props4.value, format = _props4.format, minutesArr = []; for (var i = 0; i <= end; i++) { // minutesArr.push(i + format[1]) if (!(i % scale)) { if (minutes <= i) { minutesArr.push(i + format[2]); } } } minutesArr = minutesArr.length == 0 ? ['0' + format[2]] : minutesArr; return minutesArr; } // 设置delay 以后时间 日期格式化 yyyy-MM-dd hh:mm ; yyyy/MM/dd hh:mm }, { key: 'setDateFormat', value: function setDateFormat(nowdate, fmt) { var deleytamp = 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() // 秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); for (var 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: fmt, datelist: { y: date.getFullYear(), M: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), m: date.getMinutes() } }; } // 获取当前日期 }, { key: '_tomorrowData', value: function _tomorrowData() { var deleytamp = new Date().getTime() + 24 * 60 * 60 * 1000, d = new Date(parseInt(deleytamp)); return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate(); } // 获取当前日期 }, { key: '_getDataTime', value: function _getDataTime() { var d = new Date(); return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate(); } }, { key: 'onClickAway', value: function onClickAway() { var format = this.props.format, _state = this.state, value = _state.value, onDataTime = _state.onDataTime, fmt = new Date(onDataTime).getTime(); this.props.pickerAway && this.props.pickerAway(value, onDataTime, this.refs.pickertime, { fmt: fmt, data: onDataTime }); } // 字符串删除单位 }, { key: '_deleteStrUnit', value: function _deleteStrUnit(string, unit) { return string.split(unit)[0]; } }, { key: 'onChange', value: function onChange(val, text, listIndex) { var format = this.props.format, _state2 = this.state, options = _state2.options, value = _state2.value, len = _state2.len, startDateArr = _state2.startDateArr, endDateArr = _state2.endDateArr, startDateTime = _state2.startDateTime, endDateTime = _state2.endDateTime, onDataTime = _state2.onDataTime, day = options[0], hours = options[1], minutes = options[2], setHour = hours, setMinute = minutes, onDay = value[0], onHours = value[1], onMinutes = value[2]; // 日期更改时 if (listIndex === 0) { onDay = val; // 开始日期 if (onDay == day[0]) { var getHour = this._deleteStrUnit(onHours, format[1]); // 判断小时是否在开始范围内 setHour = this._setInitHour(startDateArr.datelist.h, 23); if (getHour < startDateArr.datelist.h) { onHours = startDateArr.datelist.h + format[1]; } } // 结束日期 if (onDay == day[len]) { var _getHour = this._deleteStrUnit(onHours, format[1]); setHour = this._setInitHour(0, endDateArr.datelist.h); if (_getHour > endDateArr.datelist.h) { onHours = endDateArr.datelist.h + format[1]; } } if (onDay !== day[0] && onDay !== day[len]) { setHour = this._setInitHour(0, 23); } } // 小时修改时 if (listIndex === 1) { onHours = val; } if (listIndex === 2) { onMinutes = val; } // 开始日期 if (onDay == day[0] && onHours == setHour[0]) { var getMinute = this._deleteStrUnit(onMinutes, format[2]), endMinutes = startDateTime.split(':')[0] == endDateTime.split(':')[0] ? endDateArr.datelist.m : 59; // 判断分钟是否在开始范围内 setMinute = this._setInitMinutes(startDateArr.datelist.m, endMinutes); if (getMinute < Number(startDateArr.datelist.m)) { onMinutes = startDateArr.datelist.m + format[2]; } } // 结束日期 else if (onDay == day[len] && this._deleteStrUnit(onHours, format[1]) == endDateArr.datelist.h) { var _getMinute = this._deleteStrUnit(onMinutes, format[2]); // 判断分钟是否在开始范围内 setMinute = this._setInitMinutes(0, endDateArr.datelist.m); if (_getMinute > Number(endDateArr.datelist.m)) { onMinutes = endDateArr.datelist.m + format[2]; } } else { setMinute = this._setInitMinutes(0, 59); } // 设置日期 for (var i = day.length - 1; i >= 0; i--) { if (day[i] == onDay) { onDataTime = this.dataTimeArr[i] + ' ' + this._deleteStrUnit(onHours, format[1]) + ':' + this._deleteStrUnit(onMinutes, format[2]); } } this.setState({ onDataTime: onDataTime, value: [onDay, onHours, onMinutes], options: [day, setHour, setMinute] }); } }, { key: 'render', value: function render() { var textvalue = this.props.textvalue; return _react2.default.createElement( 'div', { className: 'dataPicker' }, _react2.default.createElement( 'div', { className: 'pickertime', onClick: this._onClick.bind(this), ref: 'pickertime' }, textvalue ), _react2.default.createElement(_picker2.default, { 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, titleName: this.props.titleName }) ); } }, { key: '_onClick', value: function _onClick() { this._showFunc(); } }, { key: 'show', value: function show() { this._showFunc(); } }, { key: '_showFunc', value: function _showFunc() { this.setInitState(); this.refs.date_picker.show(); } }]); return DateTimePicker; }(_react.Component), _class.propTypes = { open: _propTypes2.default.bool, pickerAway: _propTypes2.default.func, len: _propTypes2.default.number }, _class.defaultProps = { textvalue: '时间组件按钮', pickerAway: function pickerAway() {}, open: false, format: ['yyyy年MM月dd日', '点', '分'], startData: '2017/12/21 23:55', endData: '2018/1/8 01:20', defaultData: '2017/12/31 23:55', scale: 5, // 分钟刻度 titleName: '当前时间', // title nameFormatBool: true // 日期显示格式 }, _temp); module.exports = DateTimePicker;