Skip to content

Commit

Permalink
fix(DatePicker): fix programmatic set of date in range mode (#4814)
Browse files Browse the repository at this point in the history
This change adds a logic to re-format dates in `<input>` when
Flatpickr's `setDate()` API is called. Flatpickr's range plugin has a
similar logic to do that, but runs only if the second argument is
`true`.

Fixes #4803.
  • Loading branch information
asudoh authored and joshblack committed Jan 13, 2020
1 parent 766e2e4 commit f19b795
Showing 1 changed file with 29 additions and 2 deletions.
31 changes: 29 additions & 2 deletions packages/react/src/components/DatePicker/plugins/rangePlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,38 @@ import rangePlugin from 'flatpickr/dist/plugins/rangePlugin';
* @returns {Plugin} An extension of Flatpickr `rangePlugin` that does the following:
* * Better ensures the calendar dropdown is always aligned to the `<input>` for the starting date.
* Workaround for: https://github.com/flatpickr/flatpickr/issues/1944
* * A logic to ensure `fp.setDate()` call won't end up with "startDate to endDate" set to the first `<input>`
*/
export default config => {
const factory = rangePlugin(Object.assign({ position: 'left' }, config));
return fp =>
Object.assign(factory(fp), {
return fp => {
const origSetDate = fp.setDate;

const init = () => {
fp.setDate = function setDate(dates, triggerChange, format) {
origSetDate.call(this, dates, triggerChange, format);
// If `triggerChange` is `true`, `onValueUpdate` Flatpickr event is fired
// where Flatpickr's range plugin takes care of fixing the first `<input>`
if (!triggerChange) {
const { _input: inputFrom } = fp;
const { input: inputTo } = config;
[inputFrom, inputTo].forEach((input, i) => {
if (input) {
input.value = !dates[i]
? ''
: fp.formatDate(new Date(dates[i]), fp.config.dateFormat);
}
});
}
};
};

const origRangePlugin = factory(fp);
const { onReady: origOnReady } = origRangePlugin;

return Object.assign(origRangePlugin, {
onReady: [init, origOnReady],
onPreCalendarPosition() {},
});
};
};

0 comments on commit f19b795

Please sign in to comment.