]> git.immae.eu Git - github/fretlink/time-picker.git/blame - src/Panel.jsx
Lift disabledHours to Panel
[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,
4e70ea0d 30 inputReadOnly: PropTypes.bool,
71bd9bc1
M
31 disabledHours: PropTypes.func,
32 disabledMinutes: PropTypes.func,
33 disabledSeconds: PropTypes.func,
518b852e 34 hideDisabledOptions: PropTypes.bool,
02de449a 35 onChange: PropTypes.func,
8133e8cf 36 onEsc: PropTypes.func,
37 allowEmpty: PropTypes.bool,
38 showHour: PropTypes.bool,
37c36c09 39 showMinute: PropTypes.bool,
8133e8cf 40 showSecond: PropTypes.bool,
02de449a 41 onClear: PropTypes.func,
dd275f7d 42 use12Hours: PropTypes.bool,
5827568e
MP
43 hourStep: PropTypes.number,
44 minuteStep: PropTypes.number,
45 secondStep: PropTypes.number,
b86fe1d1 46 addon: PropTypes.func,
d18ecfb6 47 focusOnOpen: PropTypes.bool,
0e4fd162 48 onKeyDown: PropTypes.func,
3ab3a128 49 };
02de449a 50
3ab3a128 51 static defaultProps = {
52 prefixCls: 'rc-time-picker-panel',
53 onChange: noop,
54 onClear: noop,
55 disabledHours: noop,
56 disabledMinutes: noop,
57 disabledSeconds: noop,
58 defaultOpenValue: moment(),
59 use12Hours: false,
60 addon: noop,
0e4fd162 61 onKeyDown: noop,
4e70ea0d 62 inputReadOnly: false,
3ab3a128 63 };
02de449a 64
3ab3a128 65 constructor(props) {
66 super(props);
67 this.state = {
68 value: props.value,
182e9fcc 69 selectionRange: [],
02de449a 70 };
3ab3a128 71 }
02de449a 72
9f9f39e4 73 componentWillReceiveProps(nextProps) {
74 const value = nextProps.value;
75 if (value) {
76 this.setState({
77 value,
78 });
79 }
3ab3a128 80 }
9f9f39e4 81
3ab3a128 82 onChange = (newValue) => {
02de449a 83 this.setState({ value: newValue });
84 this.props.onChange(newValue);
3ab3a128 85 }
02de449a 86
3ab3a128 87 onCurrentSelectPanelChange = (currentSelectPanel) => {
182e9fcc 88 this.setState({ currentSelectPanel });
3ab3a128 89 }
b86fe1d1 90
9b780804 91 // https://github.com/ant-design/ant-design/issues/5829
92 close() {
93 this.props.onEsc();
94 }
95
7211e9ba
WZ
96 disabledHours = () => {
97 const { use12Hours, disabledHours } = this.props;
98 let disabledOptions = disabledHours();
99 if (use12Hours && Array.isArray(disabledOptions)) {
100 if (this.isAM()) {
101 disabledOptions = disabledOptions.filter(h => h < 12).map(h => (h === 0 ? 12 : h));
102 } else {
103 disabledOptions = disabledOptions.map(h => (h === 12 ? 12 : h - 12));
104 }
105 }
106 return disabledOptions;
107 }
108
109 isAM() {
110 const value = (this.state.value || this.props.defaultOpenValue);
111 return value.hour() >= 0 && value.hour() < 12;
112 }
113
02de449a 114 render() {
4984ed85 115 const {
7211e9ba 116 prefixCls, className, placeholder, disabledMinutes,
37c36c09 117 disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond,
f0ac29c6 118 format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear,
4e70ea0d 119 focusOnOpen, onKeyDown, hourStep, minuteStep, secondStep, inputReadOnly,
4984ed85 120 } = this.props;
121 const {
122 value, currentSelectPanel,
123 } = this.state;
7211e9ba 124 const disabledHourOptions = this.disabledHours();
4984ed85 125 const disabledMinuteOptions = disabledMinutes(value ? value.hour() : null);
126 const disabledSecondOptions = disabledSeconds(value ? value.hour() : null,
127 value ? value.minute() : null);
5827568e
MP
128 const hourOptions = generateOptions(
129 24, disabledHourOptions, hideDisabledOptions, hourStep
130 );
131 const minuteOptions = generateOptions(
132 60, disabledMinuteOptions, hideDisabledOptions, minuteStep
133 );
134 const secondOptions = generateOptions(
135 60, disabledSecondOptions, hideDisabledOptions, secondStep
136 );
518b852e 137
02de449a 138 return (
9c01af6e 139 <div className={classNames({ [`${prefixCls}-inner`]: true, [className]: !!className })}>
02de449a 140 <Header
4984ed85 141 clearText={clearText}
02de449a 142 prefixCls={prefixCls}
4984ed85 143 defaultOpenValue={defaultOpenValue}
02de449a 144 value={value}
4984ed85 145 currentSelectPanel={currentSelectPanel}
146 onEsc={onEsc}
147 format={format}
63541ed7 148 placeholder={placeholder}
02de449a 149 hourOptions={hourOptions}
150 minuteOptions={minuteOptions}
151 secondOptions={secondOptions}
7211e9ba 152 disabledHours={this.disabledHours}
518b852e
M
153 disabledMinutes={disabledMinutes}
154 disabledSeconds={disabledSeconds}
02de449a 155 onChange={this.onChange}
3ab3a128 156 onClear={onClear}
8133e8cf 157 allowEmpty={allowEmpty}
d18ecfb6 158 focusOnOpen={focusOnOpen}
0e4fd162 159 onKeyDown={onKeyDown}
4e70ea0d 160 inputReadOnly={inputReadOnly}
02de449a 161 />
162 <Combobox
163 prefixCls={prefixCls}
164 value={value}
4984ed85 165 defaultOpenValue={defaultOpenValue}
166 format={format}
02de449a 167 onChange={this.onChange}
8133e8cf 168 showHour={showHour}
37c36c09 169 showMinute={showMinute}
8133e8cf 170 showSecond={showSecond}
02de449a 171 hourOptions={hourOptions}
172 minuteOptions={minuteOptions}
173 secondOptions={secondOptions}
7211e9ba 174 disabledHours={this.disabledHours}
518b852e
M
175 disabledMinutes={disabledMinutes}
176 disabledSeconds={disabledSeconds}
182e9fcc 177 onCurrentSelectPanelChange={this.onCurrentSelectPanelChange}
dd275f7d 178 use12Hours={use12Hours}
7211e9ba 179 isAM={this.isAM()}
02de449a 180 />
b86fe1d1 181 {addon(this)}
02de449a 182 </div>
183 );
3ab3a128 184 }
185}
02de449a 186
4acbf95c 187export default Panel;