From dfdc58dca8cee58e9c340a79ad215d1d7d3afe87 Mon Sep 17 00:00:00 2001 From: Dmitriy Shekhovtsov Date: Mon, 4 Dec 2017 18:56:30 +0200 Subject: [PATCH] fix(daterangepicker): After clearing input, daterangepicker couldn't be opened fixes #3191 --- src/bs-moment/utils/type-checks.ts | 2 +- .../reducer/bs-datepicker.reducer.ts | 28 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/bs-moment/utils/type-checks.ts b/src/bs-moment/utils/type-checks.ts index f4e60d6562..35fa6e938b 100644 --- a/src/bs-moment/utils/type-checks.ts +++ b/src/bs-moment/utils/type-checks.ts @@ -1,7 +1,7 @@ import { absFloor } from '../utils'; export function isDateValid(date: Date): boolean { - return date && !isNaN(date.getTime()); + return date && date.getTime && !isNaN(date.getTime()); } export function isFunction(fn: Function): fn is Function { return ( diff --git a/src/datepicker/reducer/bs-datepicker.reducer.ts b/src/datepicker/reducer/bs-datepicker.reducer.ts index a56862d1a1..66c2adc67c 100644 --- a/src/datepicker/reducer/bs-datepicker.reducer.ts +++ b/src/datepicker/reducer/bs-datepicker.reducer.ts @@ -12,7 +12,7 @@ import { flagMonthsCalendar } from '../engine/flag-months-calendar'; import { formatYearsCalendar, yearsPerCalendar } from '../engine/format-years-calendar'; import { flagYearsCalendar } from '../engine/flag-years-calendar'; import { BsViewNavigationEvent, DatepickerFormatOptions } from '../models/index'; -import { isArray } from '../../bs-moment/utils/type-checks'; +import { isArray, isDateValid } from '../../bs-moment/utils/type-checks'; import { startOf } from '../../bs-moment/utils/start-end-of'; import { getLocale } from '../../bs-moment/locale/locales.service'; import { isAfter, isBefore } from '../../bs-moment/utils/date-compare'; @@ -75,12 +75,10 @@ export function bsDatepickerReducer(state = initialDatepickerState, view: state.view }; - if (action.payload) { - newState.view = { - date: action.payload, - mode: state.view.mode - }; - } + const mode = state.view.mode; + const _date = action.payload || state.view.date; + const date = getViewDate(_date, state.minDate, state.maxDate); + newState.view = { mode, date }; return Object.assign({}, state, newState); } @@ -89,7 +87,9 @@ export function bsDatepickerReducer(state = initialDatepickerState, const newState = action.payload; // preserve view mode const mode = state.view.mode; - const _viewDate = newState.value && newState.value || state.view.date; + const _viewDate = isDateValid(newState.value) && newState.value + || isArray(newState.value) && isDateValid(newState.value[0]) && newState.value[0] + || state.view.date; const date = getViewDate(_viewDate, newState.minDate, newState.maxDate); newState.view = { mode, date }; // update selected value @@ -113,7 +113,17 @@ export function bsDatepickerReducer(state = initialDatepickerState, // date range picker case BsDatepickerActions.SELECT_RANGE: { - return Object.assign({}, state, { selectedRange: action.payload }); + const newState = { + selectedRange: action.payload, + view: state.view + }; + + const mode = state.view.mode; + const _date = action.payload && action.payload[0] || state.view.date; + const date = getViewDate(_date, state.minDate, state.maxDate); + newState.view = { mode, date }; + + return Object.assign({}, state, newState); } case BsDatepickerActions.SET_MIN_DATE: {