]> git.immae.eu Git - github/fretlink/time-picker.git/blame - src/module/Panel.jsx
update disabled options
[github/fretlink/time-picker.git] / src / module / Panel.jsx
CommitLineData
02de449a 1import React, {PropTypes} from 'react';
4acbf95c
M
2import CommonMixin from '../mixin/CommonMixin';
3import Header from './Header';
4import Combobox from './Combobox';
02de449a 5
6function noop() {
7}
8
518b852e 9function generateOptions(length, disabledOptions, hideDisabledOptions) {
98275fd8 10 const arr = [];
518b852e 11 for (let value = 0; value < length; value++) {
0e62bf0b 12 if (!disabledOptions || disabledOptions.indexOf(value) < 0 || !hideDisabledOptions) {
518b852e
M
13 arr.push(value);
14 }
98275fd8 15 }
16 return arr;
02de449a 17}
18
4acbf95c 19const Panel = React.createClass({
02de449a 20 propTypes: {
21 prefixCls: PropTypes.string,
9f9f39e4 22 value: PropTypes.object,
02de449a 23 locale: PropTypes.object,
24 placeholder: PropTypes.string,
8133e8cf 25 gregorianCalendarLocale: PropTypes.object,
02de449a 26 formatter: PropTypes.object,
71bd9bc1
M
27 disabledHours: PropTypes.func,
28 disabledMinutes: PropTypes.func,
29 disabledSeconds: PropTypes.func,
518b852e 30 hideDisabledOptions: PropTypes.bool,
02de449a 31 onChange: PropTypes.func,
8133e8cf 32 onEsc: PropTypes.func,
33 allowEmpty: PropTypes.bool,
34 showHour: PropTypes.bool,
35 showSecond: PropTypes.bool,
02de449a 36 onClear: PropTypes.func,
37 },
38
39 mixins: [CommonMixin],
40
41 getDefaultProps() {
42 return {
02de449a 43 onChange: noop,
44 onClear: noop,
45 };
46 },
47
48 getInitialState() {
49 return {
8133e8cf 50 value: this.props.value,
182e9fcc 51 selectionRange: [],
02de449a 52 };
53 },
54
9f9f39e4 55 componentWillReceiveProps(nextProps) {
56 const value = nextProps.value;
57 if (value) {
58 this.setState({
59 value,
60 });
61 }
62 },
63
02de449a 64 onChange(newValue) {
65 this.setState({ value: newValue });
66 this.props.onChange(newValue);
67 },
68
69 onClear() {
70 this.props.onClear();
71 },
72
182e9fcc 73 onCurrentSelectPanelChange(currentSelectPanel) {
74 this.setState({ currentSelectPanel });
75 },
76
02de449a 77 render() {
518b852e 78 const { locale, prefixCls, placeholder, disabledHours, disabledMinutes, disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showSecond, formatter, gregorianCalendarLocale } = this.props;
9f9f39e4 79 const value = this.state.value;
71bd9bc1
M
80 const disabledHourOptions = disabledHours();
81 const disabledMinuteOptions = disabledMinutes(value.getHourOfDay());
82 const disabledSecondOptions = disabledSeconds(value.getHourOfDay(), value.getMinutes());
83 const hourOptions = generateOptions(24, disabledHourOptions, hideDisabledOptions);
84 const minuteOptions = generateOptions(60, disabledMinuteOptions, hideDisabledOptions);
85 const secondOptions = generateOptions(60, disabledSecondOptions, hideDisabledOptions);
518b852e 86
02de449a 87 return (
8133e8cf 88 <div className={`${prefixCls}-inner`}>
02de449a 89 <Header
90 prefixCls={prefixCls}
8133e8cf 91 gregorianCalendarLocale={gregorianCalendarLocale}
02de449a 92 locale={locale}
93 value={value}
182e9fcc 94 currentSelectPanel={this.state.currentSelectPanel}
8133e8cf 95 onEsc={this.props.onEsc}
96 formatter={formatter}
63541ed7 97 placeholder={placeholder}
02de449a 98 hourOptions={hourOptions}
99 minuteOptions={minuteOptions}
100 secondOptions={secondOptions}
518b852e
M
101 disabledHours={disabledHours}
102 disabledMinutes={disabledMinutes}
103 disabledSeconds={disabledSeconds}
02de449a 104 onChange={this.onChange}
105 onClear={this.onClear}
8133e8cf 106 allowEmpty={allowEmpty}
02de449a 107 />
108 <Combobox
109 prefixCls={prefixCls}
110 value={value}
8133e8cf 111 gregorianCalendarLocale={gregorianCalendarLocale}
112 formatter={formatter}
02de449a 113 onChange={this.onChange}
8133e8cf 114 showHour={showHour}
115 showSecond={showSecond}
02de449a 116 hourOptions={hourOptions}
117 minuteOptions={minuteOptions}
118 secondOptions={secondOptions}
518b852e
M
119 disabledHours={disabledHours}
120 disabledMinutes={disabledMinutes}
121 disabledSeconds={disabledSeconds}
182e9fcc 122 onCurrentSelectPanelChange={this.onCurrentSelectPanelChange}
02de449a 123 />
124 </div>
125 );
126 },
127});
128
4acbf95c 129export default Panel;