X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=src%2FTimePicker.jsx;h=7659bc721d6630efe74339ecd211171202daad72;hb=c50a40056d80c52f328566d51cc49cbcdc5f0a95;hp=ec3eda07573f10bf9b765d0d4306c0b43c91763d;hpb=0c382382d862d0ef864fb4f4cbfd177d38327cf3;p=github%2Ffretlink%2Ftime-picker.git
diff --git a/src/TimePicker.jsx b/src/TimePicker.jsx
index ec3eda0..7659bc7 100644
--- a/src/TimePicker.jsx
+++ b/src/TimePicker.jsx
@@ -1,4 +1,5 @@
-import React, { PropTypes } from 'react';
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
import Trigger from 'rc-trigger';
import Panel from './Panel';
import placements from './placements';
@@ -11,12 +12,13 @@ function refFn(field, component) {
this[field] = component;
}
-const Picker = React.createClass({
- propTypes: {
+export default class Picker extends Component {
+ static propTypes = {
prefixCls: PropTypes.string,
clearText: PropTypes.string,
value: PropTypes.object,
defaultOpenValue: PropTypes.object,
+ inputReadOnly: PropTypes.bool,
disabled: PropTypes.bool,
allowEmpty: PropTypes.bool,
defaultValue: PropTypes.object,
@@ -33,6 +35,7 @@ const Picker = React.createClass({
showSecond: PropTypes.bool,
style: PropTypes.object,
className: PropTypes.string,
+ popupClassName: PropTypes.string,
disabledHours: PropTypes.func,
disabledMinutes: PropTypes.func,
disabledSeconds: PropTypes.func,
@@ -40,42 +43,60 @@ const Picker = React.createClass({
onChange: PropTypes.func,
onOpen: PropTypes.func,
onClose: PropTypes.func,
+ onFocus: PropTypes.func,
+ onBlur: PropTypes.func,
addon: PropTypes.func,
- },
-
- getDefaultProps() {
- return {
- clearText: 'clear',
- prefixCls: 'rc-time-picker',
- defaultOpen: false,
- style: {},
- className: '',
- align: {},
- defaultOpenValue: moment(),
- allowEmpty: true,
- showHour: true,
- showMinute: true,
- showSecond: true,
- disabledHours: noop,
- disabledMinutes: noop,
- disabledSeconds: noop,
- hideDisabledOptions: false,
- placement: 'bottomLeft',
- onChange: noop,
- onOpen: noop,
- onClose: noop,
- addon: noop,
- };
- },
+ name: PropTypes.string,
+ autoComplete: PropTypes.string,
+ use12Hours: PropTypes.bool,
+ hourStep: PropTypes.number,
+ minuteStep: PropTypes.number,
+ secondStep: PropTypes.number,
+ focusOnOpen: PropTypes.bool,
+ onKeyDown: PropTypes.func,
+ autoFocus: PropTypes.bool,
+ };
+
+ static defaultProps = {
+ clearText: 'clear',
+ prefixCls: 'rc-time-picker',
+ defaultOpen: false,
+ inputReadOnly: false,
+ style: {},
+ className: '',
+ popupClassName: '',
+ align: {},
+ defaultOpenValue: moment(),
+ allowEmpty: true,
+ showHour: true,
+ showMinute: true,
+ showSecond: true,
+ disabledHours: noop,
+ disabledMinutes: noop,
+ disabledSeconds: noop,
+ hideDisabledOptions: false,
+ placement: 'bottomLeft',
+ onChange: noop,
+ onOpen: noop,
+ onClose: noop,
+ onFocus: noop,
+ onBlur: noop,
+ addon: noop,
+ use12Hours: false,
+ focusOnOpen: false,
+ onKeyDown: noop,
+ };
- getInitialState() {
+ constructor(props) {
+ super(props);
+ this.saveInputRef = refFn.bind(this, 'picker');
this.savePanelRef = refFn.bind(this, 'panelInstance');
- const { defaultOpen, defaultValue, open = defaultOpen, value = defaultValue } = this.props;
- return {
+ const { defaultOpen, defaultValue, open = defaultOpen, value = defaultValue } = props;
+ this.state = {
open,
value,
};
- },
+ }
componentWillReceiveProps(nextProps) {
const { value, open } = nextProps;
@@ -87,31 +108,31 @@ const Picker = React.createClass({
if (open !== undefined) {
this.setState({ open });
}
- },
+ }
- onPanelChange(value) {
+ onPanelChange = (value) => {
this.setValue(value);
- },
+ }
- onPanelClear() {
+ onPanelClear = () => {
this.setValue(null);
this.setOpen(false);
- },
+ }
- onVisibleChange(open) {
+ onVisibleChange = (open) => {
this.setOpen(open);
- },
+ }
- onEsc() {
+ onEsc = () => {
this.setOpen(false);
- this.refs.picker.focus();
- },
+ this.focus();
+ }
- onKeyDown(e) {
+ onKeyDown = (e) => {
if (e.keyCode === 40) {
this.setOpen(true);
}
- },
+ }
setValue(value) {
if (!('value' in this.props)) {
@@ -120,26 +141,37 @@ const Picker = React.createClass({
});
}
this.props.onChange(value);
- },
+ }
getFormat() {
- const { format, showHour, showMinute, showSecond } = this.props;
+ const { format, showHour, showMinute, showSecond, use12Hours } = this.props;
if (format) {
return format;
}
+
+ if (use12Hours) {
+ const fmtString = ([
+ showHour ? 'h' : '',
+ showMinute ? 'mm' : '',
+ showSecond ? 'ss' : '',
+ ].filter(item => !!item).join(':'));
+
+ return fmtString.concat(' a');
+ }
+
return [
showHour ? 'HH' : '',
showMinute ? 'mm' : '',
showSecond ? 'ss' : '',
].filter(item => !!item).join(':');
- },
+ }
getPanelElement() {
const {
prefixCls, placeholder, disabledHours,
- disabledMinutes, disabledSeconds, hideDisabledOptions,
+ disabledMinutes, disabledSeconds, hideDisabledOptions, inputReadOnly,
allowEmpty, showHour, showMinute, showSecond, defaultOpenValue, clearText,
- addon,
+ addon, use12Hours, focusOnOpen, onKeyDown, hourStep, minuteStep, secondStep,
} = this.props;
return (
);
- },
+ }
- setOpen(open, callback) {
+ getPopupClassName() {
+ const { showHour, showMinute, showSecond, use12Hours, prefixCls } = this.props;
+ let popupClassName = this.props.popupClassName;
+ // Keep it for old compatibility
+ if ((!showHour || !showMinute || !showSecond) && !use12Hours) {
+ popupClassName += ` ${prefixCls}-panel-narrow`;
+ }
+ let selectColumnCount = 0;
+ if (showHour) {
+ selectColumnCount += 1;
+ }
+ if (showMinute) {
+ selectColumnCount += 1;
+ }
+ if (showSecond) {
+ selectColumnCount += 1;
+ }
+ if (use12Hours) {
+ selectColumnCount += 1;
+ }
+ popupClassName += ` ${prefixCls}-panel-column-${selectColumnCount}`;
+ return popupClassName;
+ }
+
+ setOpen(open) {
const { onOpen, onClose } = this.props;
if (this.state.open !== open) {
- this.setState({
- open,
- }, callback);
- const event = {
- open,
- };
+ if (!('open' in this.props)) {
+ this.setState({ open });
+ }
if (open) {
- onOpen(event);
+ onOpen({ open });
} else {
- onClose(event);
+ onClose({ open });
}
}
- },
+ }
+
+ focus() {
+ this.picker.focus();
+ }
+
+ blur() {
+ this.picker.blur();
+ }
render() {
const {
prefixCls, placeholder, placement, align,
- disabled, transitionName, style, className, showHour,
- showMinute, showSecond, getPopupContainer,
+ disabled, transitionName, style, className, getPopupContainer, name, autoComplete,
+ onFocus, onBlur, autoFocus,
} = this.props;
const { open, value } = this.state;
- let popupClassName;
- if (!showHour || !showMinute || !showSecond) {
- popupClassName = `${prefixCls}-panel-narrow`;
- }
+ const popupClassName = this.getPopupClassName();
return (
);
- },
-});
-
-export default Picker;
+ }
+}