forked from jquense/react-widgets
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDateInput.jsx
117 lines (93 loc) · 2.49 KB
/
DateInput.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import React from 'react';
import cx from 'classnames';
import compat from './util/compat';
import { date as dateLocalizer } from './util/localizers';
import CustomPropTypes from './util/propTypes';
export default React.createClass({
displayName: 'DatePickerInput',
propTypes: {
format: CustomPropTypes.dateFormat.isRequired,
editFormat: CustomPropTypes.dateFormat,
parse: React.PropTypes.func.isRequired,
value: React.PropTypes.instanceOf(Date),
onChange: React.PropTypes.func.isRequired,
culture: React.PropTypes.string
},
getDefaultProps(){
return {
textValue: ''
}
},
componentWillReceiveProps(nextProps) {
var text = formatDate(
nextProps.value
, nextProps.editing && nextProps.editFormat
? nextProps.editFormat
: nextProps.format
, nextProps.culture)
this.startValue = text
this.setState({
textValue: text
})
},
getInitialState(){
var text = formatDate(
this.props.value
, this.props.editing && this.props.editFormat
? this.props.editFormat
: this.props.format
, this.props.culture)
this.startValue = text
return {
textValue: text
}
},
render(){
var value = this.state.textValue
return (
<input
{...this.props}
type='text'
className={cx({'rw-input': true })}
value={value}
aria-disabled={this.props.disabled}
aria-readonly={this.props.readOnly}
disabled={this.props.disabled}
readOnly={this.props.readOnly}
onChange={this._change}
onBlur={chain(this.props.blur, this._blur, this)} />
)
},
_change(e){
this.setState({ textValue: e.target.value });
this._needsFlush = true
},
_blur(e){
var val = e.target.value
, date;
if ( this._needsFlush ){
this._needsFlush = false;
date = this.props.parse(val)
this.props.onChange(
date, formatDate(date, this.props.format, this.props.culture));
}
},
focus(){
compat.findDOMNode(this).focus()
}
});
function isValid(d) {
return !isNaN(d.getTime());
}
function formatDate(date, format, culture){
var val = ''
if ( (date instanceof Date) && isValid(date) )
val = dateLocalizer.format(date, format, culture)
return val;
}
function chain(a, b, thisArg){
return function(){
a && a.apply(thisArg, arguments)
b && b.apply(thisArg, arguments)
}
}