// @flow strict import * as React from 'react'; // $FlowFixMe[untyped-import] import moment from 'moment'; import type {DateRange, DateRangeWithTimezone} from '../../types'; import { generateAvailableYears, getAvailableMonths, getMonthEndDate, getMonths, getTimezones, MARKERS, NAVIGATION_ACTION, } from '../../utils'; import classify from '../../utils/classify'; import { addTimezoneEndOfDay, addTimezoneStartOfDay, getFormattedDate, getTranslation, isAfter, isSameOrAfter, isSameOrBefore, TIMEZONES, } from '../../utils/date-range-picker'; import {Button} from '../Button'; import { Card, CardActions, CardContent, CardFooter, CardHeader, CardTitle, } from '../Card'; import {Dropdown} from '../Dropdown'; import {FocusManager} from '../FocusManager'; import {ClickableIcon, Icon, ICON_SIZE, ICON_TYPE} from '../Icon'; import {BodySmall, TEXT_COLORS} from '../Text'; import {Calendar} from './Calendar.js'; import css from './DateRangeWrapper.module.css'; type HeaderProps = { date: string, minDate: string, maxDate: string, rangeStartMonth: string, rangeEndMonth: string, nextDisabled: boolean, prevDisabled: boolean, onClickNext: () => void, onClickPrevious: () => void, marker: $Values, setMonth: (date: string) => void, t: ?(key: string, fallback: string) => string, }; type DateRangeWrapperProps = { dateRange: DateRange, hoverDay: string, minDate: string, maxDate: string, rangeStartMonth: string, rangeEndMonth: string, cardWrapperClass: ?string, setRangeStartMonth: (string) => void, setRangeEndMonth: (string) => void, setTimezone: (string) => void, timezone: string, onApply: (datePickerSelectedRange: DateRangeWithTimezone) => void, onCancel: () => void, inHoverRange: (day: string) => boolean, hideTimezone: boolean, handlers: { onDayClick: (day: string) => void, onDayHover: (day: string) => void, onMonthNavigate: ( marker: $Values, action: $Values, ) => void, }, today: string, startDateLabel?: string, endDateLabel?: string, t?: ?(key: string, fallback: string) => string, locale?: string, }; const CalendarHeader = ({ t, date, marker, minDate, maxDate, setMonth, rangeStartMonth, rangeEndMonth, onClickNext, nextDisabled, prevDisabled, onClickPrevious, }: HeaderProps): React.Node => { const availableYears = generateAvailableYears({ marker, minDate, maxDate, rangeStartMonth, rangeEndMonth, }); const availableMonths = getAvailableMonths({ marker, minDate, maxDate, rangeStartMonth, rangeEndMonth, t, }); const MONTHS = getMonths(t); return (
!prevDisabled && onClickPrevious()} color={prevDisabled ? 'disabled' : 'secondary'} /> { setMonth(getMonthEndDate(moment.utc(date).set('M', event.key))); }} dropdownInputText={MONTHS[moment.utc(date).month()].label} scrollMenuToBottom /> { setMonth(getMonthEndDate(moment.utc(date).set('y', event.key))); }} dropdownInputText={moment.utc(date).year()} scrollMenuToBottom /> !nextDisabled && onClickNext()} color={nextDisabled ? 'disabled' : 'secondary'} />
); }; export const DateRangeWrapper: React$AbstractComponent< DateRangeWrapperProps, HTMLDivElement, > = React.forwardRef( ( { onApply, onCancel, handlers, hoverDay, minDate, maxDate, timezone, dateRange, rangeStartMonth, setTimezone, rangeEndMonth, inHoverRange, setRangeStartMonth, setRangeEndMonth, cardWrapperClass, hideTimezone, today, startDateLabel, endDateLabel, t, locale, }: DateRangeWrapperProps, ref, ): React.Node => { const canNavigateCloser = moment.utc(rangeStartMonth).year() !== moment.utc(rangeEndMonth).year() || Math.abs( moment.utc(rangeStartMonth).month() - moment.utc(rangeEndMonth).month(), ) > 1; const handleApplyClick = () => { const {startDate, endDate} = dateRange; const startDateUTC = startDate && addTimezoneStartOfDay(startDate, timezone); const endDateUTC = endDate && addTimezoneEndOfDay(endDate, timezone); onApply({ startDate, endDate, startDateUTC, endDateUTC, timezone, }); }; const {onMonthNavigate} = handlers; const commonProps = { inHoverRange, handlers, hoverDay, dateRange, minDate, maxDate, today, t, }; return ( {`${ startDateLabel || getTranslation(t, 'Start Date') }: ${getFormattedDate( MARKERS.DATE_RANGE_START, dateRange, locale, )}`} {`${ endDateLabel || getTranslation(t, 'End Date') }: ${getFormattedDate( MARKERS.DATE_RANGE_END, dateRange, locale, )}`}
onMonthNavigate( MARKERS.DATE_RANGE_START, NAVIGATION_ACTION.NEXT, ) } onClickPrevious={() => onMonthNavigate( MARKERS.DATE_RANGE_START, NAVIGATION_ACTION.PREV, ) } /> onMonthNavigate(MARKERS.DATE_RANGE_END, NAVIGATION_ACTION.NEXT) } onClickPrevious={() => onMonthNavigate(MARKERS.DATE_RANGE_END, NAVIGATION_ACTION.PREV) } />
{!hideTimezone && ( setTimezone(event.key)} size="small" /> )} ); }, );