Skip to content

Commit c6f99c8

Browse files
authored
Merge pull request #198 from data-driven-forms/date-picker-initialize
fix(pf3): fixed date picker initialization.
2 parents c64f6ce + ceea3d1 commit c6f99c8

File tree

3 files changed

+57
-53
lines changed

3 files changed

+57
-53
lines changed

packages/pf3-component-mapper/src/form-fields/date-time-picker/date-time-picker.js

Lines changed: 54 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class DateTimePicker extends React.Component {
3131
super(props);
3232
this.state = {
3333
positionLeft: 0,
34-
selectedDay: props.value ? typeof props.value === 'string' ? new Date(props.value) : props.value : undefined,
34+
selectedDay: this.createDate(),
3535
selectingMonth: false,
3636
selectingYear: false,
3737
isOpen: false,
@@ -45,67 +45,69 @@ export class DateTimePicker extends React.Component {
4545
});
4646
}
4747

48+
createDate = () => this.props.value ? typeof this.props.value === 'string' ? new Date(this.props.value) : this.props.value : undefined;
49+
4850
handleOverlayToggle = isOpen => this.setState({ isOpen })
4951

50-
handleDayChange = day => this.setState(prevProps => ({
51-
selectedDay: new Date(
52+
handleDayChange = day => {
53+
const prevDate = this.createDate();
54+
const newDate = new Date(
5255
day.getFullYear(),
5356
day.getMonth(),
5457
day.getDate(),
55-
prevProps.selectedDay && prevProps.selectedDay.getHours() || new Date().getHours(),
56-
prevProps.selectedDay && prevProps.selectedDay.getMinutes() || new Date().getMinutes()
57-
),
58-
isOpen: !this.props.closeOnDaySelect,
59-
}), () => this.props.onChange(this.state.selectedDay));
60-
61-
handleYearChange = year => this.setState(({ selectedDay = new Date() }) => ({
62-
selectedDay: selectValidDate(new Date(
58+
prevDate && prevDate.getHours() || new Date().getHours(),
59+
prevDate && prevDate.getMinutes() || new Date().getMinutes()
60+
);
61+
this.setState({
62+
isOpen: this.props.closeOnDaySelect,
63+
});
64+
return this.props.onChange(newDate);
65+
};
66+
67+
handleYearChange = year => {
68+
const prevDate = this.createDate();
69+
const newDate = selectValidDate(new Date(
6370
year,
64-
selectedDay.getMonth(),
65-
selectedDay.getDate(),
66-
selectedDay.getHours(),
67-
selectedDay.getMinutes()
68-
), this.props.disabledDays),
69-
}), () => this.props.onChange(this.state.selectedDay))
70-
71-
handleMonthChange = month => this.setState(({ selectedDay = new Date() }) => ({
72-
selectedDay: selectValidDate(new Date(
73-
selectedDay.getFullYear(),
71+
prevDate.getMonth(),
72+
prevDate.getDate(),
73+
prevDate.getHours(),
74+
prevDate.getMinutes()
75+
), this.props.disabledDays);
76+
return this.props.onChange(newDate);
77+
}
78+
79+
handleMonthChange = month => {
80+
const prevDate = this.createDate();
81+
const newDate = selectValidDate(new Date(
82+
prevDate.getFullYear(),
7483
month,
75-
selectedDay.getDate(),
76-
selectedDay.getHours(),
77-
selectedDay.getMinutes()
78-
), this.props.disabledDays),
79-
}), () => this.props.onChange(this.state.selectedDay));
84+
prevDate.getDate(),
85+
prevDate.getHours(),
86+
prevDate.getMinutes()
87+
), this.props.disabledDays);
88+
return this.props.onChange(newDate);
89+
}
8090

8191
toggleSelectingMonth = selectingMonth => this.setState({ selectingMonth })
8292

8393
toggleSelectingYear = selectingYear => this.setState({ selectingYear })
8494

