UNPKG

ngx-bootstrap

Version:
261 lines 11.4 kB
import { initialDatepickerState } from './bs-datepicker.state'; import { BsDatepickerActions } from './bs-datepicker.actions'; import { calcDaysCalendar } from '../engine/calc-days-calendar'; import { formatDaysCalendar } from '../engine/format-days-calendar'; import { flagDaysCalendar } from '../engine/flag-days-calendar'; import { setFullDate, shiftDate } from '../../chronos/utils/date-setters'; import { canSwitchMode } from '../engine/view-mode'; import { formatMonthsCalendar } from '../engine/format-months-calendar'; import { flagMonthsCalendar } from '../engine/flag-months-calendar'; import { formatYearsCalendar, yearsPerCalendar } from '../engine/format-years-calendar'; import { flagYearsCalendar } from '../engine/flag-years-calendar'; import { isArray, isDateValid } from '../../chronos/utils/type-checks'; import { startOf } from '../../chronos/utils/start-end-of'; import { getLocale } from '../../chronos/locale/locales'; import { isAfter, isBefore } from '../../chronos/utils/date-compare'; export function bsDatepickerReducer(state, action) { if (state === void 0) { state = initialDatepickerState; } switch (action.type) { case BsDatepickerActions.CALCULATE: { return calculateReducer(state); } case BsDatepickerActions.FORMAT: { return formatReducer(state, action); } case BsDatepickerActions.FLAG: { return flagReducer(state, action); } case BsDatepickerActions.NAVIGATE_OFFSET: { var date = shiftDate(startOf(state.view.date, 'month'), action.payload); var newState = { view: { mode: state.view.mode, date: date } }; return Object.assign({}, state, newState); } case BsDatepickerActions.NAVIGATE_TO: { var payload = action.payload; var date = setFullDate(state.view.date, payload.unit); var mode = payload.viewMode; var newState = { view: { date: date, mode: mode } }; return Object.assign({}, state, newState); } case BsDatepickerActions.CHANGE_VIEWMODE: { if (!canSwitchMode(action.payload)) { return state; } var date = state.view.date; var mode = action.payload; var newState = { view: { date: date, mode: mode } }; return Object.assign({}, state, newState); } case BsDatepickerActions.HOVER: { return Object.assign({}, state, { hoveredDate: action.payload }); } case BsDatepickerActions.SELECT: { var newState = { selectedDate: action.payload, view: state.view }; var mode = state.view.mode; var _date = action.payload || state.view.date; var date = getViewDate(_date, state.minDate, state.maxDate); newState.view = { mode: mode, date: date }; return Object.assign({}, state, newState); } case BsDatepickerActions.SET_OPTIONS: { var newState = action.payload; // preserve view mode var mode = state.view.mode; var _viewDate = isDateValid(newState.value) && newState.value || isArray(newState.value) && isDateValid(newState.value[0]) && newState.value[0] || state.view.date; var date = getViewDate(_viewDate, newState.minDate, newState.maxDate); newState.view = { mode: mode, date: date }; // update selected value if (newState.value) { // if new value is array we work with date range if (isArray(newState.value)) { newState.selectedRange = newState.value; } // if new value is a date -> datepicker if (newState.value instanceof Date) { newState.selectedDate = newState.value; } // provided value is not supported :) // need to report it somehow } return Object.assign({}, state, newState); } // date range picker case BsDatepickerActions.SELECT_RANGE: { var newState = { selectedRange: action.payload, view: state.view }; var mode = state.view.mode; var _date = action.payload && action.payload[0] || state.view.date; var date = getViewDate(_date, state.minDate, state.maxDate); newState.view = { mode: mode, date: date }; return Object.assign({}, state, newState); } case BsDatepickerActions.SET_MIN_DATE: { return Object.assign({}, state, { minDate: action.payload }); } case BsDatepickerActions.SET_MAX_DATE: { return Object.assign({}, state, { maxDate: action.payload }); } case BsDatepickerActions.SET_IS_DISABLED: { return Object.assign({}, state, { isDisabled: action.payload }); } default: return state; } } function calculateReducer(state) { // how many calendars var displayMonths = state.displayMonths; // use selected date on initial rendering if set var viewDate = state.view.date; if (state.view.mode === 'day') { state.monthViewOptions.firstDayOfWeek = getLocale(state.locale).firstDayOfWeek(); var monthsModel = new Array(displayMonths); for (var monthIndex = 0; monthIndex < displayMonths; monthIndex++) { // todo: for unlinked calendars it will be harder monthsModel[monthIndex] = calcDaysCalendar(viewDate, state.monthViewOptions); viewDate = shiftDate(viewDate, { month: 1 }); } return Object.assign({}, state, { monthsModel: monthsModel }); } if (state.view.mode === 'month') { var monthsCalendar = new Array(displayMonths); for (var calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) { // todo: for unlinked calendars it will be harder monthsCalendar[calendarIndex] = formatMonthsCalendar(viewDate, getFormatOptions(state)); viewDate = shiftDate(viewDate, { year: 1 }); } return Object.assign({}, state, { monthsCalendar: monthsCalendar }); } if (state.view.mode === 'year') { var yearsCalendarModel = new Array(displayMonths); for (var calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) { // todo: for unlinked calendars it will be harder yearsCalendarModel[calendarIndex] = formatYearsCalendar(viewDate, getFormatOptions(state)); viewDate = shiftDate(viewDate, { year: yearsPerCalendar }); } return Object.assign({}, state, { yearsCalendarModel: yearsCalendarModel }); } return state; } function formatReducer(state, action) { if (state.view.mode === 'day') { var formattedMonths = state.monthsModel.map(function (month, monthIndex) { return formatDaysCalendar(month, getFormatOptions(state), monthIndex); }); return Object.assign({}, state, { formattedMonths: formattedMonths }); } // how many calendars var displayMonths = state.displayMonths; // check initial rendering // use selected date on initial rendering if set var viewDate = state.view.date; if (state.view.mode === 'month') { var monthsCalendar = new Array(displayMonths); for (var calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) { // todo: for unlinked calendars it will be harder monthsCalendar[calendarIndex] = formatMonthsCalendar(viewDate, getFormatOptions(state)); viewDate = shiftDate(viewDate, { year: 1 }); } return Object.assign({}, state, { monthsCalendar: monthsCalendar }); } if (state.view.mode === 'year') { var yearsCalendarModel = new Array(displayMonths); for (var calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) { // todo: for unlinked calendars it will be harder yearsCalendarModel[calendarIndex] = formatYearsCalendar(viewDate, getFormatOptions(state)); viewDate = shiftDate(viewDate, { year: 16 }); } return Object.assign({}, state, { yearsCalendarModel: yearsCalendarModel }); } return state; } function flagReducer(state, action) { if (state.view.mode === 'day') { var flaggedMonths = state.formattedMonths.map(function (formattedMonth, monthIndex) { return flagDaysCalendar(formattedMonth, { isDisabled: state.isDisabled, minDate: state.minDate, maxDate: state.maxDate, hoveredDate: state.hoveredDate, selectedDate: state.selectedDate, selectedRange: state.selectedRange, displayMonths: state.displayMonths, monthIndex: monthIndex }); }); return Object.assign({}, state, { flaggedMonths: flaggedMonths }); } if (state.view.mode === 'month') { var flaggedMonthsCalendar = state.monthsCalendar.map(function (formattedMonth, monthIndex) { return flagMonthsCalendar(formattedMonth, { isDisabled: state.isDisabled, minDate: state.minDate, maxDate: state.maxDate, hoveredMonth: state.hoveredMonth, displayMonths: state.displayMonths, monthIndex: monthIndex }); }); return Object.assign({}, state, { flaggedMonthsCalendar: flaggedMonthsCalendar }); } if (state.view.mode === 'year') { var yearsCalendarFlagged = state.yearsCalendarModel.map(function (formattedMonth, yearIndex) { return flagYearsCalendar(formattedMonth, { isDisabled: state.isDisabled, minDate: state.minDate, maxDate: state.maxDate, hoveredYear: state.hoveredYear, displayMonths: state.displayMonths, yearIndex: yearIndex }); }); return Object.assign({}, state, { yearsCalendarFlagged: yearsCalendarFlagged }); } return state; } function getFormatOptions(state) { return { locale: state.locale, monthTitle: state.monthTitle, yearTitle: state.yearTitle, dayLabel: state.dayLabel, monthLabel: state.monthLabel, yearLabel: state.yearLabel, weekNumbers: state.weekNumbers }; } /** * if view date is provided (bsValue|ngModel) it should be shown * if view date is not provider: * if minDate>currentDate (default view value), show minDate * if maxDate<currentDate(default view value) show maxDate */ function getViewDate(viewDate, minDate, maxDate) { var _date = Array.isArray(viewDate) ? viewDate[0] : viewDate; if (minDate && isAfter(minDate, _date, 'day')) { return minDate; } if (maxDate && isBefore(maxDate, _date, 'day')) { return maxDate; } return _date; } //# sourceMappingURL=bs-datepicker.reducer.js.map