]> 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,
0e4fd162 46 onKeyDown: PropTypes.func,
3ab3a128 47 };
02de449a 48
3ab3a128 49 static defaultProps = {
50 prefixCls: 'rc-time-picker-panel',
51 onChange: noop,
52 onClear: noop,
53 disabledHours: noop,
54 disabledMinutes: noop,
55 disabledSeconds: noop,
56 defaultOpenValue: moment(),
57 use12Hours: false,
58 addon: noop,
0e4fd162 59 onKeyDown: noop,
3ab3a128 60 };
02de449a 61
3ab3a128 62 constructor(props) {
63 super(props);
64 this.state = {
65 value: props.value,
182e9fcc 66 selectionRange: [],
02de449a 67 };
3ab3a128 68 }
02de449a 69
9f9f39e4 70 componentWillReceiveProps(nextProps) {
71 const value = nextProps.value;
72 if (value) {
73 this.setState({
74 value,
75 });
76 }
3ab3a128 77 }
9f9f39e4 78
3ab3a128 79 onChange = (newValue) => {
02de449a 80 this.setState({ value: newValue });
81 this.props.onChange(newValue);
3ab3a128 82 }
02de449a 83
3ab3a128 84 onCurrentSelectPanelChange = (currentSelectPanel) => {
182e9fcc 85 this.setState({ currentSelectPanel });
3ab3a128 86 }
b86fe1d1 87
9b780804 88 // https://github.com/ant-design/ant-design/issues/5829
89 close() {
90 this.props.onEsc();
91 }
92
02de449a 93 render() {
4984ed85 94 const {
c6a1a235 95 prefixCls, className, placeholder, disabledHours, disabledMinutes,
37c36c09 96 disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond,
0e4fd162 97 format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear, onKeyDown,
5827568e 98 hourStep, minuteStep, secondStep,
4984ed85 99 } = this.props;
100 const {
101 value, currentSelectPanel,
102 } = this.state;
71bd9bc1 103 const disabledHourOptions = disabledHours();
4984ed85 104 const disabledMinuteOptions = disabledMinutes(value ? value.hour() : null);
105 const disabledSecondOptions = disabledSeconds(value ? value.hour() : null,
106 value ? value.minute() : null);
5827568e
MP
107 const hourOptions = generateOptions(
108 24, disabledHourOptions, hideDisabledOptions, hourStep
109 );
110 const minuteOptions = generateOptions(
111 60, disabledMinuteOptions, hideDisabledOptions, minuteStep
112 );
113 const secondOptions = generateOptions(
114 60, disabledSecondOptions, hideDisabledOptions, secondStep
115 );
518b852e 116
02de449a 117 return (
9c01af6e 118 <div className={classNames({ [`${prefixCls}-inner`]: true, [className]: !!className })}>
02de449a 119 <Header
4984ed85 120 clearText={clearText}
02de449a 121 prefixCls={prefixCls}
4984ed85 122 defaultOpenValue={defaultOpenValue}
02de449a 123 value={value}
4984ed85 124 currentSelectPanel={currentSelectPanel}
125 onEsc={onEsc}
126 format={format}
63541ed7 127 placeholder={placeholder}
02de449a 128 hourOptions={hourOptions}
129 minuteOptions={minuteOptions}
130 secondOptions={secondOptions}
518b852e
M
131 disabledHours={disabledHours}
132 disabledMinutes={disabledMinutes}
133 disabledSeconds={disabledSeconds}
02de449a 134 onChange={this.onChange}
3ab3a128 135 onClear={onClear}
8133e8cf 136 allowEmpty={allowEmpty}
0e4fd162 137 onKeyDown={onKeyDown}
02de449a 138 />
139 <Combobox
140 prefixCls={prefixCls}
141 value={value}
4984ed85 142 defaultOpenValue={defaultOpenValue}
143 format={format}
02de449a 144 onChange={this.onChange}
8133e8cf 145 showHour={showHour}
37c36c09 146 showMinute={showMinute}
8133e8cf 147 showSecond={showSecond}
02de449a 148 hourOptions={hourOptions}
149 minuteOptions={minuteOptions}
150 secondOptions={secondOptions}
518b852e
M
151 disabledHours={disabledHours}
152 disabledMinutes={disabledMinutes}
153 disabledSeconds={disabledSeconds}
182e9fcc 154 onCurrentSelectPanelChange={this.onCurrentSelectPanelChange}
dd275f7d 155 use12Hours={use12Hours}
02de449a 156 />
b86fe1d1 157 {addon(this)}
02de449a 158 </div>
159 );
3ab3a128 160 }
161}
02de449a 162
4acbf95c 163export default Panel;