2020-12-15 00:58:15 +03:00
|
|
|
import { useState } from 'react';
|
2020-12-25 12:29:25 +03:00
|
|
|
import { DropdownItem } from 'reactstrap';
|
|
|
|
import { Dropdown } from '../Dropdown';
|
2020-12-15 00:58:15 +03:00
|
|
|
import {
|
|
|
|
DateInterval,
|
|
|
|
DateRange,
|
|
|
|
dateRangeIsEmpty,
|
|
|
|
rangeOrIntervalToString,
|
|
|
|
intervalToDateRange,
|
|
|
|
rangeIsInterval,
|
|
|
|
} from './types';
|
|
|
|
import DateRangeRow from './DateRangeRow';
|
|
|
|
|
2020-12-15 01:15:06 +03:00
|
|
|
export interface DateRangeSelectorProps {
|
2020-12-15 00:58:15 +03:00
|
|
|
initialDateRange?: DateInterval | DateRange;
|
|
|
|
disabled?: boolean;
|
|
|
|
onDatesChange: (dateRange: DateRange) => void;
|
2020-12-15 01:35:31 +03:00
|
|
|
defaultText: string;
|
2020-12-15 00:58:15 +03:00
|
|
|
}
|
|
|
|
|
2020-12-15 01:35:31 +03:00
|
|
|
export const DateRangeSelector = (
|
2020-12-25 12:29:25 +03:00
|
|
|
{ onDatesChange, initialDateRange, defaultText, disabled }: DateRangeSelectorProps,
|
2020-12-15 01:35:31 +03:00
|
|
|
) => {
|
2020-12-15 00:58:15 +03:00
|
|
|
const [ activeInterval, setActiveInterval ] = useState(
|
|
|
|
rangeIsInterval(initialDateRange) ? initialDateRange : undefined,
|
|
|
|
);
|
|
|
|
const [ activeDateRange, setActiveDateRange ] = useState(
|
|
|
|
!rangeIsInterval(initialDateRange) ? initialDateRange : undefined,
|
|
|
|
);
|
|
|
|
const updateDateRange = (dateRange: DateRange) => {
|
|
|
|
setActiveInterval(undefined);
|
|
|
|
setActiveDateRange(dateRange);
|
|
|
|
onDatesChange(dateRange);
|
|
|
|
};
|
|
|
|
const updateInterval = (dateInterval?: DateInterval) => () => {
|
|
|
|
setActiveInterval(dateInterval);
|
|
|
|
setActiveDateRange(undefined);
|
|
|
|
onDatesChange(intervalToDateRange(dateInterval));
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2020-12-25 12:29:25 +03:00
|
|
|
<Dropdown disabled={disabled} text={rangeOrIntervalToString(activeInterval ?? activeDateRange) ?? defaultText}>
|
|
|
|
<DropdownItem
|
|
|
|
active={activeInterval === undefined && dateRangeIsEmpty(activeDateRange)}
|
|
|
|
onClick={updateInterval(undefined)}
|
|
|
|
>
|
|
|
|
{defaultText}
|
|
|
|
</DropdownItem>
|
|
|
|
<DropdownItem divider />
|
|
|
|
{([ 'today', 'yesterday', 'last7Days', 'last30Days', 'last90Days', 'last180days', 'last365Days' ] as DateInterval[]).map(
|
|
|
|
(interval) => (
|
|
|
|
<DropdownItem key={interval} active={activeInterval === interval} onClick={updateInterval(interval)}>
|
|
|
|
{rangeOrIntervalToString(interval)}
|
|
|
|
</DropdownItem>
|
|
|
|
),
|
|
|
|
)}
|
|
|
|
<DropdownItem divider />
|
|
|
|
<DropdownItem header>Custom:</DropdownItem>
|
|
|
|
<DropdownItem text>
|
|
|
|
<DateRangeRow
|
|
|
|
{...activeDateRange}
|
|
|
|
onStartDateChange={(startDate) => updateDateRange({ ...activeDateRange, startDate })}
|
|
|
|
onEndDateChange={(endDate) => updateDateRange({ ...activeDateRange, endDate })}
|
|
|
|
/>
|
|
|
|
</DropdownItem>
|
2020-12-15 00:58:15 +03:00
|
|
|
</Dropdown>
|
|
|
|
);
|
|
|
|
};
|