UNPKG

8.31 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
6
7var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
8
9var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
10
11var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
12
13var _inherits2 = require('babel-runtime/helpers/inherits');
14
15var _inherits3 = _interopRequireDefault(_inherits2);
16
17var _react = require('react');
18
19var _react2 = _interopRequireDefault(_react);
20
21var _reactDom = require('react-dom');
22
23var _reactDom2 = _interopRequireDefault(_reactDom);
24
25var _propTypes = require('prop-types');
26
27var _propTypes2 = _interopRequireDefault(_propTypes);
28
29var _reactLifecyclesCompat = require('react-lifecycles-compat');
30
31var _createChainedFunction = require('rc-util/lib/createChainedFunction');
32
33var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
34
35var _KeyCode = require('rc-util/lib/KeyCode');
36
37var _KeyCode2 = _interopRequireDefault(_KeyCode);
38
39var _placements = require('./picker/placements');
40
41var _placements2 = _interopRequireDefault(_placements);
42
43var _rcTrigger = require('rc-trigger');
44
45var _rcTrigger2 = _interopRequireDefault(_rcTrigger);
46
47function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
48
49function noop() {}
50
51function refFn(field, component) {
52 this[field] = component;
53}
54
55var Picker = function (_React$Component) {
56 (0, _inherits3['default'])(Picker, _React$Component);
57
58 function Picker(props) {
59 (0, _classCallCheck3['default'])(this, Picker);
60
61 var _this = (0, _possibleConstructorReturn3['default'])(this, _React$Component.call(this, props));
62
63 _initialiseProps.call(_this);
64
65 var open = void 0;
66 if ('open' in props) {
67 open = props.open;
68 } else {
69 open = props.defaultOpen;
70 }
71 var value = props.value || props.defaultValue;
72 _this.saveCalendarRef = refFn.bind(_this, 'calendarInstance');
73
74 _this.state = {
75 open: open,
76 value: value
77 };
78 return _this;
79 }
80
81 Picker.prototype.componentDidUpdate = function componentDidUpdate(_, prevState) {
82 if (!prevState.open && this.state.open) {
83 // setTimeout is for making sure saveCalendarRef happen before focusCalendar
84 this.focusTimeout = setTimeout(this.focusCalendar, 0, this);
85 }
86 };
87
88 Picker.prototype.componentWillUnmount = function componentWillUnmount() {
89 clearTimeout(this.focusTimeout);
90 };
91
92 Picker.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps) {
93 var newState = {};
94 var value = nextProps.value,
95 open = nextProps.open;
96
97 if ('value' in nextProps) {
98 newState.value = value;
99 }
100 if (open !== undefined) {
101 newState.open = open;
102 }
103 return newState;
104 };
105
106 Picker.prototype.render = function render() {
107 var props = this.props;
108 var prefixCls = props.prefixCls,
109 placement = props.placement,
110 style = props.style,
111 getCalendarContainer = props.getCalendarContainer,
112 align = props.align,
113 animation = props.animation,
114 disabled = props.disabled,
115 dropdownClassName = props.dropdownClassName,
116 transitionName = props.transitionName,
117 children = props.children;
118
119 var state = this.state;
120 return _react2['default'].createElement(
121 _rcTrigger2['default'],
122 {
123 popup: this.getCalendarElement(),
124 popupAlign: align,
125 builtinPlacements: _placements2['default'],
126 popupPlacement: placement,
127 action: disabled && !state.open ? [] : ['click'],
128 destroyPopupOnHide: true,
129 getPopupContainer: getCalendarContainer,
130 popupStyle: style,
131 popupAnimation: animation,
132 popupTransitionName: transitionName,
133 popupVisible: state.open,
134 onPopupVisibleChange: this.onVisibleChange,
135 prefixCls: prefixCls,
136 popupClassName: dropdownClassName
137 },
138 _react2['default'].cloneElement(children(state, props), { onKeyDown: this.onKeyDown })
139 );
140 };
141
142 return Picker;
143}(_react2['default'].Component);
144
145Picker.propTypes = {
146 animation: _propTypes2['default'].oneOfType([_propTypes2['default'].func, _propTypes2['default'].string]),
147 disabled: _propTypes2['default'].bool,
148 transitionName: _propTypes2['default'].string,
149 onChange: _propTypes2['default'].func,
150 onOpenChange: _propTypes2['default'].func,
151 children: _propTypes2['default'].func,
152 getCalendarContainer: _propTypes2['default'].func,
153 calendar: _propTypes2['default'].element,
154 style: _propTypes2['default'].object,
155 open: _propTypes2['default'].bool,
156 defaultOpen: _propTypes2['default'].bool,
157 prefixCls: _propTypes2['default'].string,
158 placement: _propTypes2['default'].any,
159 value: _propTypes2['default'].oneOfType([_propTypes2['default'].object, _propTypes2['default'].array]),
160 defaultValue: _propTypes2['default'].oneOfType([_propTypes2['default'].object, _propTypes2['default'].array]),
161 align: _propTypes2['default'].object,
162 onBlur: _propTypes2['default'].func
163};
164Picker.defaultProps = {
165 prefixCls: 'rc-calendar-picker',
166 style: {},
167 align: {},
168 placement: 'bottomLeft',
169 defaultOpen: false,
170 onChange: noop,
171 onOpenChange: noop,
172 onBlur: noop
173};
174
175var _initialiseProps = function _initialiseProps() {
176 var _this2 = this;
177
178 this.onCalendarKeyDown = function (event) {
179 if (event.keyCode === _KeyCode2['default'].ESC) {
180 event.stopPropagation();
181 _this2.close(_this2.focus);
182 }
183 };
184
185 this.onCalendarSelect = function (value) {
186 var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
187
188 var props = _this2.props;
189 if (!('value' in props)) {
190 _this2.setState({
191 value: value
192 });
193 }
194 if (cause.source === 'keyboard' || cause.source === 'dateInputSelect' || !props.calendar.props.timePicker && cause.source !== 'dateInput' || cause.source === 'todayButton') {
195 _this2.close(_this2.focus);
196 }
197 props.onChange(value);
198 };
199
200 this.onKeyDown = function (event) {
201 if (!_this2.state.open && (event.keyCode === _KeyCode2['default'].DOWN || event.keyCode === _KeyCode2['default'].ENTER)) {
202 _this2.open();
203 event.preventDefault();
204 }
205 };
206
207 this.onCalendarOk = function () {
208 _this2.close(_this2.focus);
209 };
210
211 this.onCalendarClear = function () {
212 _this2.close(_this2.focus);
213 };
214
215 this.onCalendarBlur = function () {
216 _this2.setOpen(false);
217 };
218
219 this.onVisibleChange = function (open) {
220 _this2.setOpen(open);
221 };
222
223 this.getCalendarElement = function () {
224 var props = _this2.props;
225 var state = _this2.state;
226 var calendarProps = props.calendar.props;
227 var value = state.value;
228
229 var defaultValue = value;
230 var extraProps = {
231 ref: _this2.saveCalendarRef,
232 defaultValue: defaultValue || calendarProps.defaultValue,
233 selectedValue: value,
234 onKeyDown: _this2.onCalendarKeyDown,
235 onOk: (0, _createChainedFunction2['default'])(calendarProps.onOk, _this2.onCalendarOk),
236 onSelect: (0, _createChainedFunction2['default'])(calendarProps.onSelect, _this2.onCalendarSelect),
237 onClear: (0, _createChainedFunction2['default'])(calendarProps.onClear, _this2.onCalendarClear),
238 onBlur: (0, _createChainedFunction2['default'])(calendarProps.onBlur, _this2.onCalendarBlur)
239 };
240
241 return _react2['default'].cloneElement(props.calendar, extraProps);
242 };
243
244 this.setOpen = function (open, callback) {
245 var onOpenChange = _this2.props.onOpenChange;
246
247 if (_this2.state.open !== open) {
248 if (!('open' in _this2.props)) {
249 _this2.setState({
250 open: open
251 }, callback);
252 }
253 onOpenChange(open);
254 }
255 };
256
257 this.open = function (callback) {
258 _this2.setOpen(true, callback);
259 };
260
261 this.close = function (callback) {
262 _this2.setOpen(false, callback);
263 };
264
265 this.focus = function () {
266 if (!_this2.state.open) {
267 _reactDom2['default'].findDOMNode(_this2).focus();
268 }
269 };
270
271 this.focusCalendar = function () {
272 if (_this2.state.open && !!_this2.calendarInstance) {
273 _this2.calendarInstance.focus();
274 }
275 };
276};
277
278(0, _reactLifecyclesCompat.polyfill)(Picker);
279
280exports['default'] = Picker;
281module.exports = exports['default'];
\No newline at end of file