UNPKG

tsp-component

Version:

提供多端和react版本的UI组件

319 lines (318 loc) 15 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); import * as React from 'react'; import view from '../picker/view'; import { createYearArray, createMinutesAndSecondsArray, createHoursArray, createMonthArray, getDaysInMonth, getDefaultValue, valueFormat, getTodayDate } from '../util/date'; import PickerCore from '../picker/core'; var prefix = 'tsp-component-Picker'; function formatLabel(selected) { var label = ''; for (var i = 0; i < selected.length; i++) { var value = selected[i].value; if (i < 2) { label += value + '-'; } else if (i === 3) { label += ' ' + value; } else if (i === 4) { label += ':' + value; } else { label += value; } } return label; } var DatePicker = (function (_super) { __extends(DatePicker, _super); function DatePicker(props, state) { var _this = _super.call(this, props, state) || this; _this.onPanStart = _this.onPanStart.bind(_this); _this.onPan = _this.onPan.bind(_this); _this.onPanEnd = _this.onPanEnd.bind(_this); _this.onOk = _this.onOk.bind(_this); _this.onCancel = _this.onCancel.bind(_this); _this.onOpen = _this.onOpen.bind(_this); _this.onTransitionEnd = _this.onTransitionEnd.bind(_this); return _this; } DatePicker.prototype.shouldComponentUpdate = function (nextProps) { return this.props.updateId !== nextProps.updateId; }; DatePicker.prototype.componentDidMount = function () { var value = this.props.defaultValue.slice(0, 5).map(function (item) { return item.value; }).join(''); var startDate = this.props.startDate.join(''); var endDate = this.props.endDate.join(''); if (value < startDate && this.props.enableStartDate) { console.error('value设定值不能小于startDate的设定值'); return; } if (value > endDate && this.props.enableEndDate) { console.error('value设定值不能超过endDate的设定值'); return; } this.core = new PickerCore({ id: this.props.id, cascade: false, defaultValue: this.props.defaultValue, onOk: this.props.onOk, defaultLabel: this.props.defaultLabel, data: [], sliderElem: this.refs.slider, containerElem: this.refs.container['elem'], labelElem: this.refs.label, formatLabel: this.props.formatLabel }); this.core.data = this.setMode(); this.core.init(); this.core.sliderElem.addEventListener('webkitTransitionEnd', this.onTransitionEnd); }; DatePicker.prototype.componentWillReceiveProps = function (nextProps) { }; DatePicker.prototype.componentDidUpdate = function (prevProps) { this.core.data = this.setMode(); this.core.componentWillReceiveProps(prevProps, this.props); }; DatePicker.prototype.onPanStart = function (evt) { evt.preventDefault(); this.core.panStart(evt); }; DatePicker.prototype.onPan = function (evt) { evt.preventDefault(); this.core.pan(evt); }; DatePicker.prototype.onPanEnd = function (evt) { var _this = this; evt.preventDefault(); this.core.panEnd(evt); if (this.core.isPanEnd && this.core.touchElementCol !== undefined) { this.transitionEndTimeout = setTimeout(function () { if (!_this.core.isTransitionEnd) { _this.onTransitionEnd(); } }, 300); } }; DatePicker.prototype.onTransitionEnd = function () { this.core.transitionEnd(this.transitionEndTimeout); this.reset(); }; DatePicker.prototype.reset = function () { switch (this.props.mode) { case 'yyMMdd': case 'yyMMddHH': case 'yyMMddHHmm': if (this.props.enableStartDate || this.props.enableEndDate) { if (this.core.touchElementCol === 0 || this.core.touchElementCol === 1) { var year = parseInt(this.core.data[0][this.core.getValueIndex(0, this.core.selected)].value.toString()); var month = parseInt(this.core.data[1][this.core.getValueIndex(1, this.core.selected)].value.toString()) - 1; var day = parseInt(this.core.data[2][this.core.getValueIndex(2, this.core.selected)].value.toString()); if (this.core.touchElementCol === 0) { this.replaceMonth(year); } else if (this.core.touchElementCol === 1) { this.replaceDays(year, month, day); } } } else { this.renderDays(); } break; default: break; } }; DatePicker.prototype.onOk = function () { this.core.ok(); }; DatePicker.prototype.onCancel = function () { this.core.cancel(); }; DatePicker.prototype.onOpen = function () { if (!this.props.disabled) { this.reset(); this.core['value'] = this.core.selected; this.core.open(); } }; DatePicker.prototype.setMode = function (yearIndex, monthIndex) { if (yearIndex === void 0) { yearIndex = this.props.defaultValue[0].index; } if (monthIndex === void 0) { monthIndex = this.props.defaultValue[1].index; } var mode = this.props.mode; var startYear = parseInt(this.props.startDate[0].toString()); var endYear = parseInt(this.props.endDate[0].toString()); var startMonth = parseInt(this.props.startDate[1].toString()); var endMonth = parseInt(this.props.endDate[1].toString()); var startDay = parseInt(this.props.startDate[2].toString()); var endDay = parseInt(this.props.endDate[2].toString()); var year = yearIndex !== undefined ? startYear + yearIndex : this.props.defaultValue[0].value; var month = monthIndex !== undefined ? monthIndex : parseInt(this.props.defaultValue[1].value.toString()) - 1; var _a = [undefined, undefined, undefined, undefined, undefined], yy = _a[0], MM = _a[1], dd = _a[2], HH = _a[3], mm = _a[4]; if (mode.indexOf('yy') >= 0) { var startDate = parseInt(this.props.startDate[0]); var endDate = parseInt(this.props.endDate[0]); yy = createYearArray(startDate, endDate, 'array').map(function (value) { return valueFormat(value, 'object', '年'); }); } year = parseInt(year.toString()); month = parseInt(month.toString()); if (mode.indexOf('MM') >= 0) { MM = createMonthArray('array').map(function (value) { return valueFormat(value + 1, 'object', '月'); }); if (this.props.enableStartDate && year === startYear) { if (this.props.startDate.length >= 2) { MM = MM.slice(startMonth - 1); } else { console.error('startDate设置错误,startDate数组长度不足2维'); } } if (this.props.enableEndDate && year === endYear) { if (this.props.endDate.length >= 2) { MM = MM.slice(0, endMonth - startMonth + 1); } else { console.error('endDate设置错误,endDate数组长度不足2维'); } } } if (mode.indexOf('dd') >= 0) { dd = getDaysInMonth(year, month, 'array').map(function (value) { return valueFormat(value, 'object', '日'); }); if (this.props.enableStartDate && year === startYear && month === startMonth - 1) { if (this.props.startDate.length >= 3) { dd = dd.slice(startDay - 1); } else { console.error('startDate设置错误,startDate数组长度不等于3维'); } } if (this.props.enableEndDate && year === endYear && month === endMonth - 1) { if (this.props.endDate.length >= 3) { dd = dd.slice(0, endDay); } else { console.error('endDate设置错误,endDate数组长度不足3维'); } } } if (mode.indexOf('HH') >= 0) { HH = createHoursArray('array').map(function (value) { return valueFormat(value, 'object', '时'); }); } if (mode.indexOf('mm') >= 0) { mm = createMinutesAndSecondsArray('array').map(function (value) { return valueFormat(value, 'object', '分'); }); } switch (mode) { case 'yy': return [yy]; case 'yyMM': return [yy, MM]; case 'yyMMdd': return [yy, MM, dd]; case 'yyMMddHH': return [yy, MM, dd, HH]; case 'yyMMddHHmm': return [yy, MM, dd, HH, mm]; case 'HHmm': return [HH, mm]; default: break; } }; DatePicker.prototype.renderDays = function () { var data = this.core.data; var year = parseInt(data[0][this.core.getValueIndex(0, this.core.selected)].value.toString()); var month = parseInt(data[1][this.core.getValueIndex(1, this.core.selected)].value.toString()) - 1; var days = getDaysInMonth(year, month, 'array').map(function (value) { return valueFormat(value, 'object', '日'); }); var oldLength = data[2].length; var newLength = days.length; var parent = this.core.sliderElem.children[2]; var fragment = document.createDocumentFragment(); var length = oldLength > newLength ? oldLength : newLength; var flag = oldLength > newLength ? 1 : 2; if (oldLength === newLength) { return; } parent.innerHTML = null; for (var i = 0; i < length; i++) { var tempElem = document.createElement('div'); tempElem.classList.add(prefix + "-body-col-item"); tempElem.innerText = valueFormat(i + 1, 'string', '日'); fragment.appendChild(tempElem); } parent.appendChild(fragment); this.core.data[2] = days; var selected = this.core.getValueIndex(2, this.core.selected); this.core.pickerTranslateInitial(2, this.core.data[2][selected] ? selected : 0); }; DatePicker.prototype.replaceMonth = function (year) { var _a = this.props, startDate = _a.startDate, endDate = _a.endDate, enableStartDate = _a.enableStartDate, enableEndDate = _a.enableEndDate; var startYear = parseInt(startDate[0].toString()); var endYear = parseInt(endDate[0].toString()); var enableStartYear = year === startYear && enableStartDate; var enableEndYear = year === endYear && enableEndDate; var startMonth = parseInt(startDate[1].toString()); var endMonth = parseInt(endDate[1].toString()); var selectedMonth = parseInt(this.core.selected[1].value.toString()); var _b = [undefined, undefined], month = _b[0], day = _b[1]; if (enableStartYear || enableEndYear) { if (enableStartYear) { month = selectedMonth < startMonth ? startMonth : selectedMonth; } else { month = selectedMonth > endMonth ? endMonth : selectedMonth; } this.core.data = this.setMode(this.core.selected[0].index, month - 1); this.core.renderCol(this.core.data[1], 1, 'replace'); if (!enableStartYear) { this.core.selected[1].index = undefined; this.core.selected[1].value = valueFormat(month, 'string', '月'); } this.core.pickerTranslateInitial(1, this.core.getValueIndex(1, this.core.selected)); var dayValueIndex = this.core.getValueIndex(2, this.core.selected); var dayIndex = this.core.data[2].length > dayValueIndex ? dayValueIndex : 0; day = parseInt(this.core.data[2][dayIndex].value.toString()); this.replaceDays(year, month - 1, day); } else { this.renderDays(); this.core.data = this.setMode(this.core.selected[0].index, selectedMonth - 1); this.core.renderCol(this.core.data[1], 1, 'replace'); this.core.pickerTranslateInitial(1, this.core.getValueIndex(1, this.core.selected)); } }; DatePicker.prototype.replaceDays = function (year, month, day) { var _a = this.props, startDate = _a.startDate, endDate = _a.endDate, enableStartDate = _a.enableStartDate, enableEndDate = _a.enableEndDate; var startYear = parseInt(startDate[0].toString()); var endYear = parseInt(endDate[0].toString()); var startMonth = parseInt(startDate[1].toString()) - 1; var endMonth = parseInt(endDate[1].toString()) - 1; var startMatch = year === startYear && month === startMonth && enableStartDate; var endMatch = year === endYear && month === endMonth && enableEndDate; if (startMatch || endMatch) { this.core.data = this.setMode(this.core.selected[0].index, month); this.core.renderCol(this.core.data[2], 2, 'replace'); this.core.selected[2].index = undefined; this.core.selected[2].value = valueFormat(day, 'string', '月'); this.core.pickerTranslateInitial(2, this.core.getValueIndex(2, this.core.selected)); } else { this.renderDays(); } }; DatePicker.prototype.render = function () { return view(this); }; DatePicker.defaultProps = { id: '', cascade: false, defaultValue: getDefaultValue(), startDate: getTodayDate(), endDate: getTodayDate(), enableStartDate: false, enableEndDate: false, mode: 'yyMMddHHmm', formatLabel: formatLabel }; return DatePicker; }(React.Component)); export default DatePicker;