From 4984ed85e54f442998a335db70618d6184fa397e Mon Sep 17 00:00:00 2001 From: yiminghe Date: Thu, 4 Aug 2016 19:53:55 +0800 Subject: 2.x :boom: --- src/Combobox.jsx | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/Combobox.jsx (limited to 'src/Combobox.jsx') diff --git a/src/Combobox.jsx b/src/Combobox.jsx new file mode 100644 index 0000000..9d9da16 --- /dev/null +++ b/src/Combobox.jsx @@ -0,0 +1,125 @@ +import React, { PropTypes } from 'react'; +import Select from './Select'; + +const formatOption = (option, disabledOptions) => { + let value = `${option}`; + if (option < 10) { + value = `0${option}`; + } + + let disabled = false; + if (disabledOptions && disabledOptions.indexOf(option) >= 0) { + disabled = true; + } + + return { + value, + disabled, + }; +}; + +const Combobox = React.createClass({ + propTypes: { + format: PropTypes.string, + defaultOpenValue: PropTypes.object, + prefixCls: PropTypes.string, + value: PropTypes.object, + onChange: PropTypes.func, + showHour: PropTypes.bool, + showSecond: PropTypes.bool, + hourOptions: PropTypes.array, + minuteOptions: PropTypes.array, + secondOptions: PropTypes.array, + disabledHours: PropTypes.func, + disabledMinutes: PropTypes.func, + disabledSeconds: PropTypes.func, + onCurrentSelectPanelChange: PropTypes.func, + }, + + onItemChange(type, itemValue) { + const { onChange, defaultOpenValue } = this.props; + const value = (this.props.value || defaultOpenValue).clone(); + if (type === 'hour') { + value.hour(itemValue); + } else if (type === 'minute') { + value.minute(itemValue); + } else { + value.second(itemValue); + } + onChange(value); + }, + + onEnterSelectPanel(range) { + this.props.onCurrentSelectPanelChange(range); + }, + + getHourSelect(hour) { + const { prefixCls, hourOptions, disabledHours, showHour } = this.props; + if (!showHour) { + return null; + } + const disabledOptions = disabledHours(); + + return ( + formatOption(option, disabledOptions))} + selectedIndex={minuteOptions.indexOf(minute)} + type="minute" + onSelect={this.onItemChange} + onMouseEnter={this.onEnterSelectPanel.bind(this, 'minute')} + /> + ); + }, + + getSecondSelect(second) { + const { prefixCls, secondOptions, disabledSeconds, showSecond, defaultOpenValue } = this.props; + if (!showSecond) { + return null; + } + const value = this.props.value || defaultOpenValue; + const disabledOptions = disabledSeconds(value.hour(), value.minute()); + + return ( +