1 import React, {PropTypes} from 'react';
2 import ReactDOM from 'react-dom';
3 import Trigger from 'rc-trigger';
4 import {createChainedFunction} from 'rc-util';
5 import Panel from './module/Panel';
6 import placements from './util/placements';
7 import CommonMixin from './mixin/CommonMixin';
12 function refFn(field, component) {
13 this[field] = component;
16 const Picker = React.createClass({
18 prefixCls: PropTypes.string,
19 inputClassName: PropTypes.string,
20 locale: PropTypes.object,
21 children: PropTypes.func,
22 disabled: PropTypes.bool,
23 defaultValue: PropTypes.object,
25 align: PropTypes.object,
26 placement: PropTypes.any,
27 transitionName: PropTypes.string,
28 placeholder: PropTypes.string,
29 formatter: PropTypes.object,
30 hourOptions: PropTypes.array,
31 minuteOptions: PropTypes.array,
32 secondOptions: PropTypes.array,
33 onChange: PropTypes.func,
34 onOpen: PropTypes.func,
35 onClose: PropTypes.func,
38 mixins: [CommonMixin],
44 placement: 'bottomLeft',
52 this.savePanelRef = refFn.bind(this, 'panelInstance');
53 const { open, defaultValue } = this.props;
60 componentWillReceiveProps(nextProps) {
61 const { defaultValue, open } = nextProps;
62 if (defaultValue !== undefined) {
63 this.setState({value: defaultValue});
65 if (open !== undefined) {
66 this.setState({open});
70 onPanelChange(value) {
74 this.props.onChange(value);
84 onVisibleChange(open) {
85 this.setOpen(open, () => {
87 ReactDOM.findDOMNode(this.refs.picker).blur();
88 ReactDOM.findDOMNode(this.panelInstance).focus();
94 const { prefixCls, defaultValue, locale, formatter, placeholder, hourOptions, minuteOptions, secondOptions } = this.props;
98 defaultValue={defaultValue}
100 formatter={formatter}
101 placeholder={placeholder}
102 hourOptions={hourOptions}
103 minuteOptions={minuteOptions}
104 secondOptions={secondOptions}
110 const panel = this.getPanel();
112 ref: this.savePanelRef,
113 defaultValue: this.state.value || panel.props.defaultValue,
114 onChange: createChainedFunction(panel.props.onChange, this.onPanelChange),
115 onClear: createChainedFunction(panel.props.onClear, this.onPanelClear),
118 return React.cloneElement(panel, extraProps);
121 setOpen(open, callback) {
122 const {onOpen, onClose} = this.props;
123 if (this.state.open !== open) {
139 const { prefixCls, placeholder, placement, align, disabled, transitionName, children, formatter, inputClassName } = this.props;
140 const { open, value } = this.state;
144 prefixCls={`${prefixCls}-picker-container`}
145 popup={this.getPanelElement()}
147 builtinPlacements={placements}
148 popupPlacement={placement}
149 action={disabled ? [] : ['click']}
151 popupTransitionName={transitionName}
153 onPopupVisibleChange={this.onVisibleChange}
155 <span className={`${prefixCls}-picker`}>
156 <input className={inputClassName} ref="picker" type="text" placeholder={placeholder} readOnly disabled={disabled} value={value && formatter.format(value)} />
157 <span className={`${prefixCls}-picker-icon`} />
164 export default Picker;