]> git.immae.eu Git - github/fretlink/time-picker.git/blame - src/Panel.jsx
Merge branch 'master' into picker-step
[github/fretlink/time-picker.git] / src / Panel.jsx
CommitLineData
3ab3a128 1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
4acbf95c
M
3import Header from './Header';
4import Combobox from './Combobox';
4984ed85 5import moment from 'moment';
c6a1a235 6import classNames from 'classnames';
02de449a 7
8function noop() {
9}
10
5827568e 11function generateOptions(length, disabledOptions, hideDisabledOptions, step = 1) {
98275fd8 12 const arr = [];
5827568e 13 for (let value = 0; value < length; value += step) {
0e62bf0b 14 if (!disabledOptions || disabledOptions.indexOf(value) < 0 || !hideDisabledOptions) {
518b852e
M
15 arr.push(value);
16 }
98275fd8 17 }
18 return arr;
02de449a 19}
20
3ab3a128 21class Panel extends Component {
22 static propTypes = {
4984ed85 23 clearText: PropTypes.string,
02de449a 24 prefixCls: PropTypes.string,
c6a1a235 25 className: PropTypes.string,
4984ed85 26 defaultOpenValue: PropTypes.object,
9f9f39e4 27 value: PropTypes.object,
02de449a 28 placeholder: PropTypes.string,
4984ed85 29 format: PropTypes.string,
71bd9bc1
M
30 disabledHours: PropTypes.func,
31 disabledMinutes: PropTypes.func,
32 disabledSeconds: PropTypes.func,
518b852e 33 hideDisabledOptions: PropTypes.bool,
02de449a 34 onChange: PropTypes.func,
8133e8cf 35 onEsc: PropTypes.func,
36 allowEmpty: PropTypes.bool,
37 showHour: PropTypes.bool,
37c36c09 38 showMinute: PropTypes.bool,
8133e8cf 39 showSecond: PropTypes.bool,
02de449a 40 onClear: PropTypes.func,
dd275f7d 41 use12Hours: PropTypes.bool,
5827568e
MP
42 hourStep: PropTypes.number,
43 minuteStep: PropTypes.number,
44 secondStep: PropTypes.number,
b86fe1d1 45 addon: PropTypes.func,
d18ecfb6 46 focusOnOpen: PropTypes.bool,
0e4fd162 47 onKeyDown: PropTypes.func,
3ab3a128 48 };
02de449a 49
3ab3a128 50 static defaultProps = {
51 prefixCls: 'rc-time-picker-panel',
52 onChange: noop,
53 onClear: noop,
54 disabledHours: noop,
55 disabledMinutes: noop,
56 disabledSeconds: noop,
57 defaultOpenValue: moment(),
58 use12Hours: false,
59 addon: noop,
0e4fd162 60 onKeyDown: noop,
3ab3a128 61 };
02de449a 62
3ab3a128 63 constructor(props) {
64 super(props);
65 this.state = {
66 value: props.value,
182e9fcc 67 selectionRange: [],
02de449a 68 };
3ab3a128 69 }
02de449a 70
9f9f39e4 71 componentWillReceiveProps(nextProps) {
72 const value = nextProps.value;
73 if (value) {
74 this.setState({
75 value,
76 });
77 }
3ab3a128 78 }
9f9f39e4 79
3ab3a128 80 onChange = (newValue) => {
02de449a 81 this.setState({ value: newValue });
82 this.props.onChange(newValue);
3ab3a128 83 }
02de449a 84
3ab3a128 85 onCurrentSelectPanelChange = (currentSelectPanel) => {
182e9fcc 86 this.setState({ currentSelectPanel });
3ab3a128 87 }
b86fe1d1 88
9b780804 89 // https://github.com/ant-design/ant-design/issues/5829
90 close() {
91 this.props.onEsc();
92 }
93
02de449a 94 render() {
4984ed85 95 const {
c6a1a235 96 prefixCls, className, placeholder, disabledHours, disabledMinutes,
37c36c09 97 disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond,
f0ac29c6 98 format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear,
99 focusOnOpen, onKeyDown, hourStep, minuteStep, secondStep,
4984ed85 100 } = this.props;
101 const {
102 value, currentSelectPanel,
103 } = this.state;
71bd9bc1 104 const disabledHourOptions = disabledHours();
4984ed85 105 const disabledMinuteOptions = disabledMinutes(value ? value.hour() : null);
106 const disabledSecondOptions = disabledSeconds(value ? value.hour() : null,
107 value ? value.minute() : null);
5827568e
MP
108 const hourOptions = generateOptions(
109 24, disabledHourOptions, hideDisabledOptions, hourStep
110 );
111 const minuteOptions = generateOptions(
112 60, disabledMinuteOptions, hideDisabledOptions, minuteStep
113 );
114 const secondOptions = generateOptions(
115 60, disabledSecondOptions, hideDisabledOptions, secondStep
116 );
518b852e 117
02de449a 118 return (
9c01af6e 119 <div className={classNames({ [`${prefixCls}-inner`]: true, [className]: !!className })}>
02de449a 120 <Header
4984ed85 121 clearText={clearText}
02de449a 122 prefixCls={prefixCls}
4984ed85 123 defaultOpenValue={defaultOpenValue}
02de449a 124 value={value}
4984ed85 125 currentSelectPanel={currentSelectPanel}
126 onEsc={onEsc}
127 format={format}
63541ed7 128 placeholder={placeholder}
02de449a 129 hourOptions={hourOptions}
130 minuteOptions={minuteOptions}
131 secondOptions={secondOptions}
518b852e
M
132 disabledHours={disabledHours}
133 disabledMinutes={disabledMinutes}
134 disabledSeconds={disabledSeconds}
02de449a 135 onChange={this.onChange}
3ab3a128 136 onClear={onClear}
8133e8cf 137 allowEmpty={allowEmpty}
d18ecfb6 138 focusOnOpen={focusOnOpen}
0e4fd162 139 onKeyDown={onKeyDown}
02de449a 140 />
141 <Combobox
142 prefixCls={prefixCls}
143 value={value}
4984ed85 144 defaultOpenValue={defaultOpenValue}
145 format={format}
02de449a 146 onChange={this.onChange}
8133e8cf 147 showHour={showHour}
37c36c09 148 showMinute={showMinute}
8133e8cf 149 showSecond={showSecond}
02de449a 150 hourOptions={hourOptions}
151 minuteOptions={minuteOptions}
152 secondOptions={secondOptions}
518b852e
M
153 disabledHours={disabledHours}
154 disabledMinutes={disabledMinutes}
155 disabledSeconds={disabledSeconds}
182e9fcc 156 onCurrentSelectPanelChange={this.onCurrentSelectPanelChange}
dd275f7d 157 use12Hours={use12Hours}
02de449a 158 />
b86fe1d1 159 {addon(this)}
02de449a 160 </div>
161 );
3ab3a128 162 }
163}
02de449a 164
4acbf95c 165export default Panel;