85-
handleChangeHours = hours => this.setState(({ selectedDay = new Date() }) => ({
86-
selectedDay: new Date(
87-
selectedDay.getFullYear(),
88-
selectedDay.getMonth(),
89-
selectedDay.getDate(),
90-
hours,
91-
selectedDay.getMinutes()
92-
),
93-
}), () => this.props.onChange(this.state.selectedDay))
94-
95-
handleChangeMinutes = minutes => this.setState(({ selectedDay = new Date() }) => ({
96-
selectedDay: new Date(
97-
selectedDay.getFullYear(),
98-
selectedDay.getMonth(),
99-
selectedDay.getDate(),
100-
selectedDay.getHours(),
101-
minutes
102-
),
103-
}), () => this.props.onChange(this.state.selectedDay))
104-
105-
clearValue = () => this.setState({ selectedDay: undefined })
95+
handleChangeHours = hours => {
96+
const prevDate = this.createDate() || new Date();
97+
prevDate.setHours(hours);
98+
return this.props.onChange(new Date(prevDate));
99+
}
100+
101+
handleChangeMinutes = minutes => {
102+
const prevDate = this.createDate() || new Date();
103+
prevDate.setMinutes(minutes);
104+
return this.props.onChange(new Date(prevDate));
105+
}
106+
107+
clearValue = () => this.props.onChange(undefined)
106108

107109
render() {
108-
const { isOpen, selectedDay, selectingYear, selectingMonth } = this.state;
110+
const { isOpen, selectingYear, selectingMonth } = this.state;
109111
const {
110112
placeholder,
111113
variant,
@@ -116,14 +118,15 @@ export class DateTimePicker extends React.Component {
116118
disabledDays,
117119
isClearable,
118120
} = this.props;
121+
const value = this.createDate();
119122
const inputPlaceholder = getPlaceholder(variant, placeholder);
120123
const cleanDisabledDays = createDisabledDays(disabledDays);
121124
return (
122125
<div style={{ position: 'relative' }} ref={ this.wrapperRef } >
123126
<PickerInput
124127
handleOverlayToggle={ this.handleOverlayToggle }
125128
placeholder={ inputPlaceholder }
126-
selectedDay={ selectedDay }
129+
selectedDay={ value }
127130
variant={ variant }
128131
locale={ locale }
129132
isDisabled={ isDisabled }
@@ -140,7 +143,7 @@ export class DateTimePicker extends React.Component {
140143
>
141144
<PopoverRoot
142145
onDayClick={ this.handleDayChange }
143-
selectedDay={ selectedDay }
146+
selectedDay={ value }
144147
toggleSelectingMonth={ this.toggleSelectingMonth }
145148
toggleSelectingYear={ this.toggleSelectingYear }
146149
selectingYear={ selectingYear }
@@ -173,6 +176,7 @@ DateTimePicker.propTypes = {
173176
closeOnDaySelect: PropTypes.bool,
174177
onChange: PropTypes.func.isRequired,
175178
isClearable: PropTypes.bool,
179+
pristine: PropTypes.bool,
176180
};
177181

178182
DateTimePicker.defaultProps = {

packages/pf3-component-mapper/src/form-fields/form-fields.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const selectComponent = ({
2828
noCheckboxLabel,
2929
initialValue,
3030
loadOptions,
31+
meta,
3132
...rest
3233
}) => ({
3334
[componentTypes.TEXT_FIELD]: () =>
@@ -66,7 +67,7 @@ const selectComponent = ({
6667
checked={ input.value }
6768
onChange={ ({ target: { checked }}) => input.onChange(checked) }
6869
/>,
69-
[componentTypes.DATE_PICKER]: () => <DateTimePicker onChange={ input.onChange } value={ input.value } isDisabled={ isDisabled } { ...rest } />,
70+
[componentTypes.DATE_PICKER]: () => <DateTimePicker pristine={ meta.pristine } onChange={ input.onChange } value={ input.value } isDisabled={ isDisabled } { ...rest } />,
7071
})[componentType];
7172

7273
const renderHelperText = (error, description) => (error // eslint-disable-line no-nested-ternary
@@ -92,7 +93,7 @@ const FinalFormField = ({
9293
{ rest.isRequired ? <RequiredLabel label={ label } /> : label }
9394
{ helperText && <FieldLevelHelp content={ helperText } /> }
9495
</ControlLabel> }
95-
{ selectComponent({ ...rest, invalid, label })() }
96+
{ selectComponent({ ...rest, invalid, label, meta })() }
9697
{ renderHelperText(invalid && meta.error, description) }
9798
</FormGroup>
9899
);

packages/pf3-component-mapper/src/tests/form-fields/date-time-picker/date-time-picker.test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,3 @@ describe('<DateTimePicker />', () => {
1919
expect(wrapper.state().selectedDay).toBeUndefined();
2020
});
2121
});
22-

0 commit comments

Comments
 (0)