tuya-panel-kit
Version:
a functional component library for developing tuya device panels!
615 lines (538 loc) • 21.5 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _jsxFileName = 'src/components/date-picker/datePicker.js';
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactNative = require('react-native');
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _en_US = require('./locale/en_US');
var _en_US2 = _interopRequireDefault(_en_US);
var _zh_CN = require('./locale/zh_CN');
var _zh_CN2 = _interopRequireDefault(_zh_CN);
var _pickerView = require('../picker-view');
var _pickerView2 = _interopRequireDefault(_pickerView);
var _utils = require('../../utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
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 cx = _utils.RatioUtils.convertX;
var getPropsFromStyle = _utils.ThemeUtils.getPropsFromStyle;
var DATETIME = 'datetime';
var DATE = 'date';
var TIME = 'time';
var MONTH = 'month';
var YEAR = 'year';
var ONEDAY = 24 * 60 * 60 * 1000;
function plusZero(n) {
return n < 10 ? '0' + n : '' + n;
}
var capitalized = function capitalized(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
};
var sortColumnsAndValue = function sortColumnsAndValue(dateSortKeys, cols, value) {
if (!dateSortKeys || !Array.isArray(dateSortKeys) || dateSortKeys.length !== 3) {
dateSortKeys && console.warn('dateSortKeys: ' + JSON.stringify(dateSortKeys) + ' \u4E0D\u5408\u6CD5\uFF0C\u5FC5\u987B\u4E3A\u957F\u5EA6\u4E3A3\u7684\u6570\u7EC4\uFF0C\u4E14\u503C\u5FC5\u987B\u4E3A\'year\' || \'month\' || \'day');
return { cols: cols, value: value };
}
var sortedCols = [];
var sortedValue = [];
dateSortKeys.forEach(function (k) {
var colIndex = cols.findIndex(function (col) {
return col.key === k;
});
colIndex !== -1 && sortedCols.push(cols[colIndex]);
colIndex !== -1 && sortedValue.push(value[colIndex]);
});
return { cols: sortedCols, value: sortedValue };
};
var formatColArray = function formatColArray(arrLength, min, labelLocal, isPlusZero) {
return Array.from(Array(arrLength), function (v, k) {
var finalLabelLocal = '' + (labelLocal || '');
var finalLabelMain = isPlusZero ? '' + plusZero(k + min) : '' + (k + min);
var label = '' + finalLabelMain + finalLabelLocal;
return { value: '' + (k + min), label: label };
});
};
var getDaysInMonth = function getDaysInMonth(date) {
return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
};
var setMonth = function setMonth(date, month) {
var days = getDaysInMonth(new Date(date.getFullYear(), month));
date.setDate(Math.min(date.getDate(), days));
date.setMonth(month);
};
var DatePicker = function (_React$Component) {
_inherits(DatePicker, _React$Component);
function DatePicker(props) {
_classCallCheck(this, DatePicker);
var _this = _possibleConstructorReturn(this, (DatePicker.__proto__ || Object.getPrototypeOf(DatePicker)).call(this, props));
_this.onValueChange = function (value, index, key) {
var newValue = _this.getNewDate(value, index, key);
if (!('date' in _this.props)) {
_this.setState({ date: newValue });
}
if (_this.props.onDateChange) {
_this.props.onDateChange(newValue);
}
if (_this.props.onValueChange) {
_this.props.onValueChange(value, index);
}
};
_this.getNewDate = function (values, index, key) {
var value = parseInt(values, 10);
var mode = _this.props.mode;
var newValue = new Date(_this.getDate());
if (mode === DATETIME || mode === DATE || mode === YEAR || mode === MONTH) {
switch (key) {
case 'year':
newValue.setFullYear(value);
break;
case 'month':
setMonth(newValue, value - 1);
break;
case 'day':
newValue.setDate(value);
break;
case 'hour':
_this.setHours(newValue, value);
break;
case 'minute':
newValue.setMinutes(value);
break;
case 'ampm':
_this.setAmPm(newValue, value);
break;
default:
break;
}
} else if (mode === TIME) {
switch (key) {
case 'hour':
_this.setHours(newValue, value);
break;
case 'minute':
newValue.setMinutes(value);
break;
case 'ampm':
_this.setAmPm(newValue, value);
break;
default:
break;
}
}
return _this.getRealDate(newValue);
};
_this.getTimeColsData = function (date) {
var minMinute = 0;
var maxMinute = 59;
var minHour = 0;
var maxHour = 23;
var _this$props = _this.props,
mode = _this$props.mode,
use12Hours = _this$props.use12Hours,
isPlusZero = _this$props.isPlusZero,
isAmpmFirst = _this$props.isAmpmFirst,
minDate = _this$props.minDate,
maxDate = _this$props.maxDate;
var locale = _this.locale;
var minDateMinute = minDate.getMinutes();
var maxDateMinute = maxDate.getMinutes();
var minDateHour = minDate.getHours();
var maxDateHour = maxDate.getHours();
var nowHour = date.getHours();
if (mode === DATETIME) {
var year = date.getFullYear();
var month = date.getMonth();
var day = date.getDate();
var minDateYear = minDate.getFullYear();
var maxDateYear = maxDate.getFullYear();
var minDateMonth = minDate.getMonth();
var maxDateMonth = maxDate.getMonth();
var minDateDay = minDate.getDate();
var maxDateDay = maxDate.getDate();
if (minDateYear === year && minDateMonth === month && minDateDay === day) {
minHour = minDateHour;
if (minDateHour === nowHour) {
minMinute = minDateMinute;
}
}
if (maxDateYear === year && maxDateMonth === month && maxDateDay === day) {
maxHour = maxDateHour;
if (maxDateHour === nowHour) {
maxMinute = maxDateMinute;
}
}
} else {
minHour = minDateHour;
if (minDateHour === nowHour) {
minMinute = minDateMinute;
}
maxHour = maxDateHour;
if (maxDateHour === nowHour) {
maxMinute = maxDateMinute;
}
}
var ampmCols = [];
if (use12Hours) {
var ampm = [{ value: '0', label: locale.am }, { value: '1', label: locale.pm }];
ampmCols = [{ key: 'ampm', values: ampm }];
}
var hour = [];
if (minHour === 0 && maxHour === 0 || minHour !== 0 && maxHour !== 0) {
minHour = _this.getRealHour(minHour);
} else if (minHour === 0 && use12Hours) {
minHour = 1;
hour.push({ value: '0', label: locale.hour ? '12' + locale.hour : '12' });
}
maxHour = _this.getRealHour(maxHour);
var hours = formatColArray(maxHour - minHour + 1, minHour, locale.hour || '', isPlusZero);
hour = hour.concat(hours);
var hourCols = { key: 'hour', values: hour };
var nowMinute = date.getMinutes();
var minute = formatColArray(maxMinute - minMinute + 1, minMinute, locale.minute || '', isPlusZero);
var minuteCols = { key: 'minute', values: minute };
var cols = !isAmpmFirst ? [hourCols, minuteCols].concat(ampmCols) : ampmCols.concat([hourCols, minuteCols]);
return { cols: cols, nowMinute: nowMinute, nowHour: nowHour };
};
_this.getRealDate = function (date) {
var _this$props2 = _this.props,
mode = _this$props2.mode,
minDate = _this$props2.minDate,
maxDate = _this$props2.maxDate;
switch (mode) {
case DATETIME:
if (date < minDate) {
return new Date(+minDate);
}
if (date > maxDate) {
return new Date(+maxDate);
}
break;
case TIME:
{
var maxHour = maxDate.getHours();
var maxMinutes = maxDate.getMinutes();
var minHour = minDate.getHours();
var minMinutes = minDate.getMinutes();
var hour = date.getHours();
var minutes = date.getMinutes();
if (hour < minHour || hour === minHour && minutes < minMinutes) {
return new Date(+minDate);
}
if (hour > maxHour || hour === maxHour && minMinutes > maxMinutes) {
return new Date(+maxDate);
}
}
break;
default:
if (date >= +maxDate + ONEDAY) {
return new Date(+maxDate);
}
if (+date + ONEDAY <= minDate) {
return new Date(+minDate);
}
break;
}
return date;
};
_this.getDateColsData = function () {
var _this$props3 = _this.props,
mode = _this$props3.mode,
maxDate = _this$props3.maxDate,
minDate = _this$props3.minDate,
isPlusZero = _this$props3.isPlusZero;
var locale = _this.locale;
var date = _this.getDate();
var nowYear = date.getFullYear();
var nowMonth = date.getMonth();
var maxDateYear = maxDate.getFullYear();
var minDateYear = minDate.getFullYear();
var minDateMonth = minDate.getMonth();
var maxDateMonth = maxDate.getMonth();
var minDateDay = minDate.getDate();
var maxDateDay = maxDate.getDate();
var year = formatColArray(maxDateYear - minDateYear + 1, minDateYear, locale.year);
var yearCol = { key: 'year', values: year };
if (mode === YEAR) {
return [yearCol];
}
var minMonth = 0;
var maxMonth = 11;
if (minDateYear === nowYear) {
minMonth = minDateMonth;
}
if (maxDateYear === nowYear) {
maxMonth = maxDateMonth;
}
var month = formatColArray(maxMonth - minMonth + 1, minMonth + 1, locale.month, isPlusZero);
var monthCol = { key: 'month', values: month };
if (mode === MONTH) {
return [yearCol, monthCol];
}
var minDay = 1;
var maxDay = getDaysInMonth(date);
if (minDateYear === nowYear && minDateMonth === nowMonth) {
minDay = minDateDay;
}
if (maxDateYear === nowYear && maxDateMonth === nowMonth) {
maxDay = maxDateDay;
}
var day = formatColArray(maxDay - minDay + 1, minDay, locale.day, isPlusZero);
var dayCol = { key: 'day', values: day };
return [yearCol, monthCol, dayCol];
};
_this.getIndexAndCols = function () {
var _this$props4 = _this.props,
mode = _this$props4.mode,
use12Hours = _this$props4.use12Hours,
isAmpmFirst = _this$props4.isAmpmFirst,
isTimeFirst = _this$props4.isTimeFirst,
dateSortKeys = _this$props4.dateSortKeys;
var date = _this.getDate();
var cols = [];
var value = [];
if (mode === YEAR) {
return {
cols: _this.getDateColsData(),
value: ['' + date.getFullYear()]
};
}
if (mode === MONTH) {
var unSortDateCols = _this.getDateColsData();
var unSortDateValue = ['' + date.getFullYear(), '' + (date.getMonth() + 1)];
return sortColumnsAndValue(dateSortKeys, unSortDateCols, unSortDateValue);
}
if (mode === DATE) {
var _unSortDateCols = _this.getDateColsData();
var _unSortDateValue = ['' + date.getFullYear(), '' + (date.getMonth() + 1), '' + date.getDate()];
return sortColumnsAndValue(dateSortKeys, _unSortDateCols, _unSortDateValue);
}
var time = _this.getTimeColsData(date);
var realhour = time.nowHour;
var timeValue = ['' + realhour, '' + time.nowMinute];
if (use12Hours) {
realhour = time.nowHour === 0 ? 12 : time.nowHour > 12 ? time.nowHour - 12 : time.nowHour;
timeValue[0] = '' + realhour;
var ampmStr = '' + (time.nowHour >= 12 ? 1 : 0);
if (isAmpmFirst) {
timeValue.splice(0, 0, ampmStr);
} else {
timeValue.push(ampmStr);
}
}
if (mode === DATETIME) {
var _unSortDateCols2 = _this.getDateColsData();
var _unSortDateValue2 = ['' + date.getFullYear(), '' + (date.getMonth() + 1), '' + date.getDate()];
var _sortColumnsAndValue = sortColumnsAndValue(dateSortKeys, _unSortDateCols2, _unSortDateValue2),
sortDateCols = _sortColumnsAndValue.cols,
sortDateValue = _sortColumnsAndValue.value;
return {
cols: isTimeFirst ? [].concat(_toConsumableArray(time.cols), _toConsumableArray(sortDateCols)) : [].concat(_toConsumableArray(sortDateCols), _toConsumableArray(time.cols)),
value: isTimeFirst ? [].concat(timeValue, _toConsumableArray(sortDateValue)) : [].concat(_toConsumableArray(sortDateValue), timeValue)
};
}
if (mode === TIME) {
return {
cols: time.cols,
value: [].concat(timeValue)
};
}
return {
cols: cols,
value: value
};
};
_this.i18n = function (locale) {
if (typeof locale === 'string') {
_this.locale = locale === 'cn' ? _zh_CN2.default : _en_US2.default;
} else if (typeof locale === 'object') {
_this.locale = _extends({}, _en_US2.default, locale);
} else {
_this.locale = _en_US2.default;
}
};
_this.state = {
date: props.date || props.defaultDate
};
_this.i18n(props.locale);
return _this;
}
_createClass(DatePicker, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if ('date' in nextProps) {
this.setState({ date: nextProps.date || nextProps.defaultDate });
}
this.i18n(nextProps.locale);
}
}, {
key: 'getDate',
value: function getDate() {
return this.getRealDate(this.state.date || this.props.minDate);
}
}, {
key: 'getRealHour',
value: function getRealHour(hour) {
if (this.props.use12Hours) {
var resultHours = hour;
if (hour === 0) {
resultHours = 12;
}
if (hour > 12) {
resultHours -= 12;
}
return resultHours;
}
return hour;
}
}, {
key: 'setHours',
value: function setHours(date, hour) {
if (this.props.use12Hours) {
var dh = date.getHours();
var nhour = hour;
nhour = dh >= 12 ? hour + 12 : hour;
nhour = nhour >= 24 ? 0 : nhour;
date.setHours(nhour);
} else {
date.setHours(hour);
}
}
}, {
key: 'setAmPm',
value: function setAmPm(date, index) {
if (index === 0) {
date.setTime(+date - ONEDAY / 2);
} else {
date.setTime(+date + ONEDAY / 2);
}
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _getIndexAndCols = this.getIndexAndCols(),
value = _getIndexAndCols.value,
cols = _getIndexAndCols.cols;
var pickerFontSize = cx(30);
if (cols.length < 3) {
pickerFontSize = cx(30);
} else if (cols.length === 3) {
pickerFontSize = cx(27);
} else {
pickerFontSize = cx(24);
}
var _props = this.props,
locale = _props.locale,
mode = _props.mode,
use12Hours = _props.use12Hours,
minDate = _props.minDate,
maxDate = _props.maxDate,
onDateChange = _props.onDateChange,
onValueChange = _props.onValueChange,
isAmpmFirst = _props.isAmpmFirst,
date = _props.date,
defaultDate = _props.defaultDate,
style = _props.style,
loop = _props.loop,
pickerFontColor = _props.pickerFontColor,
accessibilityLabel = _props.accessibilityLabel,
PickerProps = _objectWithoutProperties(_props, ['locale', 'mode', 'use12Hours', 'minDate', 'maxDate', 'onDateChange', 'onValueChange', 'isAmpmFirst', 'date', 'defaultDate', 'style', 'loop', 'pickerFontColor', 'accessibilityLabel']);
var multiStyle = {
flexDirection: 'row',
alignItems: 'center',
paddingLeft: 5,
paddingRight: 5,
backgroundColor: '#fff',
height: 216
};
var bgColor = getPropsFromStyle('backgroundColor', style);
return _react2.default.createElement(
_reactNative.View,
{ style: [multiStyle, style], __source: {
fileName: _jsxFileName,
lineNumber: 556
}
},
cols.map(function (pItem, pindex) {
return _react2.default.createElement(
_pickerView2.default,
_extends({
theme: { fontColor: pickerFontColor, fontSize: pickerFontSize }
}, PickerProps, {
style: { flex: 1, backgroundColor: bgColor || '#fff' },
key: pItem.key,
accessibilityLabel: accessibilityLabel + '_' + capitalized(pItem.key),
loop: pItem.key !== 'ampm' && loop,
selectedItemTextColor: pickerFontColor,
itemStyle: _reactNative.StyleSheet.flatten([{ color: pickerFontColor }, PickerProps.itemStyle]),
selectedValue: value[pindex],
onValueChange: function onValueChange(dateValue) {
return _this2.onValueChange(dateValue, pindex, pItem.key);
},
__source: {
fileName: _jsxFileName,
lineNumber: 558
}
}),
pItem.values.map(function (item) {
return _react2.default.createElement(_pickerView2.default.Item, {
key: pItem.key + '_' + item.value,
value: item.value,
label: item.label,
__source: {
fileName: _jsxFileName,
lineNumber: 572
}
});
})
);
})
);
}
}]);
return DatePicker;
}(_react2.default.Component);
DatePicker.propTypes = {
accessibilityLabel: _propTypes2.default.string,
locale: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]),
mode: _propTypes2.default.string,
loop: _propTypes2.default.bool,
use12Hours: _propTypes2.default.bool,
isPlusZero: _propTypes2.default.bool,
minDate: _propTypes2.default.object,
maxDate: _propTypes2.default.object,
onDateChange: _propTypes2.default.func,
onValueChange: _propTypes2.default.func,
isAmpmFirst: _propTypes2.default.bool,
isTimeFirst: _propTypes2.default.bool,
date: _propTypes2.default.object,
defaultDate: _propTypes2.default.object,
style: _reactNative.ViewPropTypes.style,
pickerFontColor: _propTypes2.default.string,
dateSortKeys: _propTypes2.default.array
};
DatePicker.defaultProps = {
accessibilityLabel: 'DatePicker',
mode: DATE,
loop: false,
use12Hours: false,
isPlusZero: true,
isAmpmFirst: false,
isTimeFirst: false,
locale: 'en',
minDate: new Date(2000, 0, 1, 0, 0, 0),
maxDate: new Date(2030, 11, 31, 23, 59, 59),
onDateChange: function onDateChange() {},
onValueChange: function onValueChange() {},
pickerFontColor: '#333',
dateSortKeys: null
};
exports.default = DatePicker;