UNPKG

11.6 kBJavaScriptView Raw
1import _extends from 'babel-runtime/helpers/extends';
2import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';
3import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
4import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
5import _inherits from 'babel-runtime/helpers/inherits';
6
7var _class, _temp2;
8
9import React, { Component } from 'react';
10import PropTypes from 'prop-types';
11import classnames from 'classnames';
12import nextLocale from '../locale/zh-cn';
13import { func, datejs, pickAttrs } from '../util';
14import TimeMenu from './module/time-menu';
15import SharedPT from './prop-types';
16
17var noop = func.noop;
18var TimePickerPanel = (_temp2 = _class = function (_Component) {
19 _inherits(TimePickerPanel, _Component);
20
21 function TimePickerPanel() {
22 var _temp, _this, _ret;
23
24 _classCallCheck(this, TimePickerPanel);
25
26 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
27 args[_key] = arguments[_key];
28 }
29
30 return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.prefixCls = _this.props.prefix + 'time-picker2', _this.onSelectMenuItem = function (panelType, index, type) {
31 var _this$props = _this.props,
32 value = _this$props.value,
33 isRange = _this$props.isRange;
34
35 var valueArr = Array.isArray(value) ? value : [value];
36 var val = panelType === 'end' ? valueArr[1] : valueArr[0];
37
38 var clonedValue = val ? val.clone() : datejs('00:00:00', 'HH:mm:ss', true);
39 var newValue = void 0;
40 switch (type) {
41 case 'hour':
42 newValue = clonedValue.hour(index);
43 break;
44 case 'minute':
45 newValue = clonedValue.minute(index);
46 break;
47 case 'second':
48 newValue = clonedValue.second(index);
49 break;
50 }
51
52 if (isRange) {
53 var nextValueArray = [];
54 if (panelType === 'start') {
55 nextValueArray[0] = newValue;
56 nextValueArray[1] = value[1];
57 } else if (panelType === 'end') {
58 nextValueArray[0] = value[0];
59 nextValueArray[1] = newValue;
60 }
61
62 _this.props.onSelect(nextValueArray, panelType);
63 } else {
64 _this.props.onSelect(newValue, 'panel');
65 }
66 }, _this.getDisabledItems = function () {
67 var _this$props2 = _this.props,
68 disabledHours = _this$props2.disabledHours,
69 disabledMinutes = _this$props2.disabledMinutes,
70 disabledSeconds = _this$props2.disabledSeconds,
71 value = _this$props2.value,
72 isRange = _this$props2.isRange;
73
74
75 var disableds = {
76 newDisabledHours: [disabledHours],
77 newDisabledMinutes: [disabledMinutes],
78 newDisabledSeconds: [disabledSeconds]
79 };
80 if (!isRange) {
81 return disableds;
82 }
83
84 var dHours = disabledHours() || [];
85 var dMinutes = disabledMinutes() || [];
86 var dSeconds = disabledSeconds() || [];
87
88 var v0 = value[0];
89 var v1 = value[1];
90
91 var hoursEqual = function hoursEqual() {
92 return v0 && v1 && v0.hour() === v1.hour();
93 };
94 var minutesEqual = function minutesEqual() {
95 return v0 && v1 && v0.hour() === v1.hour() && v0.minute() === v1.minute();
96 };
97
98 disableds.newDisabledHours[0] = function (h) {
99 return v1 && h > v1.hour() || dHours.indexOf(h) > -1;
100 };
101 disableds.newDisabledMinutes[0] = function (m) {
102 return v1 && hoursEqual() && m > v1.minute() || dMinutes.indexOf(m) > -1;
103 };
104 disableds.newDisabledSeconds[0] = function (s) {
105 return v1 && minutesEqual() && s > v1.second() || dSeconds.indexOf(s) > -1;
106 };
107
108 disableds.newDisabledHours[1] = function (h) {
109 return v0 && h < v0.hour() || dHours.indexOf(h) > -1;
110 };
111 disableds.newDisabledMinutes[1] = function (m) {
112 return v0 && m < (hoursEqual() && v0.minute()) || dMinutes.indexOf(m) > -1;
113 };
114 disableds.newDisabledSeconds[1] = function (s) {
115 return v0 && minutesEqual() && s < v0.second() || dSeconds.indexOf(s) > -1;
116 };
117
118 return disableds;
119 }, _temp), _possibleConstructorReturn(_this, _ret);
120 }
121
122 /**
123 *
124 * @param {enum} panelType 'start' | 'end' | 'panel'
125 * @param {*} index
126 * @param {*} type 'hour' | 'minute' | 'second'
127 */
128
129
130 TimePickerPanel.prototype.render = function render() {
131 var _classnames,
132 _this2 = this;
133
134 var _props = this.props,
135 prefix = _props.prefix,
136 value = _props.value,
137 isRange = _props.isRange,
138 locale = _props.locale,
139 className = _props.className,
140 disabled = _props.disabled,
141 showHour = _props.showHour,
142 showMinute = _props.showMinute,
143 showSecond = _props.showSecond,
144 hourStep = _props.hourStep,
145 minuteStep = _props.minuteStep,
146 secondStep = _props.secondStep,
147 renderTimeMenuItems = _props.renderTimeMenuItems,
148 others = _objectWithoutProperties(_props, ['prefix', 'value', 'isRange', 'locale', 'className', 'disabled', 'showHour', 'showMinute', 'showSecond', 'hourStep', 'minuteStep', 'secondStep', 'renderTimeMenuItems']);
149
150 var colLen = [showHour, showMinute, showSecond].filter(function (v) {
151 return v;
152 }).length;
153 var classNames = classnames(this.prefixCls + '-panel', (_classnames = {}, _classnames[this.prefixCls + '-panel-col-' + colLen] = !isRange, _classnames[this.prefixCls + '-panel-range'] = isRange, _classnames), className);
154
155 var activeHour = [];
156 var activeMinute = [];
157 var activeSecond = [];
158
159 var valueArr = Array.isArray(value) ? value : [value];
160 valueArr.forEach(function (val, i) {
161 if (val && datejs.isSelf(val)) {
162 activeHour[i] = val.hour();
163 activeMinute[i] = val.minute();
164 activeSecond[i] = val.second();
165 }
166 });
167
168 var commonProps = {
169 prefix: prefix,
170 disabled: disabled,
171 renderTimeMenuItems: renderTimeMenuItems
172 };
173
174 var _getDisabledItems = this.getDisabledItems(),
175 newDisabledHours = _getDisabledItems.newDisabledHours,
176 newDisabledMinutes = _getDisabledItems.newDisabledMinutes,
177 newDisabledSeconds = _getDisabledItems.newDisabledSeconds;
178
179 var generatePanel = function generatePanel(index) {
180 return React.createElement(
181 React.Fragment,
182 null,
183 showHour ? React.createElement(TimeMenu, _extends({}, commonProps, {
184 value: valueArr[index],
185 activeIndex: activeHour[index],
186 title: locale.hour,
187 mode: 'hour',
188 step: hourStep,
189 onSelect: _this2.onSelectMenuItem.bind(_this2, '' + (index === 0 ? 'start' : 'end')),
190 disabledItems: newDisabledHours[index]
191 })) : null,
192 showMinute ? React.createElement(TimeMenu, _extends({}, commonProps, {
193 value: valueArr[index],
194 activeIndex: activeMinute[index],
195 title: locale.minute,
196 mode: 'minute',
197 step: minuteStep,
198 onSelect: _this2.onSelectMenuItem.bind(_this2, '' + (index === 0 ? 'start' : 'end')),
199 disabledItems: newDisabledMinutes[index]
200 })) : null,
201 showSecond ? React.createElement(TimeMenu, _extends({}, commonProps, {
202 value: valueArr[index],
203 activeIndex: activeSecond[index],
204 title: locale.second,
205 step: secondStep,
206 mode: 'second',
207 onSelect: _this2.onSelectMenuItem.bind(_this2, '' + (index === 0 ? 'start' : 'end')),
208 disabledItems: newDisabledSeconds[index]
209 })) : null
210 );
211 };
212
213 var singlePanel = generatePanel(0);
214
215 var panelClassNames = classnames(this.prefixCls + '-panel-col-' + colLen, this.prefixCls + '-panel-list');
216
217 var doublePanel = React.createElement(
218 React.Fragment,
219 null,
220 React.createElement(
221 'div',
222 { className: panelClassNames },
223 generatePanel(0)
224 ),
225 React.createElement(
226 'div',
227 { className: panelClassNames },
228 generatePanel(1)
229 )
230 );
231
232 return React.createElement(
233 'div',
234 _extends({}, pickAttrs(others), { className: classNames }),
235 isRange ? doublePanel : singlePanel
236 );
237 };
238
239 return TimePickerPanel;
240}(Component), _class.propTypes = {
241 prefix: PropTypes.string,
242 /**
243 * 时间值(dayjs 对象)
244 */
245 value: SharedPT.value,
246 /**
247 * 是否显示小时
248 */
249 showHour: PropTypes.bool,
250 /**
251 * 是否显示分钟
252 */
253 showMinute: PropTypes.bool,
254 /**
255 * 是否显示秒
256 */
257 showSecond: PropTypes.bool,
258 /**
259 * 小时选项步长
260 */
261 hourStep: PropTypes.number,
262 /**
263 * 分钟选项步长
264 */
265 minuteStep: PropTypes.number,
266 /**
267 * 秒钟选项步长
268 */
269 secondStep: PropTypes.number,
270 /**
271 * 禁用小时函数
272 * @param {Number} index 时 0 - 23
273 * @return {Boolean} 是否禁用
274 */
275 disabledHours: PropTypes.func,
276 /**
277 * 禁用分钟函数
278 * @param {Number} index 分 0 - 59
279 * @return {Boolean} 是否禁用
280 */
281 disabledMinutes: PropTypes.func,
282 /**
283 * 禁用秒函数
284 * @param {Number} index 秒 0 - 59
285 * @return {Boolean} 是否禁用
286 */
287 disabledSeconds: PropTypes.func,
288 /**
289 * 渲染的可选择时间列表
290 * [{
291 * label: '01',
292 * value: 1
293 * }]
294 * @param {Array} list 默认渲染的列表
295 * @param {String} mode 渲染的菜单 hour, minute, second
296 * @param {dayjs} value 当前时间,可能为 null
297 * @return {Array} 返回需要渲染的数据
298 */
299 renderTimeMenuItems: PropTypes.func,
300 /**
301 * 选择某个日期值时的回调
302 * @param {Object} 选中后的日期值
303 */
304 onSelect: PropTypes.func,
305 isRange: PropTypes.bool,
306 locale: PropTypes.object,
307 disabled: PropTypes.bool,
308 className: PropTypes.string
309}, _class.defaultProps = {
310 prefix: 'next-',
311 showHour: true,
312 showSecond: true,
313 showMinute: true,
314 disabledHours: noop,
315 disabledMinutes: noop,
316 disabledSeconds: noop,
317 onSelect: noop,
318 disabled: false,
319 isRange: false,
320 locale: nextLocale.TimePicker
321}, _temp2);
322TimePickerPanel.displayName = 'TimePickerPanel';
323
324
325export default TimePickerPanel;
\No newline at end of file