1
|
|
|
import { useState } from 'react'; |
2
|
|
|
import { Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap'; |
3
|
|
|
import { useToggle } from '../helpers/hooks'; |
4
|
|
|
import { |
5
|
|
|
DateInterval, |
6
|
|
|
DateRange, |
7
|
|
|
dateRangeIsEmpty, |
8
|
|
|
rangeOrIntervalToString, |
9
|
|
|
intervalToDateRange, |
10
|
|
|
rangeIsInterval, |
11
|
|
|
} from './types'; |
12
|
|
|
import DateRangeRow from './DateRangeRow'; |
13
|
|
|
import './DateRangeSelector.scss'; |
14
|
|
|
|
15
|
|
|
export interface DateRangeSelectorProps { |
16
|
|
|
initialDateRange?: DateInterval | DateRange; |
17
|
|
|
disabled?: boolean; |
18
|
|
|
onDatesChange: (dateRange: DateRange) => void; |
19
|
|
|
defaultText: string; |
20
|
|
|
} |
21
|
|
|
|
22
|
|
|
export const DateRangeSelector = ( |
23
|
|
|
{ onDatesChange, initialDateRange, defaultText, disabled = false }: DateRangeSelectorProps, |
24
|
|
|
) => { |
25
|
|
|
const [ isOpen, toggle ] = useToggle(); |
26
|
|
|
const [ activeInterval, setActiveInterval ] = useState( |
27
|
|
|
rangeIsInterval(initialDateRange) ? initialDateRange : undefined, |
28
|
|
|
); |
29
|
|
|
const [ activeDateRange, setActiveDateRange ] = useState( |
30
|
|
|
!rangeIsInterval(initialDateRange) ? initialDateRange : undefined, |
31
|
|
|
); |
32
|
|
|
const updateDateRange = (dateRange: DateRange) => { |
33
|
|
|
setActiveInterval(undefined); |
34
|
|
|
setActiveDateRange(dateRange); |
35
|
|
|
onDatesChange(dateRange); |
36
|
|
|
}; |
37
|
|
|
const updateInterval = (dateInterval?: DateInterval) => () => { |
38
|
|
|
setActiveInterval(dateInterval); |
39
|
|
|
setActiveDateRange(undefined); |
40
|
|
|
onDatesChange(intervalToDateRange(dateInterval)); |
41
|
|
|
}; |
42
|
|
|
|
43
|
|
|
return ( |
44
|
|
|
<Dropdown isOpen={isOpen} toggle={toggle} disabled={disabled}> |
45
|
|
|
<DropdownToggle caret className="date-range-selector__btn btn-block" color="primary"> |
46
|
|
|
{rangeOrIntervalToString(activeInterval ?? activeDateRange) ?? defaultText} |
47
|
|
|
</DropdownToggle> |
48
|
|
|
<DropdownMenu className="w-100"> |
49
|
|
|
<DropdownItem |
50
|
|
|
active={activeInterval === undefined && dateRangeIsEmpty(activeDateRange)} |
51
|
|
|
onClick={updateInterval(undefined)} |
52
|
|
|
> |
53
|
|
|
{defaultText} |
54
|
|
|
</DropdownItem> |
55
|
|
|
<DropdownItem divider /> |
56
|
|
|
{([ 'today', 'yesterday', 'last7Days', 'last30Days', 'last90Days', 'last180days', 'last365Days' ] as DateInterval[]).map( |
57
|
|
|
(interval) => ( |
58
|
|
|
<DropdownItem key={interval} active={activeInterval === interval} onClick={updateInterval(interval)}> |
59
|
|
|
{rangeOrIntervalToString(interval)} |
60
|
|
|
</DropdownItem> |
61
|
|
|
), |
62
|
|
|
)} |
63
|
|
|
<DropdownItem divider /> |
64
|
|
|
<DropdownItem header>Custom:</DropdownItem> |
65
|
|
|
<DropdownItem text> |
66
|
|
|
<DateRangeRow |
67
|
|
|
{...activeDateRange} |
68
|
|
|
onStartDateChange={(startDate) => updateDateRange({ ...activeDateRange, startDate })} |
69
|
|
|
onEndDateChange={(endDate) => updateDateRange({ ...activeDateRange, endDate })} |
70
|
|
|
/> |
71
|
|
|
</DropdownItem> |
72
|
|
|
</DropdownMenu> |
73
|
|
|
</Dropdown> |
74
|
|
|
); |
75
|
|
|
}; |
76
|
|
|
|